0

[Article] ¿Qué es gRPC y cómo lo podemos utilizar en .Net Core?

Día a día más empresas y negocios comienzan a orientar sus aplicaciones o productos a una arquitectura de micro-servicios por varias razones: equipos de trabajo pequeños, servicios modulares e independientes, mayor escalabilidad, libertad de tecnologías y rapidez de actualización. Hace poco tiempo, apareció gRPC, el cual nos permite conectar estos microservicios de una manera altamente eficiente.

En el año 2015, Google liberó, conocido internamente en la empresa como Stubby, esta tecnología  para el uso de la comunidad. RPC era conocido como una implementación de software que buscaba llamar una función dentro de un programa que se encuentra remotamente. gRPC busca el mismo objetivo, ejecutar un método de una aplicación remota o en un servidor como si fuera localmente utilizando como transporte HTTP/2 y Protocol Buffers como lenguaje de descripción de interfaz..

Como cualquier otro tipo de servicios, gRPC, se basa en definir un servicio, que contenga métodos que pueden ser invocados con parámetros y que nos devolverán algún tipo de valor o resultado que esperamos.

Ventajas y Características de gRPC son:

  • Marco moderno, ligero y de alto rendimiento.
  • Simple definir: de una manera muy simple, utilizando Protocol Buffers como IDL. Es posible también hacerlo por medio de XML si lo deseamos.
  • Universal: Disponible para cualquier sistema operativo y con soporte para su construcción en más de 10 lenguajes de programación.
  • Bidireccional: Está basado en HTTP/2, soporta todas sus nuevas características dando la posibilidad de realizar streaming bidireccional entre el cliente y el servidor.
  • Consumo reducido de la red.
  • Recomendado para micro-servicios ligeros y altamente eficientes.
  • Excelente para servicios en tiempo real punto a punto controlando respuestas y solicitudes en la transmisión.

gRPC vs REST

gRPC se ha convertido en una alternativa en lugar de REST. Debemos tener en cuenta algunos aspectos. REST es más adecuado para servicios simples y GRPC es mejor cuando tengamos interfaces complejas. 

En REST, generalmente, usamos estructura de datos de tipo JSON que pueden generar una carga mayor en el tráfico de red. En gRPC el flujo de datos es más pequeño por la utilización de Protocol Buffers y HTTP/2. Algunas métricas indican que el espacio de memoria requerido para serialización y binarización puede llegar a reducirse hasta un 70%. Tampoco se debemos olvidar que si estamos utilizando streaming bidireccional no tendremos bloqueos de intercambio dando mucha potencia y velocidad en comparación con REST.

Por otro lado, aún no es posible acceder a un servicio gRPC directamente desde un navegador. REST no cuenta con esta desventajas debido a que usa, HTTP que es compatible con todos los navegadores. Podemos sortear esa dificultad con gRPC-Web. Los desarrolladores gRPC están trabajando en soluciones que faciliten la colaboración de gRPC con herramientas basadas en la web.

Ciclo de Vida gRPC

Una de las grandes preguntas es: ¿Cómo es el ciclo de vida?

Básicamente son 4:

Unary RPC

Este es el más simple, el cliente envía la solicitud y obtiene una respuesta. 

  1. El cliente invoca un método y notifica al servidor con la metadata correspondiente.
  2. El servidor puede enviar su propia metadata iniciales de inmediato o esperar una solicitud.
  3. Una vez que el servidor tiene el mensaje del cliente, realiza el proceso  correspondiente para crear y completar la respuesta. Una vez finalizado, será enviada la respuesta al cliente.
  4. Si todo está correcto el cliente recibe la respuesta y se completa la llamada del lado del cliente.

Server streaming RPC

En este tipo de llamado, el cliente gRPC hace una petición, pero el servidor puede retornar un stream de respuestas. Esto quiere decir que el servidor devuelve una secuencia de mensajes al cliente. El ciclo se completa cuando el cliente recibe todos los mensajes.

Client Streaming RPC: 

A  diferencia del Server streaming RPC, el cliente gRPC comienza enviando un stream de solicitudes, el servidor, retorna una única respuesta. La mayoría del tiempo,esta respuesta, se envía después de recibir todas las peticiones, aunque no necesariamente.

Bidirectional streaming RPC

La llamada es iniciada por el cliente, se invoca el método y el servidor recibe los metadatos del cliente, el nombre del método y un tiempo límite. El servidor opta por enviar de vuelta sus metadatos iniciales o esperar a que el cliente comience a transmitir mensajes.

gRPC en .NET Core

Vamos a ver como utilizarlo en .Net. Para hacerlo necesitaremos Visual Studio 2019 versión 16.4 o superior y Net Core 3.1. También podemos utilizar Visual Studio Code y crear las plantillas desde la consola de comandos.

Vamos a realizar los siguientes pasos:

  • Abrimos Visual Studio, veremos la pantalla de inicio de selección del nuevo proyecto, en la barra de búsqueda escribiremos gRPC. Seleccionaremos el tipo tipo de proyecto gRPC Service.
  • Llamaremos al proyecto GrpcService seleccionamos Create.
  • En la siguiente pantalla, seleccionamos, gRPC services y Create.

Veamos que tenemos en nuestro proyecto, tenemos el archivo greet.proto, este define el servicio y es el que se usa para generar los recursos en el servidor. Carpeta de servicios que contiene la implementación. El archivo appSetting.json, que como todo proyecto .Net, contiene la configuración necesaria. Program.cs configuraciones de punto de entrada para el servicio. Startup.cs contiene la configuración del comportamiento de la aplicación.

Lo siguiente, vamos a crear un proyecto de consola. Este lo utilizaremos como cliente del servicio que construimos anteriormente. Necesitaremos agregar los siguientes paquetes:

  • Grpc.Net.Client, que contiene el cliente de .NET Core.
  • Google.Protobuf, que contiene API de mensajes protobuf para C#.
  • Grpc.Tools, que contiene compatibilidad con herramientas de C# para archivos protobuf. 

En nuestro cliente creamos una carpeta Protos, donde debemos copiar el archivo greet.proto que fue creado en el proyecto de servicios, por último, debemos editar el archivo de proyecto de csproj para agregar las siguiente líneas de código que son las que hacen referencia al archivo proto.

<ItemGroup>
  <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
</ItemGroup>

Tenemos nuestras referencias listas, ahora modificaremos el consumo desde el cliente. Lo primero será crear un canal de comunicación, crear el cliente, invocar el servicio y mostrar la salida. Bastante simple.

using System;
using System.Net.Http;
using System.Threading.Tasks;
using GrpcGreeter;
using Grpc.Net.Client;

namespace GrpcGreeterClient
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // The port number(5001) must match the port of the gRPC server.
            using var channel = GrpcChannel.ForAddress("https://localhost:5001");
            var client =  new Greeter.GreeterClient(channel);
            var reply = await client.SayHelloAsync(
                              new HelloRequest { Name = "GreeterClient" });
            Console.WriteLine("Greeting: " + reply.Message);
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

Estamos listos para poder ejecutar nuestra aplicación, presionaremos ctrl+f5. Recibimos un mensaje de información de la configuración del proyecto que debe ser ejecutado con SSL, seleccionamos YES.

Luego nos aparecerá la advertencia de seguridad para instalar el certificado SSL. Presionamos yes nuevamente.

Luego de estos pasos veremos la salida en el servicio de consola podremos ver el resultado de la llamada.

Conclusiones

Verdaderamente es muy sencillo de crear un servicio gRPC. Pero como todo, no es una bala de plata, es un buen recurso cuando necesitamos utilizar servicios altamente eficientes y que consuman pocos recursos de red. Pruébenlo y déjenme sus comentarios.

Referencias

Fernando Sonego

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *