API Gateway es el punto de entrada único para todos los microservicios del sistema BusConnect. Implementado con Spring Cloud Gateway, proporciona enrutamiento, balanceo de carga, circuit breakers y gestión de CORS para toda la arquitectura de microservicios.
Este gateway utiliza una arquitectura reactiva basada en Spring WebFlux y actúa como:
- Punto de entrada único: Todas las peticiones externas pasan por el gateway
- Enrutador inteligente: Distribuye las peticiones a los microservicios correspondientes
- Balanceador de carga: Utiliza Eureka para descubrimiento de servicios y load balancing
- Protección con Circuit Breaker: Implementa Resilience4j para tolerancia a fallos
- Gestión de CORS: Configuración centralizada de políticas CORS
- Spring Boot: 3.3.13
- Spring Cloud Gateway: Enrutamiento reactivo
- Spring Cloud Netflix Eureka Client: Service Discovery
- Resilience4j: Circuit Breaker pattern
- Spring Boot Actuator: Health checks y métricas
- Lombok: Reducción de código boilerplate
| Variable | Descripción | Valor por Defecto |
|---|---|---|
EUREKA_CLIENT_SERVICEURL_DEFAULTZONE |
URL del servidor Eureka | http://localhost:8761/eureka/ |
- Puerto del servicio:
8080 - Eureka Server:
8761
GET/POST/PUT/DELETE /api/catalog/**
- Target:
CATALOG-SERVICE(descubierto vía Eureka) - Reescritura:
/api/catalog/routes→/routes - Circuit Breaker:
catalogServiceCircuitBreaker - Fallback:
/fallback/catalog
GET/POST/PUT/DELETE /api/users/**
- Target:
USER-SERVICE(descubierto vía Eureka) - Reescritura:
/api/users/profile→/profile - Circuit Breaker:
userServiceCircuitBreaker - Fallback:
/fallback/users
Configuración de Resilience4j para cada servicio:
- Sliding Window: 10 llamadas
- Failure Rate Threshold: 50%
- Wait Duration (Open State): 10s
- Timeout: 10s- CLOSED: Funcionamiento normal
- OPEN: Circuito abierto tras superar el umbral de fallos
- HALF_OPEN: Permite llamadas de prueba para verificar recuperación
CORS configurado globalmente para permitir:
- Orígenes permitidos:
http://localhost:3000(React)http://localhost:4200(Angular)http://localhost:5173(Vite)
- Métodos: GET, POST, PUT, DELETE, PATCH, OPTIONS
- Headers: Todos (*)
- Credentials: Habilitadas
- Max Age: 3600s (1 hora)
- Health:
/actuator/health - Info:
/actuator/info - Gateway Routes:
/actuator/gateway/routes - Metrics:
/actuator/metrics
curl http://localhost:8080/actuator/gateway/routesdocker build -t busconnect/api-gateway:latest .environment:
- EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=http://eureka-service:8761/eureka/# Opción 1: Maven
mvn spring-boot:run
# Opción 2: Java
mvn clean package
java -jar target/api-gateway-0.0.1-SNAPSHOT.jardocker-compose up api-gatewaydocker logs -f api-gateway- Spring Cloud Gateway: DEBUG
- Reactor Netty: INFO
api-gateway/
├── src/
│ └── main/
│ ├── java/
│ │ └── com/busconnect/apigateway/
│ │ ├── ApiGatewayApplication.java
│ │ ├── config/
│ │ │ └── GatewayConfig.java
│ │ └── controller/
│ │ └── FallbackController.java
│ └── resources/
│ └── application.yml
├── Dockerfile
├── pom.xml
└── README.md
# Health check
curl http://localhost:8080/actuator/health
# Probar ruta de catalog
curl http://localhost:8080/api/catalog/routes
# Probar ruta de users
curl http://localhost:8080/api/users/1# Ver métricas del circuit breaker
curl http://localhost:8080/actuator/metrics/resilience4j.circuitbreaker.state- ✅ Sin exposición directa de microservicios
- ✅ Circuit breakers para prevenir cascadas de fallos
- ✅ Timeouts configurados (10s)
- ✅ CORS configurado apropiadamente
- ✅ Health checks habilitados
- Autenticación y autorización con JWT
- Rate limiting
- Request/Response logging
- API versioning
- Request validation
<dependencies>
<!-- Spring Cloud Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Eureka Client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Circuit Breaker -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
<!-- Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>El gateway se registra automáticamente en Eureka al iniciar:
eureka:
client:
register-with-eureka: true
fetch-registry: trueLas URIs de los servicios se resuelven dinámicamente:
uri: lb://CATALOG-SERVICE # Load balanced
uri: lb://USER-SERVICE # Load balanced- Verificar que Eureka esté corriendo
- Verificar que los servicios estén registrados en Eureka
- Revisar logs del gateway:
docker logs api-gateway
- Verificar la salud del servicio downstream
- Revisar logs del servicio afectado
- Esperar el tiempo de recuperación (10s)
- Verificar la configuración de
allowedOrigins - Asegurar que las credenciales estén habilitadas si es necesario
- Revisar headers en la petición del cliente
Para más información sobre la arquitectura general del proyecto, consultar el README principal.
Este proyecto es parte del sistema BusConnect.