Crea Microservicios Escalables con Spring Boot, Docker y PostgreSQL

Crea Microservicios Escalables con Spring Boot, Docker y PostgreSQL

Tutorial microservicios Spring Boot: construye un sistema completo con Java, Docker, Eureka, API Gateway y JWT

Meta title: Tutorial microservicios Spring Boot con Java, Docker, Eureka, API Gateway y JWT

Meta description: Guía paso a paso para crear microservicios con Java y Spring Boot: JPA con PostgreSQL, OpenFeign, RabbitMQ, Eureka, Spring Cloud Gateway, seguridad JWT, Docker y Testcontainers.

URL slug: tutorial-microservicios-spring-boot-java-docker-eureka-api-gateway-jwt

1. Introducción: objetivos y requisitos previos

En este tutorial microservicios Spring Boot construirás, paso a paso, una arquitectura moderna de microservicios con Java. Implementaremos dos servicios (catálogo y pedidos), persistencia con Spring Data JPA y PostgreSQL, documentación OpenAPI/Swagger, comunicación sincrónica con OpenFeign (y RestTemplate), mensajería RabbitMQ (opcional), service discovery con Eureka, API Gateway con Spring Cloud Gateway, seguridad con Spring Security y JWT, contenedorización con Docker y orquestación con docker-compose. Además, veremos pruebas unitarias y de integración con JUnit 5 y Testcontainers y observabilidad básica con Spring Boot Actuator.

Objetivos:

  • Crear y ejecutar microservicios con Java usando Spring Boot.
  • Integrar PostgreSQL, validación, DTOs, mapeo y manejo global de errores.
  • Documentar APIs con OpenAPI/Swagger.
  • Comunicar servicios con OpenFeign y, opcionalmente, RabbitMQ.
  • Registrar servicios con Eureka y enrutar con Spring Cloud Gateway.
  • Proteger endpoints con Spring Security JWT.
  • Probar con JUnit 5 y Testcontainers.
  • Empaquetar y levantar todo con Docker y docker-compose.

Requisitos previos:

  • Conocimientos básicos de Java, HTTP/REST y SQL.
  • Sistema operativo macOS, Linux o Windows.
  • Permisos para instalar software.

Checklist de esta sección:

  • [ ] Comprendes el alcance del tutorial microservicios Spring Boot.
  • [ ] Tienes nociones básicas de Java y Spring.

2. Instalación: JDK 17, Maven/Gradle y Docker

  • Instala JDK 17 (Temurin u OpenJDK). Verifica:

  • Instala Maven (o Gradle). Verifica:

  • Instala Docker Desktop o Docker Engine + docker-compose. Verifica:

Checklist:

  • [ ] JDK 17 instalado.
  • [ ] Maven o Gradle funcional.
  • [ ] Docker y docker-compose operativos.

3. Crear proyectos con Spring Initializr

Crearemos 5 módulos:

  • eureka-server
  • api-gateway
  • catalog-service
  • order-service
  • common (opcional, para DTOs compartidos)

Usa start.spring.io (Spring Initializr) o curl.

Dependencias recomendadas por módulo:

  • eureka-server: Spring Cloud Netflix Eureka Server, Actuator.
  • api-gateway: Spring Cloud Gateway, Eureka Discovery Client, Actuator, Spring Security.
  • catalog-service: Spring Web, Spring Data JPA, PostgreSQL Driver, Validation, OpenFeign, Actuator, Spring Security, Springdoc OpenAPI.
  • order-service: Spring Web, Spring Data JPA, PostgreSQL Driver, Validation, OpenFeign, Actuator, Spring Security, Springdoc OpenAPI, Spring for RabbitMQ (opcional).
  • common (opcional): Lombok, Validation.

Ejemplo con Maven (catálogo):

Checklist:

  • [ ] Creaste los módulos con dependencias correctas.
  • [ ] Compilan con mvn clean package.

4. Estructura de paquetes recomendada

Ejemplo para catalog-service:

Checklist:

  • [ ] Separas dominio, servicio y web.
  • [ ] Preparas carpetas para DTOs, mapeo y errores.

5. Configuración base y perfiles

application.yml (catálogo) con perfiles dev y docker, Eureka, Actuator y JWT.

Explicación: definimos datasource para PostgreSQL, exponemos Actuator, habilitamos descubrimiento en Eureka y separamos configuración para contenedores.

Checklist:

  • [ ] application.yml con perfiles y Eureka.
  • [ ] Actuator expuesto para observabilidad.

6. Microservicio de Catálogo: entidades, DTOs, validación y API REST

Entidad y repositorio:

DTOs y mapeo manual:

Servicio y controlador con validación Bean Validation:

Checklist:

  • [ ] Entidad, repositorio y servicio creados.
  • [ ] DTOs, validación y mapeo funcionando.
  • [ ] Manejo global de errores con @ControllerAdvice.

7. Microservicio de Pedidos: dominio, comunicación con catálogo y API REST

Entidad, ítems y repositorios:

Feign Client para consultar catálogo:

Servicio de pedidos:

Controlador y DTO simple:

Opcional: RestTemplate como fallback para Feign en casos simples.

Checklist:

  • [ ] Dominio de pedidos creado.
  • [ ] Comunicación sincrónica con OpenFeign funcionando.

8. OpenAPI/Swagger con springdoc-openapi

Agrega dependencia en los servicios:

Accede a /swagger-ui.html para ver la documentación generada automáticamente.

Checklist:

  • [ ] Swagger UI accesible.

9. Mensajería asíncrona (opcional) con RabbitMQ

Publica un evento al crear pedido:

Configura exchange/queue/binding (simplificado) y llama publisher.orderCreated(o.getId()) tras guardar el pedido.

Checklist:

  • [ ] RabbitMQ instalado y variables configuradas.
  • [ ] Evento emitido al crear pedido.

10. Service Discovery con Eureka y API Gateway con Spring Cloud Gateway

Eureka Server aplicación y configuración:

Gateway con rutas basadas en Eureka:

Checklist:

  • [ ] Eureka server corriendo en 8761.
  • [ ] Gateway enruta a servicios vía lb://.

11. Seguridad con Spring Security y JWT

Dependencias ya incluidas. Implementamos un filtro JWT simple y un endpoint de login.

Prueba: obtiene token via POST /auth/login y úsalo en Authorization: Bearer .

Checklist:

  • [ ] Filtro JWT activo y /auth/login operativo.
  • [ ] Endpoints protegidos.

12. Pruebas unitarias e integración (JUnit 5 y Testcontainers)

Prueba unitaria de ProductService con Mockito:

Integración con Testcontainers para PostgreSQL:

Checklist:

  • [ ] Pruebas unitarias ejecutan.
  • [ ] Testcontainers levanta PostgreSQL efímero.

13. Contenerización: Dockerfiles y docker-compose

Dockerfile genérico para servicios Spring Boot (Maven):

docker-compose.yml con PostgreSQL, RabbitMQ, Eureka, Gateway y servicios:

Explicación: usamos perfiles docker, services conectados por red default de compose y Eureka para descubrimiento. Gateway expone 8080.

Comandos útiles:

Checklist:

  • [ ] Dockerfiles creados para cada servicio.
  • [ ] docker-compose levanta toda la plataforma.

14. Observabilidad básica con Spring Boot Actuator

  • Endpoints: /actuator/health, /actuator/info, /actuator/metrics.
  • Agrega info adicional en application.yml si lo deseas:

Checklist:

  • [ ] Health y métricas expuestas y protegidas según necesidad.

15. Resolución de problemas comunes (Troubleshooting)

  • Error de conexión a PostgreSQL: verifica URL, usuario y password; en docker-compose usa el host postgres y perfil docker.
  • No se registran servicios en Eureka: confirma EUREKACLIENTSERVICEURL_DEFAULTZONE y clock skew del sistema.
  • 401 Unauthorized al consumir API: agrega Authorization: Bearer y verifica secret/exp.
  • Swagger no carga: asegura springdoc dependency y rutas públicas en Security.
  • Fallan tests con Testcontainers en Windows: habilita WSL2 o Docker Desktop y aumenta memoria si es necesario.
  • Feign 404: revisa path exacto del endpoint en catalog-service y el context-path.
  • Gateway 503: espera a que Eureka registre instancias (unos segundos) y usa retries si aplica.

16. Buenas prácticas y próximos pasos

Buenas prácticas:

  • Mantén contratos claros con DTOs y versiona tus APIs (v1, v2…).
  • Centraliza errores con @ControllerAdvice y mensajes consistentes.
  • Evita lógica en controladores; usa servicios y repositorios bien definidos.
  • En producción, externaliza configuración (Spring Cloud Config, Vault).
  • Observabilidad: añade tracing (Sleuth/Micrometer/OTel), logs estructurados y dashboards.
  • Seguridad: almacena secretos en variables seguras, rota llaves JWT y usa HTTPS.
  • Resiliencia: timeouts, retries y circuit breakers (Resilience4j) para OpenFeign.
  • Base de datos: migraciones con Flyway o Liquibase.

Próximos pasos:

  • Añade un microservicio de usuarios y roles con almacenamiento real.
  • Implementa idempotencia para pedidos y compensaciones con mensajería.
  • Despliegue en Kubernetes con Helm/ArgoCD y observabilidad con Prometheus/Grafana.

17. FAQ (orientado a featured snippets)

  • ¿Qué es un microservicio en Spring Boot? Es una aplicación pequeña y autónoma que expone APIs y se despliega de forma independiente, comúnmente comunicándose via HTTP o mensajería.
  • ¿Cómo documentar APIs en Spring Boot? Con springdoc-openapi: agrega la dependencia y accede a /swagger-ui.html.
  • ¿Cómo asegurar APIs con JWT en Spring Security? Implementa un filtro que valide el token en cada request y protege rutas por roles.
  • ¿Qué es Spring Cloud Gateway? Un API Gateway reactivo que enruta peticiones a microservicios usando rutas y filtros, integrado con Eureka.
  • ¿Cómo usar OpenFeign? Declara interfaces con @FeignClient y anota métodos con rutas HTTP; Spring las implementa y gestiona balanceo con Eureka.
  • ¿Para qué sirve Testcontainers? Para ejecutar dependencias reales (como PostgreSQL) en contenedores durante tests de integración.
  • ¿Cómo desplegar con Docker? Crea Dockerfiles por servicio y orquesta con docker-compose; configura perfiles docker en application.yml.

Comandos de verificación rápidos:

  • Generar token: curl -X POST http://localhost:8080/auth/login -H ‘Content-Type: application/json’ -d ‘{“username”:”admin”,”password”:”admin”}’
  • Listar productos (con token): curl http://localhost:8080/api/v1/products -H “Authorization: Bearer
  • Crear pedido: curl -X POST http://localhost:8080/api/v1/orders -H “Authorization: Bearer ” -H ‘Content-Type: application/json’ -d ‘{“items”:[{“productId”:1,”quantity”:2}]}’