Cuando hablamos de crear aplicaciones web y moviles, una forma que usamos para comunicar el backend y aplicaciones cliente es crear una API REST o una API de GraphQL para poder enviar y recibir datos en formato JSON.
Sin embargo cuando hablamos de proyectos Backend grandes, actualmente podemos encontrar que muchos usan arquitecturas distribuidas o de Microservicios, los cuales basicamente es una forma de dividir un backend en multiples backend, cada uno encargandose de una parte esencial de una aplicacion (pagos, autenticacion, ordenes, logs, etc).
Y si bien para comunicar estos servicios podriamos usar tambien una API REST, lo cierto es que tenemos mejores opciones de protocolos y herramientas para poder comunicarlos entre si, es aqui donte entra otra forma de comunicar aplicaciones cliente y servidor llamada gRPC Enfocada netamente en comunicar microservicios.
Pero para poder entender esto, primero debemos saber que significa RPC.
¿Qué es RPC?
Las siglas RPC vienen de Remote Procedure call.
Procedure o procedimiento es un conjunto de instrucciones que realiza una tarea especifica en nuestro programa, es decir estas son lo que llamamos funciones en los lenguajes de programacion, de hecho cuando hablamos de Procedure Call a veces tambien se usa el termino function call o subroutine call para referirnos a lo mismo.
Y cuando hablamos de Procedure call, tenemos dos opciones:
- Local Procedure call
- Remote Procedure call
Cuando hablamos de local Procedure call basicamente estamos habalndo de ejecutar funciones en la misma maquina, mientras que cuando hablamos de Remote Procedure Call, estamos hablando de poder ejecutar funciones en otro computador.
De hecho para poder hacer esto tambien se aqui el modelo Cliente/Servidor.
Una maquina cliente solicita ejecutar codigo a otra maquina que alberga el código.
De aqui que se defina a RPC COMO un protocolo de comunicacion de Software, que permite hacer una peticion a un servico que esta en otro computador, sin necesidad de entender detalles de como funciona la Red.

Ahora si hablamos de gRPC, estamos hablando de una implementacion encima de este protocolo.
¿Que es gRPC?
Entonces gRPC es un framework open source de RPC creado por Google en el año 2016, y que actualmente muchas organizaciones (Google, Netflix, Slack, Cisco, Crockroachdb) lo usan como la principal forma para poder comunicar sus multiples servicios (Microservicios) a traves de distintos datacenters.
Entre algunas de las ventajas de gRPC podemos encontrar:
- Tiene un ecosistema de desarrollo muy grande. implementar gRPC es muy facil, ya que hay biblioteca disponibles en los lenguajes de programacion de Backend más usados, como C++, Go, Java, Python, Nodejs y demas, aunque tambien la comunidad ha desarrollado para otros lenguajes no tan populares
- escalar servicios es muy facil gracias a su sistema de tipo de datos (Type-Safe) y poco consumo de recursos
- gRPC es una tecnología agnostica, es decir que puede crear un servidor de gRPC en C++ y un cliente en Go, o Typescript y puedes comunicarlos.
Protocol Buffers

el nucleo de gRPC viene por parte de un lenguaje llamado Protocol Buffers, el cual es un formato de intercambio de datos en esencia similar a JSON o XML, que es ampliamente utilizado por Google, y que se hizo open Source desde el año 2008.
De hecho al igual que JSON y XML estos son enviados de un sistema a a otro atraves de peticiones (Proto Request) y Respuestas (Proto Response).
Solo que los protobuffers son má rapidos debido a que estos al enviarse son codiicados en un formato binario, lo que los hace más ligeros en comparacion a JSON.

ademas que como a que gRPC esta desarrollado encima de http2, este permite que multiples streams de datos viajen en una ola coneccion tcp. haciendo que gRPC pueda manejar muchas llamadas RPC de forma concurrente en unas pocas conexiones TCP (client/server).

Ademas los Protocol Buffers es un lenguaje agnostico, es decir que no esta ligado a ningun lenguaje de programacion en especifico, ni a ninguna plataforma en especifico.
gRPC usa los protocol Buffer por defecto para poder codificar y enviar datos. Y aunque este puede soportar otros formatos de codificacion como JSON, los protocol Buffers son más usados al ofrecer más ventajas, como ocupar menos espacio, y ser mas rapidos y simples que JSON.
Ademas los Protocol Buffer permiten definir esquemas de datos que son Fuertemente tipados (similar a lo que ofrece Typescript) y que permiten definir que sera enviado de un sistema a otro (codifican los datos)
message Person {
optional string name = 1;
optional int32 id = 2;
optional string email = 3;
}
estos datos (Protocol Buffers) son definidos en archivos con la extension .proto, los cuales no solo especifican como lucen los datos:

sino tambien que operaciones (service) se pueden ejecutar:
![https://miro.medium.com/max/1400/1*XtzG5y1Xf02W0jLSJ_H-Kg.png]
estos archivos .proto pueden ser compilados en codigo de otros lenguajes de programacion de esta forma puedes importar clases u objetos en distintos lenguajes de programacion.

usando estos archivos .proto se puede crear codigo para clientes gRPC y servidores gRPC. incluso en distintos lenguajes de programacion.

Como funciona gRPC
cuando se usa gRPC en un proyecto, tipicamente tenemos un Cliente gRPC y un servidor gRPC
https://www.vinsguru.com/wp-content/uploads/2020/07/grpc-file-upload.png
Por ejemplo un cliente gRPC podria ser un servicio de compras y el servidor podria ser un servicio de pagos.
Cuando el servicio de compras hace una llamada al servicio de pagos,