gRPC 

&

Protocol Buffers

Porque hay vida más allá de REST/JSON

¿Qué es gRPC?

Framework RPC moderno y de alto rendimiento que puede correr en cualquier ambiente, desarrollado inicialmente por google.

¿Qué es RPC?

Técnica para la comunicación entre procesos en una o más computadoras conectadas a una red.

 

Las RPC son muy utilizadas dentro de la comunicación cliente-servidor. Siendo el cliente el que inicia el proceso solicitando al servidor que ejecute cierto procedimiento o función y enviando este de vuelta el resultado de dicha operación al cliente.

RPC 

Workflow

Un proceso básico de RPC puede separarse en 6 estaciones.​

  1. Origen (Origination)
  2. Presentación/Ordenamiento (Marshalling)
  3. Emisión (Broadcast)
  4. Recepción (Reception)
  5. Procesamiento (Processing)
  6. Respuesta (Response)

gRPC

Principales usos

  • Conecta eficientemente servicios multilenguajes diseñados en arquitectura de microservicios.
  • Conecta dispositivos móviles, Browsers y servicios backend.
  • Genera eficientes bibliotecas cliente.

Funcionalidades Core

  • Bibliotecas cliente en 10 lenguajes
  • Comunicación bidireccional con soporte HTTP/2
  • Autenticación, Tracing y balanceo de carga conectable

gRPC

Resumen

gRPC está basado en la idea de definir servicios, especificando métodos que pueden se llamados remotamente con parámetros y respuesta con tipos definidos.

 

Por defecto, gRPC usa Protocol Buffers (¿?) como el lenguaje de definición de interfaces para describir ambas interfaces del servicio y la estructura del payload de los mensajes. 

¿Qué son los Protocol Buffers?

Es el Mecanismo extensible creado por Google para serializar data estructurada, independiente del lenguaje o plataforma.


Google desarrollo Protobuf de manera interna desde el 2001, actualmente sigue realizando aportes a los generadores de código en distintos lenguajes.


Los principales objetivos de los ProtoBuf ha sido alcanzar simpleza y alto desempeño, ha sido diseñado para ser más rápido y pequeño que XML.

Protocol Buffers

Para usar un Protocol Buffers se debe:

  • Especificar una estructura de datos del mensaje en un archivo .proto, estos archivos se escriben utilizando el lenguaje de descripción de interfaz propio.
message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
}

Protocol Buffers

  • Ejecutar el compilador de ProtoBuff, para el lenguaje de la aplicación, sobre el archivo .proto con el objetivo de generar las clases de acceso a los datos. Estas generan métodos accesores para cada campo.
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: person.proto

require 'google/protobuf'

Google::Protobuf::DescriptorPool.generated_pool.build do
  add_message "Person" do
    optional :name, :string, 1
    optional :id, :int32, 2
    optional :email, :string, 3
  end
end

Person = Google::Protobuf::DescriptorPool.generated_pool.lookup("Person").msgclass

Protocol Buffers

  • Incluir las clases generadas en nuestra aplicación y usarlas para generar instancias del mensaje, serializarlas y enviar los mensajes codificados o leer dichos mensajes, deserializarlos y reconstruir las instancias de los mensajes para acceder a sus campos.
john = Person.new()
john.id = 1234
john.name = 'John Doe'
john.mail = 'jdoe@example.com'

Some::Module.method(person: john)

Aplicación gRPC

Diagrama 

Aplicación gRPC

Diseño

  • Se define el servicio en la sintaxis de protobuf (versión 3)
syntax = "proto3";

package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}
// The response message containing the greetings
message HelloReply {
  string message = 1;
}

Aplicación gRPC

Diseño

  • Generar (compilar) el código del servicio
protoc --ruby_out=lib \
    --grpc_out=lib \
    --plugin=protoc-gen-grpc=`which grpc_ruby_plugin` \
    ./path_to_file.proto

Ruby

$ protoc -I helloworld/ helloworl/helloworld.proto \ 
    --go_out=plugins=grpc:helloworld

Go

Aplicación gRPC

Diseño

  • Iniciar el servidor y el cliente 

Ruby

Go

$ ruby greeter_server.rb 
$ ruby greeter_client.rb 
$ go run greeter_client/main.go 
$ go run greeter_server/main.go 

Aplicación gRPC

Vamos al código

Gracias

gRPC Readme as presentation

By Gustavo Giménez

gRPC Readme as presentation

  • 707