Construye un servicio RPC en Go

Marcela Bonell
TechWo
Published in
3 min readFeb 6, 2018

Uno de los retos al desarrollar sistemas distribuidos es el paso de mensajes entre diferentes procesos con el fin de llevar a cabo una tarea. Esta comunicación debe de ser confiable a través de la red y usar un sistema estándar para que todos los componentes puedan entender dichos mensajes.

RPC (por sus siglas en inglés “Remote Procedure Call”) es un protocolo muy usado para el intercambio de datos entre procesos que se encuentran distribuidos a lo largo de la red.

Go gopher, diseñado por Renee French.

¿Cómo funciona RPC?

Básicamente, se necesitan dos componentes:

  1. Servidor: Aquí es donde se da de alta el servicio que tiene disponible funciones que pueden ser llamadas por otros procesos. Dichas funciones deben de recibir argumentos como parte de una petición, procesar dichos datos y retornar un resultado o un error. El servidor RPC está siempre escuchando y procesando todas las peticiones.
  2. Cliente: Es la aplicación que manda llamar las funciones remotas como si fueran parte de ella misma, es decir funciones nativas. El cliente RPC hará una conexión al servidor, mandará a ejecutar la función deseada y recibirá el resultado del servidor.

Implementando RPC en Go

Servidor

Lo primero es definir las estructuras, una para mandar los argumentos en la petición al servidor y la otra que representa el resultado de dicha petición.

Después hay que crear la interfaz que contendrá la definición de las funciones que estarán disponibles en el servicio remoto.

En Go, existe una serie de lineamientos que se deben de cumplir en la definición de las funciones, con la finalidad de que estas las pueda registrar como métodos disponibles para acceso remoto.

  • La función debe ser exportada.
  • La función debe tener dos argumentos solamente, y ambos deben ser exportados.
  • El segundo argumento de la función debe ser un puntero.
  • El tipo de retorno de la función debe ser un error.
func (t *T) MethodName(argType T1, replyType *T2) error

Para la interfaz definida en este ejemplo, así quedaría la implementación siguiendo las reglas de Go RPC.

Ahora que tenemos definido el servicio, es momento de crear el servidor RPC y registrar el servicio usando HTTP como protocolo para que este disponible y continuamente escuchando todas las peticiones.

Cliente

Dentro de la aplicación que usaremos para llamar a los métodos remotos, necesitamos declarar una estructura que contenga una referencia al tiporpc.Client para poder mandar llamar a las funciones disponibles en el servicio.

En Go es muy simple conectarse a un servicio, solo hay que especificar la dirección IP y el puerto donde este corriendo el servidor.

Posteriormente usando la función Call mandaremos una petición al servidor, aquí se necesita mandar los valores de los argumentos, el nombre del método remoto y una referencia al objeto que contendrá el resultado de dicha operación.

Recuerda que todos los métodos RPC retornan un error, es importante manejarlo en el cliente para ver si hay problemas durante el procesamiento.

Así de sencillo es la implementación de RPC’s en Go! Encuentra los ejemplos completos del servidor y del cliente en el Github de TechWo, pull request son bienvenidos!

Referencias

--

--

Marcela Bonell
TechWo
Editor for

Software engineer passionate about open source and their communities.