REST o gRPC: cuándo conviene cada uno, y por qué su core no habla ninguno
Por Dorian Chávez · fundador de Hábil y arquitecto de integración ·
REST en la frontera, gRPC en el corazón y un adaptador para el legacy: criterios, gRPC-Web, transcoding, herramientas, Spring Boot, Quarkus y Protobuf.
La pregunta «¿REST o gRPC?» suele plantearse como si hubiera que elegir un bando para toda la arquitectura. En la práctica, casi nunca se decide una sola vez: se decide en cada frontera. Una API que reciben terceros, una llamada entre dos servicios del mismo equipo y la conexión con un sistema de hace veinte años piden respuestas distintas.
Es la profundización de la rama «en línea» de nuestro artículo sobre en línea o asíncrono: allá se decide cuándo conviene responder al instante, y aquí con qué protocolo hacerlo y qué hacer cuando el sistema del fondo no puede.
Este artículo es para el equipo técnico que tiene que tomar esas decisiones: arquitectos, líderes de desarrollo y quienes integran sistemas en bancos, aseguradoras, fintechs o retail. Propone un criterio que se resume en una frase:
REST en la frontera, gRPC en el corazón, adaptador para el legacy.
Es un criterio, no una regla; al final se ven los casos en que conviene romperlo.
Qué es gRPC, en cinco ideas
gRPC es un marco de llamadas a procedimientos remotos (RPC). En lugar de pensar en recursos y URL, se piensa en servicios con métodos que se invocan a distancia como si fueran locales. Cinco ideas lo definen:
- El contrato va primero. El servicio y sus mensajes se describen en un archivo
.proto. Por defecto, gRPC usa Protocol Buffers (Protobuf) como lenguaje de definición de interfaces, tanto para el servicio como para la estructura de los mensajes [1]. Del.protose generan el cliente y la base del servidor, tipados, en los lenguajes que el equipo use [4]. - Va sobre HTTP/2 y viaja en binario. gRPC está diseñado para HTTP/2, que ofrece empaquetado binario, compresión y multiplexación de varias llamadas sobre una sola conexión TCP. Protobuf produce mensajes pequeños y se serializa con rapidez. Un matiz que conviene no perder: HTTP/2 no es exclusivo de gRPC; una API HTTP con JSON también puede usarlo [4].
- Streaming de primera clase. Además de la llamada simple (una petición, una respuesta), existen el streaming del servidor al cliente, del cliente al servidor y el bidireccional. gRPC garantiza el orden de los mensajes dentro de una misma llamada [1]. Sirve para telemetría, cotizaciones en vivo o notificaciones.
- Plazos (deadlines) explícitos. El cliente indica cuánto está dispuesto a esperar; si se vence, la llamada termina con el error
DEADLINE_EXCEEDED[1]. Por defecto gRPC no fija ningún plazo, de modo que un cliente puede quedar esperando prácticamente para siempre [2]. Al vencer el plazo, gRPC cancela la llamada, pero la aplicación debe detectar esa cancelación y detener el trabajo que lanzó [2]. El plazo puede propagarse a las llamadas que ese servicio hace a otros, para no gastar recursos en una respuesta que ya nadie espera [2][4]. - Estados de error con vocabulario propio. Cada llamada termina con un código de estado de un catálogo de 17 valores, entre ellos
INVALID_ARGUMENT,NOT_FOUND,PERMISSION_DENIED,UNAUTHENTICATED,RESOURCE_EXHAUSTEDyUNAVAILABLE[3]. La página oficial de códigos no define una equivalencia con los códigos HTTP. Quien exponga el servicio hacia fuera debe decidir esa traducción por escrito.
gRPC no es «REST más rápido»: es otro modelo, con contrato obligatorio y una especificación estricta que, según Microsoft, evita el debate sobre el formato de URL, verbos y códigos de respuesta [4]. Si además se expondrá HTTP/JSON, esas rutas, verbos y errores igual hay que definirlos. Y no es gratis: el formato binario no se lee a simple vista y requiere el contrato para interpretarse [4].
Cuándo REST
REST es un estilo de diseño sobre HTTP orientado a recursos, verbos y representaciones, casi siempre en JSON. Es la opción por defecto en la frontera: donde su sistema se encuentra con quien no controla.
- Terceros e integradores. Quien consume su API no tiene por qué adoptar su herramienta de generación de código. REST/JSON reduce la dependencia de SDK generados y facilita la inspección y las pruebas manuales; un socio puede probar una llamada con
curlen un minuto. - Frontend en el navegador. Ningún navegador da el control sobre HTTP/2 que gRPC necesita, por lo que no se puede llamar a un servicio gRPC directamente desde una página [4]. Más adelante se ve qué hacer cuando de todos modos se quiere gRPC en la web.
- Depuración humana. Una petición REST se lee, se copia, se pega en un ticket y se reproduce. Con gRPC se necesitan herramientas que entiendan el formato [4].
Cuándo gRPC
Considere gRPC cuando usted controle proveedor y consumidor, acepte gobernar los .proto y tenga una restricción medida de latencia, tamaño de mensaje o volumen. Los escenarios que la documentación de Microsoft recomienda son microservicios de baja latencia y alto rendimiento, comunicación punto a punto en tiempo real, entornos con varios lenguajes, redes con restricciones de ancho de banda y comunicación entre procesos de una misma máquina [4].
- Servicios internos. Entre servicios del mismo dominio de confianza, el contrato fuerte y el cliente generado evitan una categoría entera de errores: campos que cambian de nombre, tipos que se interpretan distinto, clientes escritos a mano que se desfasan.
- Contrato fuerte entre equipos. Cuando varios equipos y lenguajes comparten servicios, el
.protofunciona como acuerdo ejecutable: si no compila, no se integra. - Volumen. Cuando se hacen muchas llamadas pequeñas, el tamaño del mensaje y la multiplexación sobre una conexión se notan. Mida con su carga antes de justificar el cambio con la velocidad.
- Streaming. Si el caso de uso es un flujo (precios, eventos de dispositivos, avance de un proceso largo), gRPC lo ofrece como parte del contrato, no como un añadido.
Hay un caso que Microsoft excluye: la difusión masiva a muchos clientes conectados; gRPC no tiene el concepto de «broadcast» y cada llamada transmite por separado [4].
El navegador y gRPC-Web
Como el navegador no puede hablar gRPC nativo, existe gRPC-Web: un protocolo adaptado, con un cliente generado en JavaScript y un proxy compatible (el tutorial oficial usa Envoy) entre el navegador y el servicio gRPC; además puede requerir configuración de CORS [5].
Tiene límites que conviene conocer antes de decidir. En el repositorio del proyecto, el streaming del servidor al cliente solo se admite en el modo grpcwebtext, y el streaming del cliente y el bidireccional no están soportados [6]. Microsoft lo clasifica entre las razones para preferir otro marco cuando la API debe ser accesible desde el navegador: gRPC-Web ofrece soporte, pero con limitaciones y con un proxy de servidor adicional [4].
Regla práctica: gRPC-Web si la aplicación web es suya y la plataforma ya usa Protobuf; REST/JSON si la consumirán terceros.
Exponer gRPC como REST sin escribir dos veces la lógica
No hay que escoger entre las dos caras. El contrato .proto puede llevar anotaciones HTTP (google.api.http) que dicen qué ruta y verbo corresponden a cada método. Un componente intermedio, normalmente el gateway o un proxy, convierte la petición HTTP/JSON a llamada gRPC y devuelve la respuesta en JSON. Este mecanismo se llama transcoding [4][7][18]:
Cliente REST → gateway (transcoding) → servicio gRPC → adaptador → core legacy
Cliente gRPC ──────────────────────→ servicio gRPC → adaptador → core legacyDos ejemplos de gateways que lo ofrecen, como categoría y no como recomendación:
- Envoy tiene el filtro gRPC-JSON transcoder, que permite que un cliente REST con JSON envíe peticiones por HTTP y sean enviadas a un servicio gRPC. Requiere conocer el descriptor Protobuf del servicio y las anotaciones HTTP en el contrato [7].
- Apache APISIX tiene el plugin
grpc-transcode, que transforma peticiones y respuestas entre HTTP y gRPC. Los protos se registran por su API de administración, como texto o como descriptor binario [8]. La documentación consultada no menciona streaming; compruébelo en su versión.
La idea: una sola implementación, dos formas de llamarla.
Dos cuidados, que el transcoding no resuelve solo:
- Errores. El conversor traduce códigos, pero la política de qué significa cada uno para un tercero la define usted. Un
UNAVAILABLEinterno ¿se muestra como un error de servicio no disponible o se reintenta antes? - Seguridad. Autenticación, autorización fina y cuotas son preocupaciones del gateway y del servicio, no del formato.
Herramientas de prueba: qué sigue vigente
Probar un servicio gRPC a mano pide una herramienta que entienda Protobuf. Este es el estado que verificamos el 6 de octubre de 2026; cualquier cambio posterior puede modificarlo.
| Herramienta | Tipo | Estado verificado | Para qué sirve |
|---|---|---|---|
| Postman | Cliente gráfico | Vigente. Admite llamadas simples y de streaming, mensajes en JSON, metadatos, autorización y TLS [9] | Equipos que ya lo usan para REST y quieren un solo cliente |
| grpcurl | Línea de comandos | Vigente. Versión 1.9.4 publicada el 31-ago-2026 [10]. Acepta JSON, usa reflexión o .proto/protoset, soporta TLS y mTLS, y llamadas de streaming [10] | Automatización y diagnóstico desde terminal |
| Kreya | Cliente gráfico | Vigente. Versión 1.21.0 con fecha 31-ago-2026 en sus notas [11] [proveedor] | Pruebas guardadas y reutilizables con interfaz gráfica |
| Insomnia | Cliente gráfico | Vigente. Admite los cuatro tipos de llamada, importación de .proto y reflexión [12] | Alternativa gráfica con importación de esquemas |
| Evans | Línea de comandos interactiva | Sin archivar; su último lanzamiento publicado es de febrero de 2023 [13]. Evalúe su mantenimiento antes de estandarizarlo | Exploración interactiva, con esa reserva |
| BloomRPC | Cliente gráfico | No usarlo en proyectos nuevos. Su repositorio está archivado y es de solo lectura (último cambio en enero de 2023) [14] | Solo como referencia histórica |
La reflexión de servidor permite descubrir métodos sin el .proto, pero debe habilitarse en el servicio y, en producción, conviene decidir a quién se le muestra.
Java: Spring Boot y Quarkus
Java es un caso útil porque ambos marcos tienen un camino documentado hacia gRPC. Las versiones que siguen son las verificadas el 6 de octubre de 2026.
Spring Boot. Spring gRPC es un proyecto oficial de Spring, con versión 1.0.0 publicada el 4-dic-2025. Al corte, la versión estable más reciente en GitHub es la 1.1.1 (21-ago-2026) [15]. La 1.1.0 (10-jun-2026) migró la autoconfiguración a Spring Boot 4.1.0, y las ramas 1.0.x apuntan a Boot 4.0 [15]. Para una base nueva en Spring Boot 4.1 hay camino oficial; con versiones anteriores, revise la compatibilidad con la línea 1.0.x.
Quarkus. gRPC se incorpora con la extensión quarkus-grpc: implementa y consume servicios, genera código a partir del .proto, se integra con el modelo reactivo, admite TLS y TLS mutuo, xDS y comunicación en proceso [16]. Quarkus recomienda el servidor gRPC basado en Vert.x porque es más flexible y está mejor integrado en el ecosistema, y ese servidor puede atender HTTP y gRPC por el mismo puerto, si se configura quarkus.grpc.server.use-separate-server=false [16]. En Maven Central, la última versión 3.x de la extensión al corte es la 3.40.1 (30-sep-2026); también hay una 4.0.0.Beta1 de ese mismo mes, que es una versión previa [16].
Los dos funcionan: decide el marco que el equipo ya domina.
Sea cual sea el marco, importan las mismas prácticas: un repositorio único de contratos, interceptores para identidad y trazas, política de errores común, health checks y plazos obligatorios en cada cliente.
Evolución de contratos Protobuf: cómo no romper a nadie
El contrato es el producto. Cambiarlo sin cuidado rompe a los clientes que no se enteraron. La guía oficial de Protobuf establece reglas claras [17]:
- Agregar campos es seguro. El código viejo ignora los campos nuevos al leer, y el nuevo usa valores por defecto con mensajes antiguos.
- Agregar valores a un
enumes seguro en el formato binario; aun así, valide que los clientes y las reglas de negocio contemplen el valor nuevo (en lenguajes con enums cerrados, como Java, un valor desconocido llega como un caso aparte). - El número de un campo no se cambia ni se reutiliza una vez que el mensaje está en uso, porque ese número identifica al campo en el formato de cable.
- Al retirar un campo, se reserva su número (y, si se usa JSON, también su nombre) para que nadie lo reutilice por accidente.
- Mover campos hacia o desde un
oneofexistente es riesgoso: puede perderse información al serializar y leer.
La guía de diseño de APIs de Google aplica tanto a REST como a RPC y remite a sus propuestas AIP-180 (compatibilidad) y AIP-185 (versiones) [18]. La regla operativa es corta:
- Publicar los
.protocomo producto versionado. - Validar compatibilidad en la integración continua (con una herramienta de detección de cambios que rompen).
- Mantener pruebas de contrato entre el servicio y sus consumidores.
- Tratar cualquier cambio no aditivo como una versión nueva de la API, con periodo de convivencia.
Por qué su core no habla ninguno
Aquí está el punto que casi ningún comparativo de protocolos toca. Los sistemas centrales de una aseguradora, un banco o un comercio con décadas de historia suelen no hablar ni REST ni gRPC, y sus limitantes explican por qué:
- No exponen APIs que se puedan llamar, ni avisan cuando algo cambia.
- Solo aceptan datos en una zona de intercambio, tablas o archivos, y los procesan a su propio ritmo, a menudo por lotes, disparando un proceso propio.
- Aguantan poca carga: una ráfaga de llamadas en línea los satura.
- La respuesta llega cuando termina el proceso, no cuando se envió la petición, y a veces solo se encuentra volviendo a leer otra tabla o archivo.
Elegir REST o gRPC para la capa de arriba no cambia eso. Lo que se necesita en medio es un adaptador: un componente que habla el idioma del core hacia adentro y el contrato nuevo hacia afuera. Y cuando el modelo, los errores, la seguridad o las transacciones de los dos lados no coinciden, el adaptador debe ser una capa anticorrupción, el patrón que Eric Evans describió en Domain-Driven Design [19].
Es una fachada entre subsistemas que no comparten semántica, para que las dependencias externas no limiten el diseño de la aplicación; puede ser un componente interno o un servicio independiente [19].
La diferencia con un proxy es importante:
| Transcoding en el gateway | Adaptador o capa anticorrupción | |
|---|---|---|
| Qué traduce | Protocolo y formato: HTTP/JSON ↔ gRPC/Protobuf | Semántica de negocio: modelo, errores, transacciones y reglas de acceso |
| Quién lo conoce | El gateway, con el descriptor del contrato | Quien conoce el core y su historia |
| Ejemplo | Convertir POST /polizas en la llamada CrearPoliza | Convertir CrearPoliza en escritura a tablas de intercambio, disparo de un procedimiento y espera del resultado |
| Qué evita | Duplicar la implementación del servicio | Que decisiones históricas del core se filtren al contrato público |
Cuatro tareas suelen caer en el adaptador, y conviene escribirlas antes de que se diluyan en el código (criterio de diseño; el patrón en sí se describe en [19]):
- Traducir los objetos de datos y validar invariantes en esa frontera, incluido el saneamiento de entradas.
- Normalizar errores: un código de retorno propietario o una fila en una tabla de errores se vuelve un estado gRPC, y de ahí, si procede, un código HTTP, con la política explícita de la que se habló arriba.
- Proteger al core. Un core tiene un ritmo que soporta. Si una emisión masiva envía miles de movimientos y el core procesa unas decenas por minuto, la llamada en línea no es la forma de entregarlos: se necesita una cola o un mecanismo de nivelación de carga [20], salvo que el llamador requiera una respuesta síncrona de baja latencia. Una cola exige definir idempotencia, reintentos, manejo de mensajes fallidos, orden cuando aplique y consulta de estado por identificador de correlación [20]. Ese es el tema del siguiente artículo de esta serie.
- Observar: un identificador de correlación en cada llamada, para reconstruir qué pasó entre el contrato nuevo y el core, y registros estructurados para diagnosticar fallas de traducción.
Costos: más latencia, un servicio más que operar y decidir si la capa es permanente [19]. Microsoft recomienda que se limite a traducir y no concentre reglas de negocio ni orquestación [19].
Tabla de decisión
| Situación | Inclinación razonable | Por qué | Cuándo cambiaría |
|---|---|---|---|
| API pública o para integradores externos | REST/JSON con OpenAPI | Terreno común, fácil de probar y depurar | Si el consumidor acepta SDK generados y gana con streaming o con eficiencia |
| Aplicación web propia | REST/JSON, o gRPC-Web si la plataforma ya es Protobuf | Sin proxy extra en el primer caso | Cuando se prefiere un solo contrato en todo el stack y se aceptan las limitaciones de gRPC-Web |
| Servicios internos del mismo equipo o dominio | gRPC | Contrato fuerte, cliente generado, plazos y estados explícitos | Si el equipo no opera bien Protobuf o el volumen no justifica el cambio |
| Muchas llamadas pequeñas o de baja latencia | gRPC (medido con su carga) | Mensaje compacto y multiplexación | Si la medición no muestra diferencia útil |
| Flujos continuos (precios, eventos, progreso) | gRPC con streaming, o un sistema de mensajería | Streaming dentro del contrato | Si necesita difusión a muchos clientes, evalúe otra herramienta |
| Misma lógica, dos tipos de consumidor | gRPC con transcoding | Una implementación, dos caras | Si los dos contratos divergen mucho, mantenga dos fachadas |
| Core legado (sin API, con zona de intercambio en tablas o archivos, proceso por lotes) | Adaptador / capa anticorrupción hacia adentro | El core no habla ninguno | Si el core ya expone una API estable, adaptar menos |
| Carga masiva hacia un core con ritmo limitado | Cola o proceso asíncrono, no llamada en línea | Protege al core | Si el core absorbe el volumen sin degradarse |
Cuándo romper la frase guía
«REST en la frontera, gRPC en el corazón, adaptador para el legacy» funciona como punto de partida. Hay casos razonables en que conviene salirse:
- Todo REST. Con equipo pequeño, volumen moderado y sin streaming, Protobuf puede costar más de lo que da.
- gRPC hasta la frontera. Si los consumidores externos son pocos y aceptan SDK generados, se evita una capa.
- Sin adaptador. Si el core ya ofrece una API moderna y estable, el adaptador se reduce a un mapeo delgado.
- Asíncrono en lugar de síncrono. Si el problema es el ritmo del core y no el protocolo, lo que ayuda es una cola, un evento o un callback con identificador de correlación.
Lo que sí conviene mantener: decidir por frontera, medir antes de justificar y escribir el contrato antes de escribir el código.
Cierre: lo que conviene llevarse a la próxima reunión
Antes de elegir protocolo, tres preguntas ordenan la discusión: quién consume la interfaz y quién controla sus clientes, qué idioma habla el sistema del fondo y qué ritmo soporta. Si el sistema del fondo no habla ninguno de los dos o va más lento que quien lo llama, y la carga medida exige desacoplar la entrada del procesamiento, conviene priorizar el adaptador y considerar una cola antes de cambiar de protocolo.
Qué hace Hábil
Hábil trabaja en el espacio entre los sistemas existentes y las capas nuevas: busca que un core que no habla REST ni gRPC pueda atender a sus canales y a sus socios sin frenar la operación. Para unir sus APIs y canales, véase la página Unificar su operación y sus canales; para actualizar el core a su ritmo, Modernizar el core sin frenar el negocio. La primera conversación, sin costo, parte del mapa de sus integraciones y de los puntos donde un contrato o un core con ritmo limitado podrían costarle dinero, tiempo o evidencia. Escríbanos por WhatsApp.
Consultadas el 6-oct-2026. Las versiones y fechas de herramientas y de proyectos cambian; las marcadas [proveedor] son cifras o estados que publica el propio proveedor.
Referencias
- gRPC, Core concepts, architecture and lifecycle (Protobuf como IDL; cuatro tipos de llamada; orden dentro de una llamada;
DEADLINE_EXCEEDED). https://grpc.io/docs/what-is-grpc/core-concepts/ - gRPC, Deadlines (sin plazo por defecto; cancelación en el servidor; propagación). https://grpc.io/docs/guides/deadlines/
- gRPC, Status codes and their use in gRPC (catálogo de 17 códigos). https://grpc.io/docs/guides/status-codes/
- Microsoft Learn, Compare gRPC services with HTTP APIs (tabla comparativa; HTTP/2 no es exclusivo de gRPC; escenarios recomendados; límites en el navegador; gRPC-Web y transcoding; difusión masiva). https://learn.microsoft.com/en-us/aspnet/core/grpc/comparison?view=aspnetcore-10.0
- gRPC, gRPC-Web Basics (cliente generado, Envoy, CORS). https://grpc.io/docs/platforms/web/basics/
- grpc-web, README del repositorio (streaming del servidor solo en modo
grpcwebtext; streaming del cliente y bidireccional, sin soporte). https://github.com/grpc/grpc-web - Envoy, gRPC-JSON transcoder. https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/grpc_json_transcoder_filter
- Apache APISIX, plugin
grpc-transcode. https://apisix.apache.org/docs/apisix/plugins/grpc-transcode/ - Postman, gRPC request interface. https://learning.postman.com/docs/use/send-requests/protocols/grpc/grpc-request-interface/
- FullStory, grpcurl (versión 1.9.4 publicada el 31-ago-2026 según la API de GitHub) [proveedor]. https://github.com/fullstorydev/grpcurl/releases/tag/v1.9.4
- Kreya, Release notes (1.21.0, 31-ago-2026) [proveedor]. https://kreya.app/docs/release-notes/
- Kong, Insomnia: gRPC requests. https://developer.konghq.com/insomnia/grpc-requests/
- ktr0731, Evans (repositorio; último lanzamiento publicado en feb-2023, repositorio sin archivar). https://github.com/ktr0731/evans
- BloomRPC (repositorio archivado, solo lectura; último cambio en ene-2023). https://github.com/bloomrpc/bloomrpc
- Spring, Spring gRPC Reference y Releases (proyecto oficial; 1.0.0 del 4-dic-2025; 1.1.0 del 10-jun-2026 migra la autoconfiguración a Spring Boot 4.1.0; 1.1.1 del 21-ago-2026) [proveedor]. https://docs.spring.io/spring-grpc/reference/ · https://github.com/spring-projects/spring-grpc/releases
- Quarkus, gRPC y gRPC reference guide (servidor Vert.x recomendado; puerto compartido con
quarkus.grpc.server.use-separate-server=false); versiones deio.quarkus:quarkus-grpcsegún los metadatos de Maven Central (3.40.1 y 4.0.0.Beta1) [proveedor]. https://quarkus.io/guides/grpc/ · https://quarkus.io/guides/grpc-reference/ · https://repo1.maven.org/maven2/io/quarkus/quarkus-grpc/maven-metadata.xml - Protocol Buffers, Language Guide (proto3) (campos, números, reservas, enums,
oneof). https://protobuf.dev/programming-guides/proto3/ - Google Cloud, API Design Guide (REST y RPC; compatibilidad AIP-180; versiones AIP-185; mapeo HTTP para transcoding). https://docs.cloud.google.com/apis/design
- Microsoft Learn, Anti-Corruption Layer pattern (Azure Architecture Center; patrón descrito por Eric Evans en Domain-Driven Design). https://learn.microsoft.com/en-us/azure/architecture/patterns/anti-corruption-layer
- Microsoft Learn, Queue-Based Load Leveling pattern (cola entre el llamador y el servicio; no adecuada si se requiere respuesta síncrona de baja latencia; semántica de al menos una entrega, idempotencia, cola de mensajes fallidos, orden). https://learn.microsoft.com/en-us/azure/architecture/patterns/queue-based-load-leveling
- Modernizar el core sin frenar el negocio →
- Unificar su operación y sus canales →
- APIs listas para agentes de IA: qué necesita su sistema para que un agente lo use con control →
¿Su operación tiene estos desafíos?
¿Prefiere correo? Escríbanos a hola@habil.mx