gRPC es un protocolo RPC (Remote Procedure Call) del que últimamente se oye hablar mucho relacionado con la conexión de microservicios.

gRPC es un protocolo open-source creado por Google que usa para conectar sus microservicios.

Entre sus características:

  • Protocolo construido sobre HTTP/2
  • Foco principal en el rendimiento: bajo consumo de CPU, ancho de banda, latencia…
  • Protocolo bidireccional, con control de flujo de datos, con capacidad de enviar múltiples peticiones sobre una única conexión TCP.
  •  Serialización con Proto3 (nueva versión de Protocol Buf) que ofrece soporte para más lenguajes y JSON encodings.
  • Funciona sobre IDLs (abajo lo que explicamos) lo que hace necesario tener una librería en el lenguaje correspondiente. Por suerte ofrece librerías para distintos lenguajes: C, C++, C#, Go, Java, Node.js, Objective-C, PHP, Python, Ruby. Eso sí, no todas están tan maduras como la de C y Java J.
  • Autenticación incorporada soportando SSL, autenticación por Token,..: https://grpc.io/docs/guides/auth.html

Veamos cómo funciona:

En gRPC una aplicación cliente llama a métodos de la aplicación servidora como si estuviera en local (bueno, esto ya lo habíamos visto antes :D), con la ventaja de la sencillez que da para comunicar clientes y servers en diferentes lenguajes:

La forma de crear una aplicación gRPC es esta (ejemplo en Java):

1. Definir el servicio en un fichero .proto

Algo como esto: https://github.com/grpc/grpc-java/blob/master/examples/src/main/proto/helloworld.proto

En este fichero se define el paquete en el que se generarán las clases Java (opción package o java_package que lo sobreescribe), el nombre del servicio, el método en el servicio (GetFeature) y el mensaje que intermcabia ese método.

2. Generar los interfaces cliente y servidor gRPC con el compilador proto3 (puede descargarse aquí https://github.com/protocolbuffers/protobuf/releases) . También pueden usarse los plugins para Maven, Gradle, Eclipse,…

3. Crear el Servidor, esto implica 2 cosas:

Sobreeescribir la clase base generada desde el servicio generado:

Ejecutar un gRPC Server escuchando peticiones

En el ejemplo https://github.com/grpc/grpc-java/blob/master/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java se ve

4. Crear el cliente gRPC, se pueden crear llamadas síncronas y bloqueantes

o llamadas asíncronas

Una vez visto…¿qué opináis? ¿lo usaríais en vuestro microservicios?

Personalmente le veo aplicación en escenarios concretos donde el rendimiento sea crítico, pero para escenarios usuales genera una complejidad que debe valorarse con cuidado.