Patrones de Desarrollo Spring Boot
Patrones de arquitectura y API de Spring Boot para servicios escalables y listos para producción.
Cuándo Activar
- Construir APIs REST con Spring MVC o WebFlux
- Estructurar capas controller → service → repository
- Configurar Spring Data JPA, caché o procesamiento asíncrono
- Agregar validación, manejo de excepciones o paginación
- Configurar perfiles para entornos dev/staging/producción
- Implementar patrones orientados a eventos con Spring Events o Kafka
Estructura de API REST
Patrón de Repositorio (Spring Data JPA)
Capa de Servicio con Transacciones
DTOs y Validación
Manejo de Excepciones
Caché
Requiere @EnableCaching en una clase de configuración.
Procesamiento Asíncrono
Requiere @EnableAsync en una clase de configuración.
Logging (SLF4J)
Middleware / Filtros
Paginación y Ordenamiento
Llamadas Externas Resilientes a Errores
Limitación de Velocidad (Filtro + Bucket4j)
Nota de Seguridad: La cabecera X-Forwarded-For no es confiable por defecto porque los clientes pueden falsificarla.
Solo usar cabeceras reenviadas cuando:
- La aplicación está detrás de un proxy inverso de confianza (nginx, AWS ALB, etc.)
- Se ha registrado
ForwardedHeaderFiltercomo un bean - Se ha configurado
server.forward-headers-strategy=NATIVEoFRAMEWORKen las propiedades de la aplicación - El proxy está configurado para sobrescribir (no agregar) la cabecera
X-Forwarded-For
Cuando ForwardedHeaderFilter está correctamente configurado, request.getRemoteAddr() retornará
automáticamente la IP correcta del cliente desde las cabeceras reenviadas. Sin esta configuración, usar
request.getRemoteAddr() directamente — retorna la IP de la conexión inmediata, que es el único
valor confiable.
Jobs en Segundo Plano
Usar @Scheduled de Spring o integrar con colas (Kafka, SQS, RabbitMQ). Mantener los handlers idempotentes y observables.
Observabilidad
- Logging estructurado (JSON) mediante Logback encoder
- Métricas: Micrometer + Prometheus/OTel
- Trazado: Micrometer Tracing con backend OpenTelemetry o Brave
Configuraciones para Producción
- Preferir inyección por constructor, evitar inyección por campo
- Habilitar
spring.mvc.problemdetails.enabled=truepara errores RFC 7807 (Spring Boot 3+) - Configurar tamaños del pool HikariCP para la carga de trabajo, establecer timeouts
- Usar
@Transactional(readOnly = true)para consultas - Reforzar null-safety mediante
@NonNullyOptionaldonde corresponda
Recuerda: Mantener los controllers delgados, los servicios enfocados, los repositorios simples y los errores manejados centralmente. Optimizar para mantenibilidad y testabilidad.

