Módulo 13: Spring Cloud y Microservicios
🎯 Objetivos del Módulo
Al finalizar este módulo, usted será capaz de:
- ✅ Comprender la arquitectura de microservicios vs monolítica
- ✅ Configurar un Service Discovery con Eureka
- ✅ Centralizar la configuración con Spring Cloud Config
- ✅ Crear una API Gateway con Spring Cloud Gateway
- ✅ Implementar la comunicación entre servicios con Feign
- ✅ Aplicar patrones de resiliencia con Resilience4j
- ✅ Comprender los patrones: Circuit Breaker, Retry, Rate Limiter
📋 Prerrequisitos
Antes de comenzar este módulo, asegúrese de dominar:
- ✅ Módulo 1-6: Fundamentos de Spring Boot y Spring Data JPA
- ✅ Módulo 7: Transacciones y configuración
- ✅ Módulo 8: Spring Security (para asegurar los servicios)
- ✅ Módulo 12: Docker y despliegue (para orquestar los servicios)
- ✅ Conceptos de REST API
- ✅ Docker y Docker Compose (¡esencial!)
🏗️ Arquitectura del Módulo
📚 Plan del Módulo
Capítulos Teóricos
| # | Capítulo | Duración | Descripción |
|---|---|---|---|
| 1 | Introducción a los Microservicios | 45 min | Monolito vs Microservicios, patrones, 12-Factor App |
| 2 | Service Discovery - Eureka | 1h | Eureka Server/Client, Load Balancing |
| 3 | Configuración Centralizada | 1h | Spring Cloud Config, backend Git, Refresh |
| 4 | API Gateway | 1h15 | Spring Cloud Gateway, Rutas, Filtros |
| 5 | Comunicación entre Servicios | 1h30 | Feign, Resilience4j, Circuit Breaker |
Trabajos Prácticos
| # | TP | Duración | Descripción |
|---|---|---|---|
| 1 | Eureka Server y Clientes | 1h30 | Crear el registro de servicios |
| 2 | Config Server | 1h | Configuración centralizada Git |
| 3 | API Gateway | 1h30 | Gateway con routing y filters |
| 4 | Feign + Resilience4j | 2h | Comunicación resiliente |
Duración total estimada: ~12 horas
🎬 Antes / Después de este Módulo
❌ ANTES (Arquitectura Monolítica)
┌─────────────────────────────────────────────┐
│ MONOLITH APPLICATION │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Users │ │Products │ │ Orders │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ SINGLE DATABASE │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────────┘
Problèmes:
- Un bug = toute l'app down
- Scaling: tout ou rien
- Déploiement: tout redéployer
- Technologies: une seule stack
- Équipes: conflits de merge
✅ DESPUÉS (Arquitectura de Microservicios)
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Users │ │ Products │ │ Orders │
│ Service │ │ Service │ │ Service │
│ :8081 │ │ :8082 │ │ :8083 │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
│ ┌─────────┴─────────┐ │
└────┤ Eureka Server ├────┘
│ :8761 │
└─────────┬─────────┘
│
┌─────────┴─────────┐
│ API Gateway │
│ :8080 │
└───────────────────┘
Ventajas:
- Aislamiento de fallos
- Escalado independiente
- Despliegue continuo
- Polyglot (Java, Node, Python...)
- Equipos autónomos
🧩 Componentes de Spring Cloud
🏢 Caso de Uso: Microservicios E-Commerce
A lo largo de este módulo, construiremos una plataforma de e-commerce:
Servicios a Crear
| Servicio | Responsabilidad | Puerto | Base de datos |
|---|---|---|---|
| eureka-server | Registro de servicios | 8761 | - |
| config-server | Configuración centralizada | 8888 | Repositorio Git |
| api-gateway | Punto de entrada único | 8080 | - |
| user-service | Gestión de usuarios | 8081 | PostgreSQL |
| product-service | Catálogo de productos | 8082 | PostgreSQL |
| order-service | Gestión de pedidos | 8083 | PostgreSQL |
| inventory-service | Stock de productos | 8084 | PostgreSQL |
| notification-service | Emails/SMS | 8085 | - |
Flujo de un Pedido
🔑 Conceptos Clave
1. Service Discovery (¿Por qué?)
Sin Service Discovery:
- URLs hardcodeadas: http://192.168.1.10:8081
- Si el servicio se mueve → todo falla
- Load balancing manual
Con Eureka:
- Los servicios se registran: "Soy user-service"
- Los clientes preguntan: "¿Dónde está user-service?"
- Eureka responde con todas las instancias
- Load balancing automático
2. Configuración Centralizada (¿Por qué?)
Sin Config Server:
- Cada servicio tiene su application.properties
- Cambiar una contraseña de BD = modificar 10 archivos
- Re-desplegar todos los servicios
Con Config Server:
- Configuración en Git
- Un solo lugar para modificar
- Refresh sin reinicio
- Encriptación de secretos
3. API Gateway (¿Por qué?)
Sin Gateway:
- El cliente conoce todos los servicios
- CORS a gestionar en todas partes
- Auth a implementar en todas partes
- Rate limiting imposible
Con Gateway:
- Punto de entrada único
- Autenticación centralizada
- Rate limiting
- Logging centralizado
- Transformación de requests/responses
4. Circuit Breaker (¿Por qué?)
Sin Circuit Breaker:
- Servicio A llama a Servicio B
- Servicio B está caído
- Servicio A espera... timeout
- Falla en cascada → todo caído
Con Circuit Breaker:
- Detecta los fallos
- "Abre" el circuito
- Devuelve fallback inmediato
- "Cierra" cuando B vuelve
📦 Stack Técnico
Dependencias Maven (BOM)
<!-- Dans le parent POM -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Versiones Compatibles
| Spring Boot | Spring Cloud | Java |
|---|---|---|
| 3.2.x | 2023.0.x (Leyton) | 17+ |
| 3.1.x | 2022.0.x (Kilburn) | 17+ |
| 3.0.x | 2022.0.x (Kilburn) | 17+ |
⚠️ ¿Cuándo Usar Microservicios?
✅ Buenas Razones
- Aplicación grande con múltiples equipos
- Necesidad de escalado diferente por componente
- Dominios de negocio bien definidos (Bounded Contexts)
- Necesidad de resiliencia (aislamiento de fallos)
- Despliegues frecuentes e independientes
❌ Malas Razones
- "Está de moda"
- Proyecto pequeño / equipo pequeño
- MVP / Prototipo
- Equipo sin experiencia DevOps
- Infraestructura limitada
💡 Regla de Oro
"Si usted no tiene los problemas de un monolito, no necesita microservicios."
— Martin Fowler
🗺️ Progresión del Módulo
🚀 ¿Listo para Comenzar?
Este módulo es avanzado y requiere un buen dominio de los módulos anteriores. Si está listo:
- Instale Docker (esencial para este módulo)
- Asegúrese de tener 16GB+ de RAM (varios servicios)
- Prepare un IDE con soporte para Spring (se recomienda IntelliJ)
Comenzar el Capítulo 1: Introducción a los Microservicios →