Microservicios con Spring Boot 3, Spring Cloud, Docker y Kubernetes

Microservicios con Spring Boot 3, Spring Cloud, Docker y Kubernetes

Tutorial Spring Boot microservicios de calidad producción con Java 21, Spring Boot 3 y Spring Cloud

Bienvenido a este tutorial Spring Boot microservicios. Aprenderás a diseñar, construir y desplegar un sistema de microservicios listo para producción usando Java 21, Spring Boot 3, Spring Cloud y herramientas modernas como Spring Cloud Gateway, Eureka Service Discovery, JWT Spring Security, Docker Spring Boot, Kubernetes Spring Boot, Testcontainers Spring y OpenAPI springdoc.


1) Requisitos previos e instalación

  • Java 21 (Temurin o Zulu)
  • Maven o Gradle
  • Docker y Docker Compose
  • Git
  • cURL o HTTPie
  • Postman/Insomnia (opcional)
  • kubectl y Kind/Minikube (opcional)

Comandos de verificación

Explicación: Asegúrate de tener versiones recientes y compatibles. Java 21 es requerido para las capacidades de rendimiento y seguridad modernas.

Checklist:

  • [ ] Java 21 instalado
  • [ ] Maven/Gradle operativo
  • [ ] Docker + Compose listos
  • [ ] Git y cURL/HTTPie disponibles
  • [ ] kubectl/Minikube (si vas a Kubernetes)

2) Arquitectura y módulos

Diagrama lógico:

Patrón de comunicación:

  • Sincrónico REST: OpenFeign entre servicios, resiliencia con Resilience4j.
  • Mensajería opcional (Kafka/RabbitMQ) para eventos y desacoplo.

Checklist:

  • [ ] Definiste módulos y responsabilidades
  • [ ] Comunicación principal REST + resiliencia
  • [ ] Consideraste eventos para notificaciones

3) Inicialización de proyectos

Usa Spring Initializr (web o CLI) por módulo. Dependencias clave:

  • Spring Web, Actuator, Spring Security, Spring Data JPA, PostgreSQL Driver
  • OpenFeign, Spring Cloud Config, Eureka Client, Spring Cloud Gateway
  • Validation, Lombok, springdoc-openapi-starter-webmvc-ui
  • Resilience4j, Micrometer, Prometheus

Estructura del repo (sugerida)

Explicación: Cada módulo es un servicio independiente. common-libs agrupa DTOs y errores compartidos.

Ejemplo de pom.xml (catalog-service)

Explicación: Incluimos JPA, OpenFeign, Eureka Client, springdoc-openapi, Resilience4j, Prometheus, Flyway y Resource Server para validar JWT.

Checklist:

  • [ ] Módulos creados con Initializr
  • [ ] Dependencias alineadas con objetivos
  • [ ] Estructura de paquetes clara (com.acme.catalog, etc.)

4) Configuración centralizada (config-server)

application.yml (config-server)

Explicación: Servidor Config lee propiedades desde un repo Git local o remoto.

bootstrap.yml en cada servicio

Explicación: bootstrap.yml arranca temprano y obtiene configuración externa desde config-server.

config-repo/application-dev.yml

Explicación: Config común para dev. Puedes crear application-test.yml y application-prod.yml con credenciales seguras.

Checklist:

  • [ ] config-server ejecuta y sirve propiedades
  • [ ] Servicios tienen bootstrap.yml
  • [ ] Perfiles dev/test/prod en config-repo

5) Service discovery y gateway

service-registry (Eureka) application.yml

Explicación: Modo servidor Eureka. Los clientes se registrarán aquí.

api-gateway application.yml (Spring Cloud Gateway)

Explicación: Rutas por servicio por nombre lógico vía Eureka (lb://). Filtros globales de CORS, logging y reintentos configurados.

Checklist:

  • [ ] Eureka server en 8761
  • [ ] Servicios registrados como clientes
  • [ ] Gateway enruta y aplica CORS y reintentos

6) Seguridad y autenticación (auth-service, JWT RS256)

SecurityConfig.java (auth-service)

Explicación: Endpoints públicos de autenticación y OpenAPI. Resto requiere autenticación.

JwtService.java (RS256)

Explicación: Genera tokens access (15 min) y refresh (24 h) firmados con RS256. Carga de claves PEM.

AuthController.java

Explicación: Registro, login y refresh. Al registrar, usamos BCrypt; al loguear, generamos ambos tokens.

Validación de JWT en gateway y servicios

Explicación: Gateway y servicios actúan como Resource Servers validando tokens con clave pública RS256.

Buenas prácticas:

  • BCrypt para contraseñas.
  • Expiraciones cortas en access token.
  • Rotación de claves y almacenamiento en Secret.

Checklist:

  • [ ] Endpoints /auth funcionando
  • [ ] Validación JWT en gateway y servicios
  • [ ] BCrypt configurado

7) Persistencia y dominio (catalog y order)

Entidad Product (catalog-service)

Explicación: Modelo básico de producto con precio y stock.

Repositorio y servicio

Explicación: Filtros dinámicos con Specification y paginación.

Controlador

Explicación: Endpoint paginado y filtrado.

Flyway V1__init.sql

Explicación: Migración inicial de catálogo.

Order y OrderItem (order-service)

Explicación: Relación 1-N con cascada para persistir ítems.

Servicio transaccional

Explicación: Transacción atómica para crear órdenes.

Checklist:

  • [ ] Entidades y migraciones Flyway creadas
  • [ ] Paginación y filtros
  • [ ] Transacciones en casos de uso críticos

8) Comunicación entre servicios y resiliencia

Cliente OpenFeign (order consulta precios en catalog)

Explicación: Llama a catalog-service por service discovery.

Configuración Feign y Resilience4j

Explicación: Timeouts de Feign y circuit breaker + retry para resiliencia.

Checklist:

  • [ ] OpenFeign configurado con timeouts
  • [ ] Resilience4j con circuit breakers y retries

9) Manejo de errores y DTOs (common-libs)

ProblemDetails (RFC 7807)

Explicación: Estructura estándar de errores.

ControllerAdvice global

Explicación: Respuestas uniformes ante errores de validación.

Checklist:

  • [ ] DTOs compartidos y errores estándar
  • [ ] ControllerAdvice aplicado en servicios

10) Documentación: OpenAPI springdoc

Explicación: springdoc-openapi expone /v3/api-docs y Swagger UI por servicio. En el gateway, enlaza a los UIs de cada servicio.

Checklist:

  • [ ] OpenAPI expuesto por servicio
  • [ ] Enlaces accesibles desde el gateway

11) Observabilidad y salud

Actuator y Prometheus

Explicación: Activa endpoints de salud y métricas para Prometheus.

Opcional: OpenTelemetry (OTLP)

Explicación: Exporta trazas a un colector OTLP (Jaeger/Tempo).

Checklist:

  • [ ] /actuator/health y /actuator/prometheus disponibles
  • [ ] Trazas si usas OpenTelemetry

12) Pruebas (JUnit 5, Mockito, Testcontainers Spring)

Testcontainers para repositorio

Explicación: Levanta PostgreSQL efímero y prueba persistencia real.

Prueba de controlador con SpringBootTest + WebTestClient

Explicación: Prueba endpoint HTTP real.

Checklist:

  • [ ] Testcontainers configurado
  • [ ] Pruebas unitarias e integración

13) Contenedorización: Docker Spring Boot

Dockerfile multi-stage (catalog-service)

Explicación: Construcción en una imagen y ejecución ligera con Temurin JRE.

.dockerignore

Explicación: Evita copiar artefactos innecesarios.

docker-compose.yml (servicios + PostgreSQL + Prometheus opcional)

Explicación: Orquesta microservicios, bases de datos y gateway. Ajusta puertos según tus yml.

Comandos:

Explicación: Construye e inicia el entorno completo en segundo plano.

Checklist:

  • [ ] Imágenes construidas
  • [ ] Servicios arrancan sin errores
  • [ ] Healthchecks OK

14) Despliegue en Kubernetes (opcional pero recomendado)

ConfigMap y Secret (gateway)

Explicación: ConfigMap para propiedades y Secret para claves públicas.

Deployment y Service (gateway)

Explicación: Escala a 2 réplicas y define probes para salud.

Ingress

Explicación: Expone el gateway vía Ingress. Configura DNS o /etc/hosts.

Comandos:

Checklist:

  • [ ] ConfigMaps/Secrets creados
  • [ ] Deployments con probes
  • [ ] Ingress operativo

15) Rendimiento y buenas prácticas

  • HikariCP: ajusta pool (minIdle, maxPoolSize) según carga.
  • GC Java 21: G1 por defecto; ajusta MaxRAMPercentage.
  • GZIP en gateway: habilita compresión.
  • Cache HTTP: usa ETag y Cache-Control para GET.
  • Hibernate: batchfetchsize, second-level cache si aplica.

Ejemplo Hikari:

Explicación: Evita saturación de conexiones manteniendo latencia estable.

Checklist:

  • [ ] Pool ajustado
  • [ ] Compresión y cache activas
  • [ ] Hibernate afinado

16) CI/CD básico (GitHub Actions)

Explicación: Compila, ejecuta tests (incluidos Testcontainers) y construye/push imágenes a GHCR.

Checklist:

  • [ ] Pipeline compila y prueba
  • [ ] Imágenes versionadas por commit

17) Probar el flujo end-to-end

Comandos cURL/HTTPie:

Explicación: Flujo básico de autenticación y consumo de APIs a través del gateway.


Resolución de problemas comunes

  • Puertos ocupados: cambia server.port o mapea otros puertos en docker-compose.yml.
  • Variables .env faltantes: define SPRINGPROFILESACTIVE y credenciales en env o Secrets.
  • Flyway falla: revisa compatibilidad de esquemas y orden de migraciones; limpia BD en dev.
  • Certificados JWT: asegúrate de que gateway/servicios usan la misma clave pública que auth-service.
  • Servicios no se registran en Eureka: verifica eureka.client.serviceUrl y conectividad, reloj del sistema y nombres de servicio.
  • Timeouts Feign: aumenta Request.Options o agrega retries con Resilience4j.

Conclusión y llamada a la acción

Has creado un sistema de microservicios robusto con Spring Boot 3 y Spring Cloud: configuración centralizada, discovery, gateway, seguridad JWT, persistencia con PostgreSQL, documentación OpenAPI, observabilidad y despliegue en Docker y Kubernetes. Próximos pasos: añade mensajería con Kafka (notificaciones), patrones Saga/Orquestación para consistencia distribuida y tracing con Jaeger/Tempo.

¿Listo para llevarlo a producción? Crea tu repo, habilita CI/CD y despliega en tu clúster Kubernetes.


Checklist global

  • [ ] Configuración centralizada con config-server y Git
  • [ ] Service discovery con Eureka Service Discovery
  • [ ] API Gateway con Spring Cloud Gateway (CORS, retry, gzip)
  • [ ] Autenticación con JWT Spring Security (RS256, access/refresh)
  • [ ] Servicios catalog y order con JPA, Flyway y PostgreSQL
  • [ ] OpenFeign + Resilience4j
  • [ ] Manejo de errores RFC 7807 y DTOs comunes
  • [ ] OpenAPI springdoc en cada servicio
  • [ ] Actuator + Prometheus + logs/tracing
  • [ ] Tests con Testcontainers Spring
  • [ ] Docker Spring Boot y docker-compose
  • [ ] Manifiestos Kubernetes Spring Boot (Deploy/Service/Ingress)
  • [ ] CI/CD con GitHub Actions