¿Buscas nuestro logo?
Aquí te dejamos una copia, pero si necesitas más opciones o quieres conocer más, visita nuestra área de marca.
Conoce nuestra marca.¿Buscas nuestro logo?
Aquí te dejamos una copia, pero si necesitas más opciones o quieres conocer más, visita nuestra área de marca.
Conoce nuestra marca.dev
Noelia Martín 02/03/2022 Cargando comentarios…
Habitualmente al hablar de APIs nuestro pensamiento se dirige al uso de HTTP y REST al ser la opción más popular y extendida.
Pero el aumento en la adopción de las arquitecturas orientadas a eventos, el uso de distintos proveedores cloud, así como la cantidad y heterogeneidad de productos dentro del stack tecnológico de los clientes, ha supuesto un aumento en la diversidad de los casos de uso.
Esto implica que, para ciertas casuísticas, se demanden una serie de necesidades a nivel de integración que no son cubiertas de forma óptima por las tradicionales soluciones basadas en APIs REST.
Una de las opciones que está adquiriendo fuerza es el uso de gRPC. gRPC es una implementación de llamadas a procedimiento remoto (RPC) diseñado originalmente por Google, de ahí su nombre: g (Google) + RPC.
Actualmente es un componente open source y su distribución la realiza la Cloud Native Computing Foundation y para cada nueva versión cambia el significado de la "g", hasta el punto en que incluso hicieron un README para enumerar todos sus significados.
Se emplea en comunicaciones cliente-servidor distribuidas por su eficiencia gracias a la ingeniería de procesos basada en RPC. Este mecanismo permite la comunicación de una forma tan sencilla como si se tratara de una comunicación local entre procesos de una misma máquina.
En los últimos años está ganando bastante popularidad como una alternativa para cierto tipo de integraciones, ¿a qué se debe su adopción? Pues algunas de las razones son:
Un ejemplo claro de su expansión es que una de las herramientas más utilizadas en este ámbito como Postman ha incluido soporte para GRPC recientemente.
La arquitectura de RPC se basa en los siguientes pasos:
Muchas de las complejidades de este proceso están ocultas a los desarrolladores como el stub y la comunicación de la capa de transporte, lo cual simplifica su implementación.
Y ¿qué diferencia gRPC de RCP? Pues introduce dos mejoras sustanciales que son:
Una de las razones por las que gRPC funciona tan bien es el uso de HTTP/2, creado por Google en 2015, el mismo año que gRPC.
HTTP (Hypertext Transfer Protocol) es un protocolo de comunicación que permite la transferencia de información en internet. La versión más conocida es la HTTP/1.1, pero tiene algunas limitaciones. La más importante es que necesita una conexión TCP/IP (capa de transporte dentro del protocolo HTTP) por cada elemento que quiere obtener. Para superar esta limitación surge HTTP/2, que aunque conserva la misma semántica que la versión HTTP/1.1 presenta las siguientes mejoras:
Mientras que con HTTP/1.1 para cargar cualquier elemento se requiere múltiples conexiones TCP, con HTTP/2 se utiliza una única conexión, a través de la cual se pueden enviar varias peticiones y recibir varias respuestas de forma simultánea, ya que la comunicación es bidireccional mejorando la eficiencia considerablemente.
Y como una imagen vale más que mil palabras, aquí tenemos un ejemplo en el que se ve la diferencia entre usar HTTP/1.1 y HTTP/2 al cargar varias imágenes.
En HTTP/1.1 cada petición que se envía tiene un bloque formado por las cabeceras para indicar cierto comportamiento entre el cliente y el servidor. En HTTP/2 todas esas cabeceras se empaquetan en un único bloque comprimido de forma que se obtienen mejores tiempos de respuesta. Además la compresión se realiza mediante el algoritmo HPACK el cual se encarga de eliminar campos redundantes y prevenir posibles vulnerabilidades.
HTTP/2 permite que el servidor envíe mensajes antes de que el cliente los solicite. El funcionamiento es simple, cuando el servidor recibe una petición este retorna la respuesta asociada y en caso de que estime que puede necesitar algún recurso adicional también lo envía. Por ejemplo, al retornar una página HTML también puede enviar los archivos CSS, las imágenes o las fuentes antes de que el navegador los solicite, evitando el envío de solicitudes adicionales y mejorando el rendimiento.
A la hora de transmitir información algunos componentes son más importantes que otros. HTTP/2 permite asignar diferente prioridad dentro de mensajes HTTP. Cada mensaje HTTP es dividido en fragmentos y se puede asignar una prioridad a cada uno de ellos gracias a lo cual se controla mejor el orden y el retardo de los elementos.
HTTP/2 envía y recibe la información de forma binaria mientras que HTTP/1.1 lo realiza en texto. La ventaja de usar un protocolo binario es la eficiencia tanto en su transporte al estar la información más compactada, como en su interpretación, ya
GRPC utiliza Protobuf para:
Esta información se define en un fichero .proto que contiene:
Un ejemplo sencillo sería el siguiente:
syntax = "proto3";
package com.book;
message Book {
int64 isbn = 1;
string title = 2;
string author = 3;
}
message GetBookRequest {
int64 isbn = 1;
}
message GetBookViaAuthor {
string author = 1;
}
service BookService {
rpc GetBook (GetBookRequest) returns (Book) {}
rpc GetBooksViaAuthor (GetBookViaAuthor) returns (stream Book) {}
rpc GetGreatestBook (stream GetBookRequest) returns (Book) {}
rpc GetBooks (stream GetBookRequest) returns (stream Book) {}
}
Tiene como ventajas que:
Una vez detallada la arquitectura básica de gRPC y cómo funciona, veremos qué es capaz de hacer:
Gracias a la multiplexación de HTTP/2 mencionada anteriormente es posible procesar información en Streaming de diferentes formas:
Si quieres ver un ejemplo de la implementación de un servicio de cada uno de los tipos de streaming aquí tienes el post sobre el paso a paso con Java Spring Boot y Postman.
gRPC permite capturar los mensajes tanto de solicitud como de respuesta y modificarlos a través de interceptores.
Estos interceptores se asemejan a lo que podría ser un middleware en el mundo HTTP de una API Rest ya que permite:
Habitualmente el balanceo de carga se realiza a nivel de proxy, por ejemplo mediante un NGINX, pero gRCP proporciona un mecanismo de balanceo de carga tanto del lado del cliente como del lado del servidor que puede utilizarse con relativa facilidad.
Los clientes de gRPC pueden cancelar una petición cuando yo no necesitan la respuesta. Esto es especialmente útil en el lado del servidor cuando está en modo Streaming ya que gracias a un patrón que permite observar si las solicitudes se cancelan puede detectar dicha cancelación y anular esas peticiones.
Los pasos serían los siguientes:
Entre las ventajas que presenta el uso de gRPC tenemos las siguientes:
Por otro lado, también presenta varias desventajas que obstaculizan enormemente su adopción de forma masiva:
La respuesta correcta, como en la mayoría de estas comparativas, es que depende del caso de uso en concreto. En ciertas ocasiones la solución que mejor se adapta puede ser GRPC y en otros casos REST.
Para tomar la decisión más acertada conviene tener en cuenta las diferencias fundamentales entre ambas opciones:
Teniendo en cuenta los puntos anteriores hay ciertos escenarios en los que gRPC puede ser la solución más adecuada:
En resumen, gRPC no es ni una evolución ni un reemplazo para REST, solo es una alternativa a considerar cuando se diseña e implementa una API.
Su uso es adecuado en proyectos para comunicaciones internas cuyos requisitos están alineados con las ventajas del uso de la propia tecnología: una gran escalabilidad, respuesta optimizada y baja latencia.
En caso de querer realizar un proyecto en gRCP o conocer más en profundidad esta tecnología un posible “welcome pack” sería el siguiente:
Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.
Cuéntanos qué te parece.