Que Es gRPC?
gRPC (Google Remote Procedure Call) es un framework RPC de alto rendimiento. Usa HTTP/2 para transporte, Protocol Buffers para serializacion y provee streaming bidireccional, control de flujo y autenticacion integrada.
gRPC vs. REST
| Caracteristica | REST | gRPC |
|---|---|---|
| Protocolo | HTTP/1.1 o HTTP/2 | Solo HTTP/2 |
| Formato | JSON (texto) | Protobuf (binario) |
| Contrato | Opcional (OpenAPI) | Requerido (.proto) |
| Streaming | Limitado (WebSocket) | Integrado (4 patrones) |
| Generacion de codigo | Opcional | Integrada |
| Performance | Buena | Excelente (2-10x mas rapido) |
| Caso de uso | APIs publicas, web | Microservicios, movil |
Protocol Buffers
Los archivos .proto definen el contrato de la API:
syntax = "proto3";
package user;
service UserService {
rpc GetUser (GetUserRequest) returns (User);
rpc ListUsers (ListUsersRequest) returns (ListUsersResponse);
rpc CreateUser (CreateUserRequest) returns (User);
rpc StreamUpdates (StreamRequest) returns (stream UserUpdate);
}
message User {
int32 id = 1;
string name = 2;
string email = 3;
Role role = 4;
}
enum Role {
UNKNOWN = 0;
ADMIN = 1;
USER = 2;
}
Conceptos Clave de Protobuf
- Numeros de campo se usan en formato binario — nunca cambiarlos
- Valores por defecto — strings vacios, cero, false (sin concepto de null)
- Compatibilidad hacia atras — agregar campos nuevos con numeros nuevos
Patrones de Comunicacion gRPC
Unary RPC: Un request, un response
Server Streaming: Un request, stream de responses
Client Streaming: Stream de requests, un response
Bidirectional Streaming: Ambos transmiten simultaneamente
Testing de Servicios gRPC
Usando grpcurl
# Listar servicios
grpcurl -plaintext localhost:50051 list
# Llamar un metodo
grpcurl -plaintext -d '{"id": 42}' \
localhost:50051 user.UserService/GetUser
# Con metadata (headers)
grpcurl -plaintext \
-H "Authorization: Bearer token123" \
-d '{"name": "Alice", "email": "alice@example.com"}' \
localhost:50051 user.UserService/CreateUser
Usando Postman
Postman soporta testing gRPC desde 2022: crear request gRPC, importar .proto, seleccionar metodo e invocar.
Codigos de Estado gRPC
| Codigo gRPC | Equivalente HTTP | Significado |
|---|---|---|
| OK (0) | 200 | Exito |
| INVALID_ARGUMENT (3) | 400 | Request invalido |
| NOT_FOUND (5) | 404 | No encontrado |
| ALREADY_EXISTS (6) | 409 | Conflicto |
| PERMISSION_DENIED (7) | 403 | Prohibido |
| UNAUTHENTICATED (16) | 401 | No autenticado |
| INTERNAL (13) | 500 | Error del servidor |
Tests de Streaming
| Test | Que Verificar |
|---|---|
| Cancelacion de stream | Cliente puede cancelar a mitad |
| Stream vacio | Servidor retorna cero mensajes graciosamente |
| Stream grande | Performance con miles de mensajes |
| Error a mitad de stream | Manejo correcto en ambos lados |
| Timeout en stream | DEADLINE_EXCEEDED despues del timeout |
Ejercicio Practico
- Configura grpcurl y explora un servicio gRPC.
- Testea todos los patrones: unary, server streaming y escenarios de error.
- Compara con REST: Llama la misma operacion via gRPC y REST. Compara tamano y tiempo.
- Testing de errores: Envia mensajes protobuf invalidos, campos faltantes y valores enum invalidos.
Puntos Clave
- gRPC usa HTTP/2 y Protocol Buffers para comunicacion de alto rendimiento entre microservicios
- Los archivos proto definen el contrato estricto de la API
- Cuatro patrones de comunicacion: unary, server streaming, client streaming y bidireccional
- gRPC tiene sus propios codigos de estado distintos de los codigos HTTP
- grpcurl es la herramienta esencial de linea de comandos, equivalente a cURL para REST