API Gateway
Concepto y Función
Un API Gateway actúa como un punto de entrada único para todos los clientes en una arquitectura de microservicios. Funciona como una capa intermedia que recibe todas las peticiones de los clientes y las reenvía a los servicios apropiados, abstrayendo la complejidad interna de la arquitectura para los consumidores de la API.
Beneficios del API Gateway
- Punto de Entrada Único: Simplifica el acceso a los microservicios a través de una interfaz unificada.
- Enrutamiento Inteligente: Dirige las peticiones a los servicios correctos basándose en reglas configurables.
- Funcionalidades Transversales (Cross-Cutting Concerns): Centraliza funcionalidades como autenticación, autorización, limitación de tasa (rate limiting) y registro de logs (logging).
- Transformación de Datos: Puede modificar peticiones y respuestas para la compatibilidad entre el cliente y los servicios.
- Balanceo de Carga: Distribuye el tráfico entre múltiples instancias de servicios.
- Caché: Almacena respuestas frecuentes para reducir la latencia y la carga en los servicios.
- Monitoreo: Proporciona visibilidad centralizada sobre todas las llamadas a la API.
Arquitectura del API Gateway en el Proyecto
Implementación con Nginx
En la fase inicial del proyecto, utilizamos Nginx como API Gateway debido a su eficiencia, bajo consumo de recursos y facilidad de configuración para proxy inverso.
Configuración Básica de Nginx
server {
listen 80;
# User Management Service
location /users {
proxy_pass http://usermanagement:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# Feedback Request Service
location /requests {
proxy_pass http://feedbackrequest:8082;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# Feedback Response Service
location /responses {
proxy_pass http://feedbackresponse:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# Feedback Response View Service
location /responsesview {
proxy_pass http://feedbackresponseview:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
rewrite ^/responsesview(/.*)$ $1 break;
}
}
Evolución a un Gateway con Node.js Express
En el Sprint 4, evolucionaremos el API Gateway a una implementación basada en Node.js Express, que ofrecerá mayor flexibilidad y capacidades programáticas para:
- Autenticación Avanzada: Validación y renovación de tokens JWT.
- Autorización Contextual: Decisiones de acceso basadas en los claims del token y el contexto de la petición.
- Transformación de Datos: Modificación de peticiones y respuestas según sea necesario.
- Logging Estructurado: Registro detallado de todas las transacciones para auditoría y depuración.
- Circuit Breaking: Prevención de fallos en cascada entre servicios.
- Métricas y Monitoreo: Recolección de datos de rendimiento y uso en tiempo real.
Arquitectura del Gateway con Express
Implementación en Docker Compose
Para implementar el Gateway con Node.js Express, será necesario reemplazar el servicio de Nginx en el archivo docker-compose.yml:
# Configuración actual (Nginx)
nginx:
image: nginx:alpine
volumes:
- ./gateway/nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- "80:80"
depends_on:
- usermanagement
- feedbackrequest
- feedbackresponse
- feedbackresponseview
# Nueva configuración (Node.js Express)
gateway:
build:
context: ./node_backend
args:
APP_NAME: api_gateway
environment:
- JWT_SECRET_KEY=4Z^XrroxR@dWxqf$!@#qGr4P
- JWT_ISSUER=user-api
- LOG_LEVEL=info
- RATE_LIMIT_WINDOW=15m
- RATE_LIMIT_MAX=100
ports:
- "80:80"
depends_on:
- usermanagement
- feedbackrequest
- feedbackresponse
- feedbackresponseview
Consideraciones de Seguridad
- HTTPS: En producción, configurar TLS/SSL para todas las comunicaciones.
- Limitación de Tasa (Rate Limiting): Implementar límites de peticiones para prevenir ataques de DoS.
- Validación de Entrada: Filtrar y sanear los parámetros de entrada para prevenir inyecciones.
- Encabezados de Seguridad: Configurar encabezados como CORS, Content-Security-Policy y X-XSS-Protection.
- Monitoreo de Seguridad: Implementar la detección de patrones de tráfico sospechosos.
Próximos Pasos
- Implementación de Caché: Añadir caché de respuestas para mejorar el rendimiento.
- Documentación de API: Integrar Swagger/OpenAPI para la documentación automática.
- Versionado de API: Implementar una estrategia de versionado para una evolución segura.
- Analítica: Recolectar métricas de uso para obtener insights de negocio.
- Descubrimiento de Servicios (Service Discovery): Integrar con herramientas de descubrimiento de servicios para un enrutamiento dinámico.