API Gateway: Punto de Entrada Único para Microservicios
Un API Gateway es un servicio que actúa como puerta de entrada centralizada para todas las peticiones de clientes externos. Recibe las llamadas HTTP, las enruta al microservicio correcto según la URL o cabeceras, y aplica preocupaciones transversales como autenticación, rate limiting, logging, transformación de headers y balanceo de carga.
En una línea spring.cloud.gateway.routes[0].uri=http://servicio-pedidos:8080
spring.cloud.gateway.routes[0].predicates[0]=Path=/api/v1/pedidos/**
spring:
cloud:
gateway:
default-filters:
- AddResponseHeader=X-Content-Type-Options, nosniff
routes:
- id: tareas
uri: http://tareas-service:8080
predicates:
- Path=/api/tareas/**
filters:
- name: CircuitBreaker
args:
name: tareas
fallbackUri: forward:/fallback/tareas
- id: usuarios-v2
uri: http://usuarios-service-v2:8080
predicates:
- Path=/api/v2/usuarios/**
filters:
- StripPrefix=2 # /api/v2/usuarios/7 -> /usuarios/7
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 20
redis-rate-limiter.burstCapacity: 40
Cómo funciona por dentro
Un API Gateway es el único punto de entrada de los clientes externos a un conjunto de servicios. Recibe todas las peticiones y las encamina al servicio adecuado según la ruta, el método o las cabeceras. Así los clientes no conocen la topología interna, que puede cambiar sin afectarles.
Además del enrutamiento, concentra preocupaciones transversales que no conviene repetir en cada servicio: terminación TLS, validación de tokens, limitación de peticiones (rate limiting), CORS, cabeceras de seguridad, registro de accesos, propagación del id de correlación y, a veces, agregación de respuestas para un cliente concreto (patrón Backend for Frontend).
Como todo el tráfico pasa por él, debe desplegarse con alta disponibilidad (varias instancias tras un balanceador) y mantenerse ligero. Si se convierte en un lugar donde cada equipo añade lógica, pasa a ser un cuello de botella organizativo y técnico.
Se conecta con Spring Cloud GatewayKongEnvoyIngress de Kubernetes