Sistema bancario distribuido de alto rendimiento construido con arquitectura de microservicios
¿Por qué usar microservicios en lugar de un monolito?
Ventajas:
- Escalabilidad independiente: Escala solo los servicios que lo necesitan
- Despliegue independiente: Actualiza sin afectar todo el sistema
- Tecnología heterogénea: Usa el stack más adecuado para cada servicio
- Resiliencia: Fallas aisladas, no colapsa todo el sistema
- Equipos autónomos: Desarrollo y despliegue descentralizado
Desventajas:
- Mayor complejidad operacional
- Necesidad de herramientas de orquestación (Docker, Kubernetes)
- Debugging distribuido más complejo
¿Cómo funciona el Circuit Breaker?
El Circuit Breaker monitorea las peticiones a servicios externos:
-
CLOSED (Estado Normal):
- Todas las peticiones pasan normalmente
- Registra éxitos y fallos
-
OPEN (Servicio Caído):
- Se alcanza el umbral de fallos (50% en 10 peticiones)
- Peticiones fallan inmediatamente sin llamar al servicio
- Espera 10 segundos antes de intentar recuperación
-
HALF_OPEN (Prueba de Recuperación):
- Permite 3 peticiones de prueba
- Si tienen éxito → CLOSED
- Si fallan → OPEN
Beneficio: Evita sobrecargar servicios caídos y falla rápidamente
¿Es necesario usar Docker?
No es obligatorio, pero es altamente recomendado:
Sin Docker:
# Iniciar cada servicio manualmente
cd config-server && mvn spring-boot:run
cd eureka-server && mvn spring-boot:run
cd account-service && mvn spring-boot:runCon Docker:
# Un solo comando
docker-compose up -dVentajas de Docker:
- Entorno consistente (desarrollo = producción)
- Networking automático entre servicios
- Gestión de dependencias (PostgreSQL, Redis)
- Escalabilidad horizontal simple
¿Cómo agrego un nuevo microservicio?
Paso 1: Crear el módulo Maven
cd bank-microservices-cloud
mkdir customer-service
cd customer-service
# Copiar estructura de account-servicePaso 2: Configurar pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>Paso 3: Crear configuración en Config Server
# config-server/src/main/resources/config-repo/customer-service.yml
spring:
application:
name: customer-service
server:
port: 8082
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/Paso 4: Registrar en Eureka
@SpringBootApplication
@EnableDiscoveryClient
public class CustomerServiceApplication {
public static void main(String[] args) {
SpringApplication.run(CustomerServiceApplication.class, args);
}
}Paso 5: Agregar a Docker Compose
customer-service:
build: ./customer-service
ports:
- "8082:8082"
depends_on:
- config-server
- eureka-server¿Cómo funciona el API Gateway BFF con HTTPS y JWT?
Arquitectura del Gateway:
El API Gateway BFF (Backend For Frontend) centraliza todas las peticiones usando Spring Cloud Gateway Reactive:
- Puerto HTTPS: 8443 (certificado SSL auto-firmado)
- Autenticación: JWT centralizada mediante
GlobalFilter(sin Spring Security) - Enrutamiento: Basado en paths con Service Discovery vía Eureka
- Resiliencia: Circuit Breaker integrado en cada ruta
Flujo de Autenticación:
-
Login (endpoint público):
curl -k -X POST https://localhost:8443/api/auth/login \ -H "Content-Type: application/json" \ -d '{"username": "admin", "password": "admin123"}'
-
Respuesta con Token:
{ "token": "eyJhbGciOiJIUzI1NiJ9...", "username": "admin" } -
Uso del Token:
curl -k -X GET https://localhost:8443/api/customers \ -H "Authorization: Bearer {token}"
Componentes del Gateway:
-
JwtAuthenticationFilter(GlobalFilter con orden -100):- Valida tokens JWT en cada petición
- Rechaza con 401 si el token es inválido
- Agrega header
X-User-Idcon el username extraído - Rutas públicas:
/api/auth/login,/actuator/health,/swagger-ui
-
JwtTokenUtil:- Genera tokens con expiración de 24 horas
- Valida firma y expiración
- Extrae claims (username, roles)
- Secret key:
YourSuperSecretKeyForJWTTokenGeneration123456789
-
AuthController:- Login con usuarios hardcodeados:
admin/admin123(roles: ADMIN, USER)user/user123(rol: USER)
- Login con usuarios hardcodeados:
Configuración de Rutas:
spring:
cloud:
gateway:
routes:
- id: account-service-route
uri: lb://account-service
predicates:
- Path=/api/accounts/**
filters:
- name: CircuitBreaker
args:
name: accountServiceCircuitBreaker
fallbackUri: forward:/fallback
- id: customer-service-route
uri: lb://customer-service
predicates:
- Path=/api/customers/**
- id: transaction-service-route
uri: lb://transaction-service
predicates:
- Path=/api/transactions/**Certificado SSL:
- Keystore:
classpath:keystore/bank-bff.p12 - Password:
bankbff123 - Alias:
bank-bff - Tipo: PKCS12
Ventajas:
- ✅ Punto único de entrada (Single Entry Point)
- ✅ Autenticación centralizada (un solo lugar para JWT)
- ✅ HTTPS/TLS para todas las comunicaciones externas
- ✅ Service Discovery automático con Eureka
- ✅ Circuit Breaker para resiliencia
- ✅ Microservicios sin lógica de autenticación (confianza en BFF)
¿Cómo funciona la autenticación JWT?
Flujo de Autenticación:
-
Login:
POST /api/auth/login Body: { "username": "user1", "password": "password123" } -
Respuesta con Token:
{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "expiresAt": "2024-12-31T23:59:59Z" } -
Uso del Token:
GET /api/accounts Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Componentes:
JwtTokenProvider: Genera y valida tokensJwtAuthenticationFilter: Intercepta peticiones y valida tokensSecurityConfig: Define rutas protegidas
Expiración: Tokens válidos por 24 horas
¿Qué hacer si Eureka no muestra los servicios?
Checklist de Diagnóstico:
-
Verificar que Eureka esté corriendo:
curl http://localhost:8761 # Debe retornar la UI de Eureka -
Revisar logs del servicio:
docker logs account-service # Buscar: "DiscoveryClient_ACCOUNT-SERVICE" -
Verificar configuración:
eureka: client: service-url: defaultZone: http://eureka-server:8761/eureka/ fetch-registry: true register-with-eureka: true
-
Esperar el registro:
- Los servicios tardan ~30 segundos en aparecer
- Eureka tiene un mecanismo de caché
-
Revisar networking (Docker):
docker network inspect bank-microservices-cloud_default # Verificar que todos los servicios estén en la misma red
- ✅ Arquitectura de Microservicios
- ✅ API Gateway (BFF) con Spring Cloud Gateway
- ✅ HTTPS/TLS en puerto 8443 (certificado SSL)
- ✅ JWT Authentication centralizado en BFF (GlobalFilter)
- ✅ Config Server (Centralizado)
- ✅ Eureka Discovery Service
- ✅ Account Service (CRUD + CSV Migration + 11 endpoints legacy)
- ✅ Customer Service (CRUD completo - 8 endpoints)
- ✅ Transaction Service (CRUD completo - 8 endpoints)
- ✅ Patrones de Resiliencia (Resilience4j)
- ✅ PostgreSQL (3 bases de datos independientes)
- ✅ Containerización Docker
- ✅ Apache Kafka + Zookeeper + Kafka UI
- ✅ Event-Driven Architecture (Customer Events)
- ✅ Kafka Producer (Customer Service)
- ✅ Kafka Consumer (Transaction Service)
- ✅ Suite de Tests REST (test-all-endpoints.sh - 100% funcional)
- ✅ Suite de Tests Kafka (test-kafka.sh - 100% funcional)
- ✅ Spring Boot 3.5.0
- ✅ Spring Cloud 2024.0.0
- ✅ Java 21
-
🔄 Tracing Distribuido
- Micrometer Tracing
- Zipkin para visualización
- Correlación de requests entre servicios
-
🔄 Monitoreo Avanzado
- Prometheus para métricas
- Grafana dashboards
- Alertas automatizadas
-
🔄 Caché Distribuido
- Redis para sesiones
- Caché de consultas frecuentes
-
✅ Mensajería Asíncrona (Completado)
- ✅ Apache Kafka implementado
- ✅ Event-driven architecture
- ✅ Customer events (create, update, delete)
- ⏳ SAGA Pattern para transacciones distribuidas
- ⏳ Dead Letter Queue (DLQ)
- ⏳ Event Sourcing completo
-
⏳ Programación Reactiva
- Spring WebFlux
- Non-blocking I/O
- Backpressure handling
-
⏳ API GraphQL
- Consultas flexibles
- Reducción de overfetching
-
⏳ SAGA Pattern
- Transacciones distribuidas
- Compensación automática
-
⏳ Service Mesh
- Istio / Linkerd
- mTLS automático
- Observabilidad avanzada
-
⏳ Kubernetes
- Orquestación de contenedores
- Auto-scaling
- Self-healing
-
⏳ CI/CD
- GitHub Actions / GitLab CI
- Despliegue automatizado
- Tests de integración
Implementación completa del generador y validador de tokens JWT con firma HMAC-SHA256
Características:
- ✅ Generación de tokens JWT con expiración configurable (24h)
- ✅ Validación y verificación de firma
- ✅ Extracción de claims (username, roles)
- ✅ Manejo de excepciones de tokens inválidos/expirados
Filtro global en API Gateway BFF que intercepta y valida todas las peticiones
Características:
- ✅ Interceptación de peticiones HTTP en Spring Cloud Gateway
- ✅ Validación de token en header
Authorization: Bearer <token> - ✅ Exclusión de rutas públicas (
/auth/**,/actuator/**) - ✅ Respuesta 401 para tokens inválidos
Dockerfile con imagen Alpine Linux ultra-ligera para máxima eficiencia
Características:
- ✅ Imagen base:
eclipse-temurin:21-jre-alpine(solo JRE, no JDK) - ✅ Tamaño reducido: ~215 MB vs ~500 MB con JDK completo
- ✅ Variables de entorno configurables (
JAVA_OPTS) - ✅ Security: superficie de ataque mínima
Compilación exitosa de los 7 módulos del proyecto con Maven
Módulos compilados:
- ✅ bank-microservices-cloud (parent)
- ✅ config-server
- ✅ eureka-server
- ✅ api-gateway-bff
- ✅ account-service
- ✅ customer-service
- ✅ transaction-service
6 imágenes Docker optimizadas con Alpine Linux (180-653 MB cada una)
Imágenes generadas:
bank-microservices-cloud-config-server(565 MB)bank-microservices-cloud-eureka-server(591 MB)bank-microservices-cloud-api-gateway-bff(392 MB)bank-microservices-cloud-account-service(653 MB)bank-microservices-cloud-customer-service(480 MB)bank-microservices-cloud-transaction-service(480 MB)
Orquestación de 11 contenedores con dependencias y health checks
Servicios configurados:
- Infrastructure Layer: postgres, zookeeper, kafka, kafka-ui
- Spring Cloud Layer: config-server, eureka-server
- Microservices Layer: api-gateway-bff, account-service, customer-service, transaction-service
11 contenedores corriendo exitosamente, 10 con estado healthy
Estado de contenedores:
- ✅ 10 contenedores healthy (con health checks configurados)
⚠️ 1 contenedor running (api-gateway-bff - reactive gateway)- ✅ Todos los puertos mapeados correctamente
- ✅ Red
bank-networkfuncionando
Dashboard de Eureka mostrando los 5 microservicios registrados dinámicamente
Microservicios registrados:
- ✅ API-GATEWAY-BFF (puerto 8443) - HTTPS Gateway
- ✅ ACCOUNT-SERVICE (puerto 8081) - Gestión de cuentas
- ✅ CUSTOMER-SERVICE (puerto 8082) - Gestión de clientes
- ✅ TRANSACTION-SERVICE (puerto 8083) - Gestión de transacciones
- ✅ BATCH-SERVICE (puerto 8084) - Procesamiento por lotes
Interfaz de Kafka UI mostrando el cluster y topic de eventos de clientes
Configuración Kafka:
- ✅ Cluster: bank-cluster
- ✅ Topic: customer-created-events (3 partitions)
- ✅ Zookeeper: coordinación del cluster (puerto 2181)
- ✅ Kafka Broker: puerto 9092 (interno) y 29092 (externo)
- ✅ Kafka UI: interfaz web en puerto 8090
Suite de pruebas automatizadas de Kafka con 8/8 tests exitosos
Tests ejecutados:
- ✅ Verificación de contenedores Kafka (Zookeeper, Kafka, Kafka UI)
- ✅ Conectividad a Kafka UI (HTTP 200)
- ✅ Obtención de token JWT del BFF
- ✅ Creación de cliente de prueba (HTTP 201)
- ✅ Publicación de evento CustomerCreated
- ✅ Consumo de evento en Transaction Service
- ✅ Creación de 3 clientes adicionales
- ✅ Verificación de 4 eventos en total
Arquitectura Event-Driven:
- ✅ Producer: Customer Service publica eventos al crear clientes
- ✅ Consumer: Transaction Service escucha y procesa eventos
- ✅ Event:
CustomerCreatedEventcon datos completos del cliente - ✅ Asincronía: Desacoplamiento entre servicios
| Categoría | Evidencias | Estado |
|---|---|---|
| OAuth 2.0 | 2 evidencias (JwtUtil, JwtAuthenticationFilter) | ✅ Completado |
| Dockerización | 3 evidencias (Dockerfile, Build, Images) | ✅ Completado |
| Docker Compose | 4 evidencias (Config, Containers, Eureka, Kafka UI) | ✅ Completado |
| Kafka (Extra) | 1 evidencia (Tests automatizados) | ✅ Completado |
| Total | 10 evidencias | ✅ 100% Documentado |
- Spring Boot 3.5.x Documentation
- Spring Cloud 2024.0.x Documentation
- Resilience4j Official Guide
- Netflix Eureka Wiki
- Microservices Patterns - Chris Richardson
- The Twelve-Factor App
- Circuit Breaker Pattern - Martin Fowler
- SAGA Pattern Explained
- Descripción
- Arquitectura
- Componentes
- Modelo de Datos
- Stack Tecnológico
- Inicio Rápido
- Despliegue en AWS EC2
- Seguridad
- Patrones de Resiliencia
- Testing y Calidad
- Monitoreo y Observabilidad
- Preguntas Frecuentes (FAQ)
- Roadmap
- Evidencias del Proyecto
- Recursos y Referencias
- Estructura del Proyecto
- Patrones Implementados
- Despliegue en Producción
- Contribuciones
- Contacto
- Licencia
Plataforma empresarial de microservicios para gestión bancaria que implementa patrones avanzados de resiliencia, configuración centralizada, descubrimiento de servicios y seguridad distribuida mediante Spring Cloud y Resilience4j.
- ✅ Arquitectura de Microservicios escalable y distribuida
- ✅ API Gateway (BFF) con Spring Cloud Gateway Reactive
- ✅ HTTPS/TLS con certificado SSL auto-firmado (puerto 8443)
- ✅ Autenticación JWT Centralizada en API Gateway (sin Spring Security)
- ✅ Event-Driven Architecture con Apache Kafka
- ✅ Kafka UI para visualización de eventos en tiempo real (puerto 8090)
- ✅ 4 Microservicios de Negocio (Account, Customer, Transaction, Batch)
- ✅ 27 Endpoints Funcionales (11 Account + 8 Customer + 8 Transaction)
- ✅ Spring Batch para procesamiento de datos legacy y jobs programados
- ✅ Mensajería Asíncrona (Producer/Consumer con Spring Kafka)
- ✅ Configuración Centralizada con Spring Cloud Config
- ✅ Service Discovery con Netflix Eureka
- ✅ Patrones de Resiliencia (Circuit Breaker, Retry, Rate Limiting)
- ✅ Contenedorización con Docker y Docker Compose (11 contenedores)
- ✅ API RESTful documentada con Swagger/OpenAPI
- ✅ Monitoreo con Spring Actuator
- ✅ Bases de Datos Independientes por microservicio
- ✅ Suite de Tests Automatizada (REST + Kafka - 100% funcional)
┌─────────────────────────────────────────────────────────┐
│ API Gateway BFF (8443 HTTPS) │
│ JWT Authentication + Routing + Circuit Breaker │
└───────────────────────┬─────────────────────────────────┘
│
┌───────────────┴───────────────────────────┐
│ │
┌───────▼──────┐ ┌────────▼────────┐
│Config Server │ │ Eureka Server │
│ (8888) │ │ (8761) │
└──────────────┘ └────────┬────────┘
│
┌──────────────────────────┼──────────────────────┐
│ │ │
┌──────▼──────┐ ┌────────▼──────┐ ┌────▼────────┐ ┌─────▼──────┐
│ Account │ │ Customer │ │Transaction │ │ Batch │
│ Service │ │ Service │ │ Service │ │ Service │
│ (8081) │ │ (8082) │ │ (8083) │ │ (8084) │
└──────┬──────┘ └───────┬───────┘ └─────┬───────┘ └────┬───────┘
│ │ │ │
│ │ Kafka │ Kafka │ Spring
│ │ Producer │ Consumer │ Batch
│ │ │ │ Jobs
│ ┌──────▼───────────────▼──────────────▼──┐
│ │ Apache Kafka (9092) │
│ │ customer-created-events │
│ └──────┬─────────┬────────────┬──────────┘
│ │ │ │
│ ┌──────▼──┐ ┌───▼────────┐ │
│ │Zookeeper│ │ Kafka UI │ │
│ │ (2181) │ │ (8090) │ │
│ └─────────┘ └────────────┘ │
│ │
└────────────────────────┼───────────────────────┘
│
┌──────▼──────┐
│ PostgreSQL │
│ (5432) │
│ 4 Databases│
└─────────────┘
- Independencia de Servicios: Cada microservicio puede desplegarse independientemente
- Configuración Externalizada: Configuraciones centralizadas en Config Server
- Descubrimiento Dinámico: Registro automático de servicios en Eureka
- Resiliencia: Implementación de Circuit Breaker, Retry y Rate Limiting
- Seguridad Distribuida: Autenticación JWT en cada microservicio
Servidor de configuración centralizada
- Gestiona configuraciones de todos los microservicios
- Soporte para perfiles de ambiente (dev, prod)
- Actualización de configuración en tiempo real
Service Discovery y Service Registry
- Registro automático de microservicios
- Dashboard web para monitoreo
- Detección de servicios caídos (heartbeat)
- Balanceo de carga del lado del cliente
Microservicio de gestión bancaria
Características:
- API RESTful para operaciones CRUD de cuentas
- Procesamiento de datos legacy del sistema bancario
- Autenticación y autorización JWT
- Integración con PostgreSQL mediante JPA
- Documentación Swagger/OpenAPI
- Métricas y health checks con Actuator
Patrones de Resiliencia:
- Circuit Breaker (protección contra fallos en cascada)
- Retry (reintentos automáticos)
- Rate Limiter (control de tráfico: 10 req/s)
- Time Limiter (timeout en operaciones)
Microservicio de gestión de clientes
Características:
- API RESTful para gestión completa de clientes
- Validación de RUT único
- Estados de cliente (ACTIVE, INACTIVE, SUSPENDED, BLOCKED)
- Autenticación y autorización JWT
- Integración con PostgreSQL mediante JPA
- Métricas y health checks con Actuator
Endpoints Principales:
GET /api/customers- Listar todos los clientesGET /api/customers/{id}- Obtener cliente por IDGET /api/customers/rut/{rut}- Buscar por RUTGET /api/customers/email/{email}- Buscar por emailPOST /api/customers- Crear clientePUT /api/customers/{id}- Actualizar clienteDELETE /api/customers/{id}- Eliminar cliente
Patrones de Resiliencia:
- Circuit Breaker (protección contra fallos en cascada)
- Retry (reintentos automáticos con backoff exponencial)
- Rate Limiter (control de tráfico: 10 req/s)
- Time Limiter (timeout de 3 segundos)
Microservicio de gestión de transacciones bancarias
Características:
- API RESTful para procesamiento de transacciones
- Tipos: DEPOSIT, WITHDRAWAL, TRANSFER, PAYMENT, FEE
- Estados: PENDING, COMPLETED, FAILED, CANCELLED, REVERSED
- Autenticación y autorización JWT
- Integración con PostgreSQL mediante JPA
- Métricas y health checks con Actuator
Endpoints Principales:
GET /api/transactions- Listar todas las transaccionesGET /api/transactions/{id}- Obtener transacción por IDGET /api/transactions/account/{accountId}- Por cuentaGET /api/transactions/customer/{customerId}- Por clientePOST /api/transactions- Crear transacciónPUT /api/transactions/{id}- Actualizar transacciónDELETE /api/transactions/{id}- Eliminar transacción
Patrones de Resiliencia:
- Circuit Breaker (protección contra fallos en cascada)
- Retry (reintentos automáticos con backoff exponencial)
- Rate Limiter (control de tráfico: 10 req/s)
- Time Limiter (timeout de 3 segundos)
Microservicio de procesamiento por lotes con Spring Batch
Características:
- Migración de procesos COBOL legacy a Spring Batch
- Procesamiento masivo de transacciones bancarias
- Jobs configurables con steps y chunks
- Validación automática de datos
- Manejo de errores y reintentos
- Reportes de ejecución y métricas
Procesos Batch Implementados:
-
Validación de Transacciones Legacy (
validateTransactionsJob)- Lee transacciones desde archivo CSV legacy
- Valida formato y reglas de negocio
- Genera reporte de transacciones inválidas
- Chunk size: 100 registros
-
Carga de Cuentas Legacy (
loadLegacyAccountsJob)- Importa cuentas desde sistema COBOL
- Normaliza formatos de datos
- Valida integridad referencial
- Chunk size: 50 registros
-
Cálculo de Intereses Mensuales (
calculateInterestsJob)- Procesa todas las cuentas activas
- Aplica tasas según tipo de cuenta
- Genera movimientos de interés
- Ejecución programada: Último día del mes
Endpoints REST:
POST /batch/jobs/{jobName}- Ejecutar job manualmenteGET /batch/jobs- Listar todos los jobsGET /batch/jobs/{jobName}/executions- Historial de ejecucionesGET /batch/jobs/executions/{executionId}- Detalle de ejecución
Características Spring Batch:
- JobRepository para tracking de ejecuciones
- ItemReader/ItemProcessor/ItemWriter pattern
- Skip logic para errores no críticos
- Restart capability para jobs fallidos
- Listeners para logging y métricas
Ejemplo de Ejecución:
# Ejecutar job de validación
curl -X POST http://localhost:8084/batch/jobs/validateTransactionsJob
# Ver resultado
{
"jobId": 1,
"jobName": "validateTransactionsJob",
"status": "COMPLETED",
"startTime": "2025-10-11T10:00:00",
"endTime": "2025-10-11T10:05:30",
"exitCode": "COMPLETED",
"itemsRead": 1020,
"itemsProcessed": 1015,
"itemsWritten": 1015,
"skipCount": 5
}Migración Legacy:
- ✅ Reemplaza scripts COBOL batch nocturnos
- ✅ Procesamiento paralelo con partitioning
- ✅ Monitoreo en tiempo real vs. logs offline
- ✅ Rollback automático ante fallos
Sistema de mensajería distribuida para Event-Driven Architecture
Características:
- Event Streaming para comunicación asíncrona entre microservicios
- Arquitectura Pub/Sub de alto rendimiento
- Persistencia de eventos para auditoría
- Procesamiento de eventos en tiempo real
Componentes Kafka:
-
Zookeeper (Puerto 2181)
- Coordinación de cluster Kafka
- Gestión de metadatos
- Healthcheck:
cub zk-ready
-
Kafka Broker (Puertos 9092/29092)
- Broker principal de mensajes
- Auto-creación de topics habilitada
- Replication factor: 1 (desarrollo)
- Healthcheck:
cub kafka-ready
-
Kafka UI (Puerto 8090)
- Interfaz web para visualización de mensajes
- Monitoreo de topics y consumers
- Visualización de eventos en tiempo real
- Acceso:
http://localhost:8090
Topics Implementados:
customer-created-events(3 particiones)- Eventos de creación de clientes
- Producer: Customer Service
- Consumer: Transaction Service
- Formato: JSON con CustomerCreatedEvent
Flujo de Eventos:
┌──────────────────┐ ┌───────────────┐ ┌────────────────────┐
│ Customer Service │────────>│ Kafka Topic │────────>│Transaction Service │
│ (Producer) │ Publish │customer-created│Consume │ (Consumer) │
└──────────────────┘ │ -events │ └────────────────────┘
└───────────────┘
Event Schema (CustomerCreatedEvent):
{
"customerId": 123,
"rut": "12345678-9",
"firstName": "John",
"lastName": "Doe",
"email": "[email protected]",
"phone": "+56912345678",
"status": "ACTIVE",
"createdAt": "2025-10-06T21:18:41.350236046"
}Uso:
-
Verificar Kafka UI:
# Abrir en navegador open http://localhost:8090 -
Ver topics desde terminal:
docker exec -it bank-kafka kafka-topics \ --bootstrap-server localhost:9092 --list -
Consumir mensajes:
docker exec -it bank-kafka kafka-console-consumer \ --bootstrap-server localhost:9092 \ --topic customer-created-events \ --from-beginning -
Ver logs del consumer:
docker logs bank-transaction-service | grep "CustomerCreated"
Beneficios:
- ✅ Desacoplamiento: Servicios no dependen directamente entre sí
- ✅ Escalabilidad: Procesamiento asíncrono de eventos
- ✅ Auditoría: Todos los eventos quedan registrados
- ✅ Resiliencia: Eventos persistentes ante fallos
- ✅ Event Sourcing: Reconstrucción del estado desde eventos
Punto de entrada unificado (Opcional - Recomendado para producción)
- Enrutamiento inteligente de peticiones
- Autenticación centralizada
- Rate limiting global
- Logging y monitoreo centralizado
Cuentas Bancarias (accounts)
- Gestión completa de cuentas
- Tipos: Ahorros, Corriente, Nómina
- Control de saldos y estados
- Base de datos:
bankdb
Clientes (customers)
- Gestión de información de clientes
- Validación de RUT único
- Email único por cliente
- Estados: ACTIVE, INACTIVE, SUSPENDED, BLOCKED
- Base de datos:
customerdb
Transacciones (transactions)
- Registro de movimientos financieros
- Tipos: DEPOSIT, WITHDRAWAL, TRANSFER, PAYMENT, FEE
- Estados: PENDING, COMPLETED, FAILED, CANCELLED, REVERSED
- Relación con cuentas y clientes
- Base de datos:
transactiondb
Intereses (interests)
- Cálculo automático de intereses
- Aplicación mensual según tipo de cuenta
- Historial de aplicaciones
- Base de datos:
bankdb
Usuarios (users)
- Autenticación y autorización
- Roles: ADMIN, USER
- Gestión de credenciales JWT
- Base de datos: compartida
Basado en el dataset bank_legacy_data para procesamiento de información histórica.
| Tecnología | Versión | Propósito |
|---|---|---|
| Java | 21 | Lenguaje de programación |
| Spring Boot | 3.5.0 | Framework de aplicación |
| Spring Cloud | 2024.0.0 | Framework de microservicios |
| Spring Security | 6.x | Seguridad y autenticación |
| Spring Kafka | 3.3.6 | Integración con Apache Kafka |
| Resilience4j | 2.x | Patrones de resiliencia |
| Apache Kafka | 3.9.1 | Event Streaming Platform |
| Zookeeper | 7.5.0 | Coordinación de Kafka cluster |
| Kafka UI | Latest | Interfaz web para Kafka |
| PostgreSQL | 15+ | Base de datos relacional |
| Docker | Latest | Contenedorización |
| Maven | 3.8+ | Gestión de dependencias |
| Lombok | 1.18.34 | Reducción de boilerplate |
- JDK: 21 o superior
- Maven: 3.8 o superior
- Docker: 20.10 o superior
- Docker Compose: 2.0 o superior
# Clonar el repositorio
git clone https://github.com/RodrigoSanchezDev/bank-microservices-cloud.git
cd bank-microservices-cloud
# Construir y levantar todos los servicios
docker-compose up -d
# Verificar estado
docker-compose ps
# Ver logs
docker-compose logs -f
# Detener servicios
docker-compose down# 1. Compilar
mvn clean install -DskipTests
# 2. Iniciar Config Server (Terminal 1)
cd config-server && mvn spring-boot:run
# 3. Iniciar Eureka Server (Terminal 2)
cd eureka-server && mvn spring-boot:run
# 4. Iniciar Account Service (Terminal 3)
cd account-service && mvn spring-boot:run
# 5. Iniciar Customer Service (Terminal 4)
cd customer-service && mvn spring-boot:run
# 6. Iniciar Transaction Service (Terminal 5)
cd transaction-service && mvn spring-boot:runEspera ~60 segundos para que los servicios se registren.
Servicios Core:
- Config Server: http://localhost:8888/actuator/health
- Eureka Dashboard: http://localhost:8761
- API Gateway BFF: https://localhost:8443/actuator/health
Microservicios:
- Account Service: http://localhost:8081/actuator/health
- Customer Service: http://localhost:8082/actuator/health
- Transaction Service: http://localhost:8083/actuator/health
Mensajería y UI:
- Kafka UI: http://localhost:8090 (Visualización de eventos)
- Zookeeper: localhost:2181 (Coordinación Kafka)
- Kafka Broker: localhost:9092 (Interno), localhost:29092 (Externo)
Base de Datos:
- PostgreSQL: localhost:5432 (bankdb, customerdb, transactiondb)
Swagger UI:
- http://localhost:8081/swagger-ui.html (Account)
- http://localhost:8082/swagger-ui.html (Customer)
- http://localhost:8083/swagger-ui.html (Transaction)
http://localhost:8761
http://localhost:8888/account-service/default
Autenticación (Obtener JWT)
⚠️ IMPORTANTE: Todos los endpoints ahora están expuestos a través del API Gateway BFF en puerto 8443 (HTTPS)
# Login - Obtener JWT (usuario admin)
curl -k -X POST https://localhost:8443/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"username": "admin",
"password": "admin123"
}'
# Login - Obtener JWT (usuario regular)
curl -k -X POST https://localhost:8443/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"username": "user",
"password": "user123"
}'Respuesta:
{
"token": "eyJhbGciOiJIUzI1NiJ9...",
"username": "admin"
}# Listar cuentas
curl -k -X GET https://localhost:8443/api/accounts \
-H "Authorization: Bearer {token}"
# Crear cuenta
curl -k -X POST https://localhost:8443/api/accounts \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"accountNumber": "1234567890",
"accountHolder": "Juan Pérez",
"balance": 1000.00,
"accountType": "SAVINGS"
}'
# Obtener cuenta por ID
curl -k -X GET https://localhost:8443/api/accounts/{id} \
-H "Authorization: Bearer {token}"
# Account Legacy Endpoints (11 endpoints)
curl -k -X GET https://localhost:8443/api/accounts/legacy/transacciones \
-H "Authorization: Bearer {token}"
curl -k -X GET https://localhost:8443/api/accounts/legacy/intereses \
-H "Authorization: Bearer {token}"
curl -k -X GET https://localhost:8443/api/accounts/legacy/cuentas-anuales \
-H "Authorization: Bearer {token}"
curl -k -X GET https://localhost:8443/api/accounts/legacy/resumen-general \
-H "Authorization: Bearer {token}"Operaciones de Clientes (8 endpoints - requiere JWT)
# Listar todos los clientes
curl -k -X GET https://localhost:8443/api/customers \
-H "Authorization: Bearer {token}"
# Crear cliente
curl -k -X POST https://localhost:8443/api/customers \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"rut": "12345678-9",
"firstName": "Juan",
"lastName": "Pérez",
"email": "[email protected]",
"phone": "+56912345678",
"address": "Santiago, Chile",
"status": "ACTIVE"
}'
# Buscar por RUT
curl -k -X GET https://localhost:8443/api/customers/rut/12345678-9 \
-H "Authorization: Bearer {token}"
# Buscar por email
curl -k -X GET https://localhost:8443/api/customers/email/[email protected] \
-H "Authorization: Bearer {token}"
# Actualizar cliente
curl -k -X PUT https://localhost:8443/api/customers/{id} \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"firstName": "Juan Carlos",
"lastName": "Pérez González",
"status": "ACTIVE"
}'
# Eliminar cliente
curl -k -X DELETE https://localhost:8443/api/customers/{id} \
-H "Authorization: Bearer {token}"
# Health check
curl -k -X GET https://localhost:8443/api/customers/health \
-H "Authorization: Bearer {token}"Operaciones de Transacciones (8 endpoints - requiere JWT)
# Listar todas las transacciones
curl -k -X GET https://localhost:8443/api/transactions \
-H "Authorization: Bearer {token}"
# Crear transacción
curl -k -X POST https://localhost:8443/api/transactions \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"accountId": 1,
"customerId": 1,
"type": "DEPOSIT",
"amount": 50000.00,
"description": "Depósito inicial",
"status": "PENDING"
}'
# Buscar transacciones por cuenta
curl -k -X GET https://localhost:8443/api/transactions/account/{accountId} \
-H "Authorization: Bearer {token}"
# Buscar transacciones por cliente
curl -k -X GET https://localhost:8443/api/transactions/customer/{customerId} \
-H "Authorization: Bearer {token}"
# Actualizar transacción
curl -k -X PUT https://localhost:8443/api/transactions/{id} \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"status": "COMPLETED"
}'
# Eliminar transacción
curl -k -X DELETE https://localhost:8443/api/transactions/{id} \
-H "Authorization: Bearer {token}"
# Health check
curl -k -X GET https://localhost:8443/api/transactions/health \
-H "Authorization: Bearer {token}"El proyecto incluye dos scripts completos de tests:
Valida todos los 27 endpoints a través del API Gateway BFF con HTTPS y JWT.
# Ejecutar suite completa de tests
./test-all-endpoints.sh
# Ver logs en tiempo real
./test-all-endpoints.sh 2>&1 | tee test-results.logValida Event-Driven Architecture con Apache Kafka.
# Ejecutar tests de Kafka
./test-kafka.sh
# Resultado esperado:
# ✅ 4 clientes creados
# ✅ 4 eventos publicados a Kafka
# ✅ 4 eventos consumidos correctamente
# ✅ Kafka UI disponible en http://localhost:8090Qué valida:
- ✅ Contenedores Kafka, Zookeeper y Kafka UI están healthy
- ✅ Topic
customer-created-eventscreado con 3 particiones - ✅ Producer en Customer Service publica eventos
- ✅ Consumer en Transaction Service procesa eventos
- ✅ Kafka UI muestra mensajes en tiempo real
Verificación manual:
# Ver mensajes en Kafka UI
open http://localhost:8090
# Ver eventos desde terminal
docker exec -it bank-kafka kafka-console-consumer \
--bootstrap-server localhost:9092 \
--topic customer-created-events \
--from-beginning
# Ver logs del consumer
docker logs bank-transaction-service | grep "CustomerCreated"Account Service (11 endpoints legacy):
- ✅ GET
/api/accounts/legacy/transacciones- Lista transacciones válidas/inválidas - ✅ GET
/api/accounts/legacy/transacciones-validas- Solo transacciones válidas - ✅ GET
/api/accounts/legacy/transacciones-invalidas- Solo transacciones inválidas - ✅ GET
/api/accounts/legacy/intereses- Cálculos de intereses - ✅ GET
/api/accounts/legacy/intereses-validos- Intereses válidos - ✅ GET
/api/accounts/legacy/intereses-invalidos- Intereses inválidos - ✅ GET
/api/accounts/legacy/cuentas-anuales- Cuentas anuales - ✅ GET
/api/accounts/legacy/cuentas-validas- Cuentas válidas - ✅ GET
/api/accounts/legacy/cuentas-invalidas- Cuentas inválidas - ✅ GET
/api/accounts/legacy/resumen-general- Resumen completo - ✅ GET
/api/accounts/legacy/health- Health check
Customer Service (8 endpoints CRUD):
- ✅ GET
/api/customers- Listar todos los clientes - ✅ GET
/api/customers/{id}- Obtener cliente por ID - ✅ GET
/api/customers/rut/{rut}- Buscar por RUT - ✅ GET
/api/customers/email/{email}- Buscar por email - ✅ POST
/api/customers- Crear cliente - ✅ PUT
/api/customers/{id}- Actualizar cliente - ✅ DELETE
/api/customers/{id}- Eliminar cliente - ✅ GET
/api/customers/health- Health check
Transaction Service (8 endpoints CRUD):
- ✅ GET
/api/transactions- Listar todas las transacciones - ✅ GET
/api/transactions/{id}- Obtener transacción por ID - ✅ GET
/api/transactions/account/{accountId}- Transacciones por cuenta - ✅ GET
/api/transactions/customer/{customerId}- Transacciones por cliente - ✅ POST
/api/transactions- Crear transacción - ✅ PUT
/api/transactions/{id}- Actualizar transacción - ✅ DELETE
/api/transactions/{id}- Eliminar transacción - ✅ GET
/api/transactions/health- Health check
╔═══════════════════════════════════════════════════════╗
║ RESUMEN DE TESTS ║
╚═══════════════════════════════════════════════════════╝
Total de tests ejecutados: 17
Tests exitosos: 17
Tests fallidos: 0
✓ ¡Todos los tests pasaron exitosamente!
✓ BFF HTTPS funcionando correctamente
✓ JWT authentication funcionando
✓ Routing a microservicios funcionando
ℹ ENDPOINTS TOTALES DISPONIBLES:
- Account Service (Legacy): 11 endpoints
- Customer Service (CRUD): 8 endpoints
- Transaction Service (CRUD): 8 endpoints
Total: 27 endpoints expuestos a través del BFF
PUT http://localhost:8083/api/transactions/{id}
Authorization: Bearer {token}
Content-Type: application/json
{
"status": "COMPLETED",
"description": "Transacción completada exitosamente"
}
# Health check - Account Service
GET http://localhost:8081/actuator/health
# Health check - Customer Service
GET http://localhost:8082/actuator/health
# Health check - Transaction Service
GET http://localhost:8083/actuator/health
# Circuit Breaker estado
GET http://localhost:8081/actuator/health/circuitbreakers
GET http://localhost:8082/actuator/health/circuitbreakers
GET http://localhost:8083/actuator/health/circuitbreakers
# Métricas
GET http://localhost:8081/actuator/metrics
GET http://localhost:8082/actuator/metrics
GET http://localhost:8083/actuator/metricsEsta sección documenta el proceso completo de despliegue del proyecto en una instancia EC2 de AWS.
- Instancia EC2: Amazon Linux 2023, t2.large (8GB RAM recomendado)
- Acceso SSH: Llave .pem o .ppk convertida
- Security Groups: Configurados con los puertos necesarios
Si tienes una llave .ppk de PuTTY, necesitas convertirla:
# Instalar PuTTY tools (macOS)
brew install putty
# Convertir .ppk a .pem
puttygen backend3.ppk -O private-openssh -o backend3.pem
# Configurar permisos
chmod 400 backend3.pem
# Probar conexión
ssh -i backend3.pem ec2-user@<TU-IP-PUBLICA>Una vez conectado a EC2, actualizar el sistema:
# Actualizar paquetes
sudo dnf update -y
# Instalar utilidades
sudo dnf install -y git vim htop wget
# Verificar espacio en disco
df -h# Instalar Docker
sudo dnf install -y docker
# Habilitar y arrancar Docker
sudo systemctl enable docker
sudo systemctl start docker
# Agregar usuario al grupo docker
sudo usermod -aG docker ec2-user
# Verificar instalación
docker --version# Descargar Docker Compose v2.31.0
sudo curl -L "https://github.com/docker/compose/releases/download/v2.31.0/docker-compose-linux-x86_64" \
-o /usr/local/bin/docker-compose
# Dar permisos de ejecución
sudo chmod +x /usr/local/bin/docker-compose
# Verificar instalación
docker-compose --version# Instalar Amazon Corretto 21
sudo dnf install -y java-21-amazon-corretto java-21-amazon-corretto-devel
# Verificar instalación
java -version# Instalar Maven y Java 17 (requerido por Maven)
sudo dnf install -y maven java-17-amazon-corretto
# Verificar instalación
mvn -version# Crear directorios para logs y datos
mkdir -p ~/logs ~/data/postgres ~/data/kafka# 1. Crear tarball del proyecto (excluyendo archivos innecesarios)
cd ~/ruta/a/tu/proyecto
tar -czf bank-project.tar.gz \
--exclude='bank-microservices-cloud/target' \
--exclude='bank-microservices-cloud/*/target' \
--exclude='bank-microservices-cloud/.git' \
--exclude='bank-microservices-cloud/*.tar.gz' \
--exclude='bank-microservices-cloud/evidencias' \
--exclude='bank-microservices-cloud/*.pem' \
--exclude='bank-microservices-cloud/*.ppk' \
bank-microservices-cloud/
# 2. Transferir a EC2
scp -i backend3.pem bank-project.tar.gz ec2-user@<TU-IP-PUBLICA>:~/
# 3. Conectarse a EC2 y desempaquetar
ssh -i backend3.pem ec2-user@<TU-IP-PUBLICA>
cd ~
tar -xzf bank-project.tar.gz
cd bank-microservices-cloud# Dentro de EC2, en el directorio del proyecto
# Compilar con Maven usando Java 21
export JAVA_HOME=/usr/lib/jvm/java-21-amazon-corretto
mvn clean package -DskipTests
# Verificar que los JARs se generaron correctamente
ls -lh */target/*.jar | grep -v '.original'Deberías ver 7 JARs generados:
- ✅ account-service-1.0.0.jar (~87MB)
- ✅ api-gateway-bff-1.0.0.jar (~55MB)
- ✅ batch-service-1.0.0.jar (~76MB)
- ✅ config-server-1.0.0.jar (~43MB)
- ✅ customer-service-1.0.0.jar (~99MB)
- ✅ eureka-server-1.0.0.jar (~56MB)
- ✅ transaction-service-1.0.0.jar (~99MB)
- Ve a AWS Console → EC2 → Instances
- Selecciona tu instancia
- Tab "Security" → Click en el Security Group
- Click "Edit inbound rules"
- Agregar las siguientes reglas:
| Puerto | Tipo | Origen | Descripción |
|---|---|---|---|
| 22 | SSH | Mi IP | SSH (seguro) |
| 8443 | Custom TCP | 0.0.0.0/0 | BFF/API Gateway |
| 8081 | Custom TCP | 0.0.0.0/0 | Account Service |
| 8082 | Custom TCP | 0.0.0.0/0 | Customer Service |
| 8083 | Custom TCP | 0.0.0.0/0 | Transaction Service |
| 8084 | Custom TCP | 0.0.0.0/0 | Batch Service |
| 8761 | Custom TCP | 0.0.0.0/0 | Eureka Server |
| 8888 | Custom TCP | 0.0.0.0/0 | Config Server |
| 8090 | Custom TCP | 0.0.0.0/0 | Kafka UI |
| 5432 | Custom TCP | 0.0.0.0/0 | PostgreSQL |
| 9092 | Custom TCP | 0.0.0.0/0 | Kafka |
- Click "Save rules"
# Ejecutar desde tu Mac (requiere AWS CLI configurado)
cd bank-microservices-cloud
chmod +x configure-security-groups.sh
./configure-security-groups.sh📝 Nota: Si el script falla por falta de credenciales AWS, usa la Opción A (manual).
# IMPORTANTE: Desconectar y reconectar SSH para aplicar grupo docker
exit
ssh -i backend3.pem ec2-user@<TU-IP-PUBLICA>
# Navegar al proyecto
cd ~/bank-microservices-cloud
# Iniciar todos los servicios con Docker Compose
docker-compose up -d
# Verificar que todos los contenedores estén corriendo
docker-compose psEsperado: 11 contenedores en estado healthy:
- ✅ bank-config-server
- ✅ bank-eureka-server
- ✅ bank-postgres
- ✅ bank-zookeeper
- ✅ bank-kafka
- ✅ bank-kafka-ui
- ✅ bank-account-service
- ✅ bank-customer-service
- ✅ bank-transaction-service
- ✅ bank-batch-service
- ✅ bank-api-gateway-bff
Los servicios arrancan en el siguiente orden (espera ~5-7 minutos):
- Config Server (30 seg)
- Eureka Server (45 seg)
- PostgreSQL (15 seg)
- Zookeeper + Kafka (60 seg)
- Microservicios (90 seg cada uno)
- API Gateway BFF (último)
# Monitorear logs en tiempo real
docker-compose logs -f
# Ver logs de un servicio específico
docker-compose logs -f customer-service
# Verificar estado de salud cada 30 segundos
watch -n 30 'docker-compose ps'# Verificar API Gateway
curl -k https://localhost:8443/actuator/health
# Verificar Eureka (debe mostrar 5 servicios registrados)
curl -s http://localhost:8761/eureka/apps | grep '<app>' | wc -l
# Verificar Kafka UI
curl -s http://localhost:8090 | grep -q "Kafka" && echo "OK"URLs Públicas (reemplaza <TU-IP-PUBLICA> con tu IP de EC2):
- Eureka Dashboard:
http://<TU-IP-PUBLICA>:8761 - Kafka UI:
http://<TU-IP-PUBLICA>:8090 - Config Server:
http://<TU-IP-PUBLICA>:8888/actuator/health - API Gateway:
https://<TU-IP-PUBLICA>:8443/actuator/health
⚠️ Certificado SSL: El navegador mostrará advertencia porque el certificado es autofirmado. Click en "Avanzado" → "Continuar de todos modos".
El script test-evaluacion-final.sh valida todas las funcionalidades del sistema:
# Transferir script desde tu Mac
scp -i backend3.pem test-evaluacion-final.sh ec2-user@<TU-IP-PUBLICA>:~/bank-microservices-cloud/
# Conectarse a EC2
ssh -i backend3.pem ec2-user@<TU-IP-PUBLICA>
# Navegar al proyecto
cd ~/bank-microservices-cloud
# Dar permisos de ejecución
chmod +x test-evaluacion-final.sh
# Ejecutar todas las pruebas automáticamente
echo '8' | ./test-evaluacion-final.sh
# O ejecutar de forma interactiva
./test-evaluacion-final.shOpciones del Test:
- Parte 1: Migración de Procesos Batch (Spring Batch)
- Parte 2: Patrón Backend for Frontend (3 BFF)
- Parte 3: Microservicios Resilientes (Spring Cloud)
- Parte 4: Seguridad Distribuida (OAuth2/JWT)
- Parte 5: Mensajería Asíncrona (Kafka)
- Parte 6: Containerización (Docker)
- Resumen Ejecutivo Completo
- Ejecutar TODAS las pruebas (Demo completa) ⭐
- Ver estadísticas finales
# Ver estado de contenedores
docker-compose ps
# Ver logs de todos los servicios
docker-compose logs -f
# Reiniciar un servicio específico
docker-compose restart customer-service
# Detener todos los servicios
docker-compose down
# Limpiar y reiniciar desde cero
docker-compose down -v
docker system prune -f
docker-compose up -d --build
# Ver uso de recursos
docker stats
# Verificar espacio en disco
df -h
# Verificar memoria
free -h# Solución: Reiniciar Docker
sudo systemctl restart docker
sudo systemctl status docker# Ver logs detallados
docker-compose logs -f NOMBRE_SERVICIO
# Inspeccionar contenedor
docker inspect NOMBRE_CONTENEDOR
# Reiniciar el contenedor
docker-compose restart NOMBRE_SERVICIO# Ver qué proceso usa el puerto
sudo netstat -tlnp | grep :8081
# Matar el proceso
sudo kill -9 <PID># Crear archivo swap de 2GB
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# Verificar
free -h# Esperar 2-3 minutos más (los servicios tardan en registrarse)
# Verificar logs de Eureka
docker-compose logs -f eureka-server
# Verificar logs del microservicio
docker-compose logs -f customer-serviceRecursos consumidos por la aplicación completa:
- CPU: ~30-40% en t2.large
- RAM: ~4-5 GB de 8 GB disponibles
- Disco: ~2 GB (imágenes Docker + JARs)
- Tiempo de inicio completo: 5-7 minutos
Número de contenedores: 11
- 3 servicios de infraestructura (Config, Eureka, Postgres)
- 3 servicios de mensajería (Zookeeper, Kafka, Kafka UI)
- 4 microservicios de negocio
- 1 API Gateway BFF
Capturar pantallas de:
- Eureka Dashboard mostrando 5 servicios registrados
- Kafka UI mostrando topics y eventos
- Docker PS con 11 contenedores healthy
- Logs de microservicios funcionando
- Postman/curl ejecutando requests exitosamente
- AWS Console con Security Groups configurados
- Test de evaluación final completado con éxito
| Paso | Acción | Tiempo Estimado |
|---|---|---|
| 1 | Preparar EC2 (instalar Docker, Java, Maven) | 10-15 min |
| 2 | Transferir proyecto | 2-3 min |
| 3 | Compilar con Maven | 3-5 min |
| 4 | Configurar Security Groups | 3-5 min |
| 5 | Iniciar servicios con Docker Compose | 5-7 min |
| 6 | Verificar y probar | 5-10 min |
| TOTAL | De proyecto local a producción | 30-45 min |
Configuración:
- Algoritmo: HS512
- Tiempo de vida: 24 horas
- Claims: username, roles, authorities
Credenciales por Defecto:
- Username:
admin - Password:
admin123 - Rol:
ADMIN
- ✅ Todos los endpoints bajo
/api/accountsrequieren autenticación - ✅ Endpoints administrativos requieren rol
ADMIN - ✅ Endpoints de lectura disponibles para rol
USER - ❌ Endpoints públicos:
/api/auth/login,/actuator/health
Configuración:
slidingWindowSize: 10
failureRateThreshold: 50
waitDurationInOpenState: 10s
permittedNumberOfCallsInHalfOpenState: 3Estados:
- CLOSED: Operación normal, todas las peticiones pasan
- OPEN: Umbral alcanzado, peticiones fallan rápidamente
- HALF_OPEN: Prueba si el servicio se recuperó
Configuración:
maxAttempts: 3
waitDuration: 2s
retryExceptions:
- java.io.IOException
- java.util.concurrent.TimeoutExceptionEstrategia: Exponential backoff con jitter
Configuración:
limitForPeriod: 10
limitRefreshPeriod: 1m
timeoutDuration: 0Protección: Límite de 10 peticiones por minuto por endpoint
Configuración:
timeoutDuration: 5s
cancelRunningFuture: trueObjetivo: Prevenir operaciones de larga duración
# Ejecutar tests unitarios
mvn clean test
# Tests de un módulo específico
cd account-service && mvn test
# Reporte de cobertura
mvn clean test jacoco:reportPara una verificación integral del sistema con interfaz interactiva:
# Dar permisos de ejecución
chmod +x test-evaluacion-final.sh
# Ejecutar menú interactivo
./test-evaluacion-final.shIncluye 22 tests organizados en 6 categorías:
- ✅ Migración de Procesos Batch (4 tests)
- ✅ Patrón BFF Multi-Canal (5 tests)
- ✅ Microservicios Resilientes (3 tests)
- ✅ Seguridad Distribuida JWT/HTTPS (3 tests)
- ✅ Mensajería Asíncrona Kafka (3 tests)
- ✅ Containerización Docker (4 tests)
Ver GUIA-RAPIDA-USO.md para más detalles.
Importa postman-collection.json para probar todos los endpoints.
Account Service:
# Health check
curl http://localhost:8081/actuator/health
# Métricas
curl http://localhost:8081/actuator/metrics
# Info
curl http://localhost:8081/actuator/info
# Circuit Breaker
curl http://localhost:8081/actuator/health/circuitbreakersCustomer Service:
# Health check
curl http://localhost:8082/actuator/health
# Métricas
curl http://localhost:8082/actuator/metrics
# Circuit Breaker
curl http://localhost:8082/actuator/health/circuitbreakersTransaction Service:
# Health check
curl http://localhost:8083/actuator/health
# Métricas
curl http://localhost:8083/actuator/metrics
# Circuit Breaker
curl http://localhost:8083/actuator/health/circuitbreakers# Ver todos los servicios registrados
curl http://localhost:8761/eureka/apps
# Ver servicio específico
curl http://localhost:8761/eureka/apps/ACCOUNT-SERVICE
curl http://localhost:8761/eureka/apps/CUSTOMER-SERVICE
curl http://localhost:8761/eureka/apps/TRANSACTION-SERVICEbank-microservices-cloud/
├── config-server/ # Configuración centralizada
│ └── src/main/resources/
│ └── config-repo/ # Configuraciones de servicios
│ ├── account-service.yml
│ ├── customer-service.yml
│ └── transaction-service.yml
├── eureka-server/ # Service Discovery
├── account-service/ # Microservicio de cuentas
│ ├── src/main/java/
│ │ └── com/duoc/bank/account/
│ │ ├── config/ # Configuración
│ │ ├── controller/ # REST Controllers
│ │ ├── dto/ # Data Transfer Objects
│ │ ├── model/ # Entidades JPA
│ │ ├── repository/ # Repositorios
│ │ ├── security/ # JWT Security
│ │ └── service/ # Lógica de negocio
│ └── src/main/resources/
│ ├── application.yml
│ └── data/ # Datos legacy CSV
├── customer-service/ # Microservicio de clientes
│ ├── src/main/java/
│ │ └── com/duoc/bank/customer/
│ │ ├── controller/ # REST Controllers
│ │ ├── model/ # Entidad Customer
│ │ ├── repository/ # CustomerRepository
│ │ ├── security/ # JWT Security
│ │ └── service/ # CustomerService
│ └── src/main/resources/
│ └── application.yml
├── transaction-service/ # Microservicio de transacciones
│ ├── src/main/java/
│ │ └── com/duoc/bank/transaction/
│ │ ├── controller/ # REST Controllers
│ │ ├── model/ # Entidad Transaction
│ │ ├── repository/ # TransactionRepository
│ │ ├── security/ # JWT Security
│ │ └── service/ # TransactionService
│ └── src/main/resources/
│ └── application.yml
├── docker-compose.yml
├── pom.xml
├── LICENSE
└── README.md
- ✅ Configuración Centralizada (Spring Cloud Config)
- ✅ Service Discovery (Netflix Eureka)
- ✅ Circuit Breaker (Resilience4j)
- ✅ Retry Pattern (Resilience4j)
- ✅ Rate Limiting (Resilience4j)
- ✅ Time Limiter (Resilience4j)
- ✅ Authentication & Authorization (Spring Security + JWT)
- ✅ API Gateway Pattern (Routing centralizado)
Config Server:
SPRING_PROFILES_ACTIVE=prod
CONFIG_GIT_URI=https://github.com/your-org/config-repo.git
CONFIG_GIT_USERNAME=your-username
CONFIG_GIT_PASSWORD=your-tokenEureka Server:
SPRING_PROFILES_ACTIVE=prod
EUREKA_INSTANCE_HOSTNAME=eureka-prod.yourdomain.com
EUREKA_CLIENT_REGISTER_WITH_EUREKA=falseAccount Service:
SPRING_PROFILES_ACTIVE=prod
SPRING_DATASOURCE_URL=jdbc:postgresql://prod-db.yourdomain.com:5432/bankdb
SPRING_DATASOURCE_USERNAME=${DB_USERNAME}
SPRING_DATASOURCE_PASSWORD=${DB_PASSWORD}
JWT_SECRET=${JWT_SECRET_KEY}
EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://eureka-prod.yourdomain.com:8761/eureka/Customer Service:
SPRING_PROFILES_ACTIVE=prod
SPRING_DATASOURCE_URL=jdbc:postgresql://prod-db.yourdomain.com:5432/customerdb
SPRING_DATASOURCE_USERNAME=${DB_USERNAME}
SPRING_DATASOURCE_PASSWORD=${DB_PASSWORD}
JWT_SECRET=${JWT_SECRET_KEY}
EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://eureka-prod.yourdomain.com:8761/eureka/Transaction Service:
SPRING_PROFILES_ACTIVE=prod
SPRING_DATASOURCE_URL=jdbc:postgresql://prod-db.yourdomain.com:5432/transactiondb
SPRING_DATASOURCE_USERNAME=${DB_USERNAME}
SPRING_DATASOURCE_PASSWORD=${DB_PASSWORD}
JWT_SECRET=${JWT_SECRET_KEY}
EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://eureka-prod.yourdomain.com:8761/eureka/Seguridad:
- Cambiar credenciales por defecto (admin/admin123)
- Configurar JWT secret fuerte (mínimo 256 bits)
- Habilitar HTTPS/TLS en todos los servicios
- Configurar CORS apropiadamente
- Revisar roles y permisos de usuarios
- Implementar rate limiting agresivo
Base de Datos:
- Backups automáticos configurados
- Índices en columnas de búsqueda frecuente
- Pools de conexiones optimizados
- Logging de queries lentas activado
Configuración:
- Profiles de producción activados
- Timeouts configurados apropiadamente
- Circuit breaker thresholds ajustados
- Retry strategies validadas
Monitoreo:
- Actuator endpoints asegurados
- APM configurado (New Relic, Datadog, etc.)
- Logging centralizado (ELK, Splunk)
- Alertas configuradas (PagerDuty, Slack)
Infraestructura:
- Auto-scaling configurado
- Load balancers en lugar
- Health checks configurados
- Disaster recovery plan documentado
Optimización de Imágenes:
# Multi-stage build para reducir tamaño
FROM eclipse-temurin:21-jdk-alpine AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8081
ENTRYPOINT ["java", "-Xmx512m", "-Xms256m", "-jar", "app.jar"]Docker Compose Production:
services:
account-service:
image: registry.yourdomain.com/account-service:1.0.0
environment:
- SPRING_PROFILES_ACTIVE=prod
- JAVA_OPTS=-Xmx1g -Xms512m
deploy:
replicas: 3
resources:
limits:
cpus: "1"
memory: 1G
reservations:
cpus: "0.5"
memory: 512M
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8081/actuator/health"]
interval: 30s
timeout: 10s
retries: 3Docker Compose Scale:
# Escalar Account Service a 3 instancias
docker-compose up -d --scale account-service=3
# Escalar Customer Service a 2 instancias
docker-compose up -d --scale customer-service=2
# Escalar Transaction Service a 3 instancias
docker-compose up -d --scale transaction-service=3
# Escalar todos los servicios
docker-compose up -d --scale account-service=3 --scale customer-service=2 --scale transaction-service=3Kubernetes (futuro):
apiVersion: apps/v1
kind: Deployment
metadata:
name: account-service
spec:
replicas: 3
selector:
matchLabels:
app: account-service
template:
metadata:
labels:
app: account-service
spec:
containers:
- name: account-service
image: account-service:1.0.0
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1000m"Las contribuciones son bienvenidas. Por favor:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Rodrigo Sanchez
- Email: [email protected]
- Website: sanchezdev.com
- GitHub: @RodrigoSanchezDev
Este proyecto está licenciado bajo la Licencia MIT - ver el archivo LICENSE para más detalles.
Desarrollado por Rodrigo Sanchez
Copyright © 2025 Rodrigo Sanchez. Todos los derechos reservados.









