Cómo diseño microservicios en Java con Spring
Esta guía describe la arquitectura que utilizo para construir plataformas basadas en microservicios usando Spring Boot, enfocadas en dominios del sector público y productos SaaS.
1. Principios base
- Dominios delimitados (DDD): cada servicio encapsula un contexto de negocio.
- Autonomía: ciclo de vida independiente (deploy, escala, datos).
- Comunicación explícita: contratos versionados, descubrimiento y observabilidad.
- Defensa en profundidad: seguridad, validaciones, circuit breakers, tracing.
2. Modelo de referencia
├── gateway (API Gateway, edge security)
├── auth-service
├── catalog-service
├── orders-service
├── notifications-service
└── platform-infra (config, discovery, tracing)
- Cada servicio es un proyecto Spring Boot con su propio repositorio (o submódulo).
- Base de datos por servicio (Oracle/PostgreSQL/Redis dependiendo del caso).
- Pipeline CI/CD autónomo (tests, imagen Docker, despliegue Helm).
3. Esqueleto de un servicio
spring init --dependencies=web,actuator,data-jpa,validation,lombok \
--groupId=es.antoniosaborido.orders \
--name=orders-service orders-service
Estructura interna:
src/main/java/es/antoniosaborido/orders
├── OrdersApplication.java
├── application
│ ├── command
│ ├── query
│ └── service
├── domain
│ ├── model
│ ├── event
│ └── repository
├── infrastructure
│ ├── rest
│ ├── persistence
│ ├── messaging
│ └── config
└── shared
└── exception
- Arquitectura hexagonal/clean: separa dominio, aplicación e infraestructura.
infrastructure/configagrupa configuración de seguridad, observabilidad, resiliencia.
4. Descubrimiento y configuración
- Service discovery: Spring Cloud Netflix Eureka, Consul, Kubernetes DNS.
- Con Kubernetes, usa
Service+ DNS (orders-service.default.svc.cluster.local). - Con Eureka:
eureka:
client:
serviceUrl:
defaultZone: http://discovery:8761/eureka
- Con Kubernetes, usa
- Configuración centralizada: Spring Cloud Config, Vault, AWS Parameter Store.
- Propiedades versionadas en git (profiles:
dev,pre,prod). - Vault para credenciales y certificados rotables.
- Propiedades versionadas en git (profiles:
5. Observabilidad
- Actuator + Micrometer expone métricas (Prometheus/Grafana).
- Tracing: OpenTelemetry + Tempo/Zipkin (
spring-boot-starter-actuator+opentelemetry-exporter-otlp). - Logging: JSON (Logback + Logstash encoder) con
traceId/spanId. - Alertas Prometheus (SLO: p95 < 400 ms, error rate < 2 %).
6. Seguridad transversal
- API Gateway (Spring Cloud Gateway o Kong) para autenticar/autorizar llamadas externas.
- Servicios internos autenticados mediante tokens mTLS, JWT firmados o API Keys rotadas.
- Policies con
Spring Securityy@PreAuthorize. - Auditoría de acceso (
AuditEventRepository, eventos personalizados).
7. Gestión de dependencias y evolución
BOMcompartido (spring-cloud-dependencies,spring-boot-dependencies).- Renovate + Dependabot para actualizaciones automáticas.
- Feature toggles (LaunchDarkly, Togglz) para despliegues progresivos.
- Estrategias de migración: branch by abstraction, expand & contract para contratos API.
8. Pipeline DevOps
mvn verify(tests, JaCoCo, SonarQube).- Build imagen Docker (
spring-boot:build-imageo Dockerfile multi-stage). - Push a registry privado.
- Despliegue Helm/Kustomize (GitOps con ArgoCD/Flux).
- Smoke tests automatizados post-deploy (RestAssured, Newman).
9. Estrategias de resiliencia
- Circuit breakers / retries con Resilience4j.
- Bulkheads y rate limiting en gateway.
- Outbox pattern + Debezium para consistencia eventual.
- Shadow traffic y canary releases para validar nuevas versiones.
10. Equipo y gobierno
- Contratos API versionados (
/api/v1/...) + documentación OpenAPI. - Acuerdos sobre logs, métricas, tags y nomenclatura de topics/colas.
- Catálogo de servicios y owners (Backstage / Portal interno).
- Revisiones de arquitectura periódicas para asegurar alineamiento con negocio.
Con esta arquitectura he construido plataformas escalables donde cada microservicio mantiene autonomía sin perder coherencia global. En el siguiente módulo profundizamos en los mecanismos de comunicación y conectividad entre servicios.