Spring Boot 3.x – Java 21 – REST – Testing – OpenAPI
Este laboratorio introduce al estudiante en los fundamentos del paralelismo y la concurrencia, integrándolos desde el primer día con buenas prácticas de Arquitectura de Software:
- Diseño por capas
- Servicios REST bien definidos
- Pruebas automatizadas
- Cobertura de código
- Documentación de APIs
- Decisiones técnicas justificadas
El laboratorio se desarrolla en dos fases dentro del mismo ejercicio:
- Fase 0: implementación base (secuencial)
- Fase 1: modificación obligatoria para agregar paralelismo usando hilos
El cálculo de los dígitos de π (Pi) es un problema clásico usado para ilustrar cómputo intensivo y paralelismo.
En este laboratorio, dicho cálculo se expone como un servicio REST moderno, el cual será evolucionado progresivamente.
⚠️ El paralelismo NO se introduce desde el inicio.
Primero se diseña correctamente la solución, luego se paraleliza.
El proyecto sigue una arquitectura por capas:
api/ → Controllers REST, DTOs, contratos
core/ → Lógica de negocio y algoritmos
concurrency/ → Estrategias de paralelismo
monitoring/ → Medición de tiempos y métricas básicas
Regla clave:
- El Controller NO crea hilos
- El Service orquesta
- Las estrategias ejecutan la concurrencia
GET /api/v1/pi/digits?start={int}&count={int}
GET /api/v1/pi/digits?start=&count=&threads=&strategy=
Parámetros:
start≥ 0count> 0threads> 0 (opcional, default: availableProcessors)strategy(opcional):sequential,threads
Swagger debe estar disponible en:
http://localhost:8080/swagger-ui/index.html
Construir un servicio REST funcional, bien diseñado y cubierto por pruebas.
- Analizar la estructura del proyecto suministrado.
- Implementar el endpoint REST secuencial.
- Validar parámetros de entrada.
- Manejar errores correctamente.
- Documentar el API con Swagger.
- Implementar pruebas unitarias y de integración.
- El endpoint responde correctamente.
- Swagger está accesible.
mvn clean testpasa sin errores.
Evolucionar la solución para soportar paralelismo sin romper la arquitectura.
Agregar soporte para:
threadsstrategy=threads
Si no se envían estos parámetros, el sistema debe comportarse de forma secuencial.
public interface ParallelStrategy {
String calculate(int start, int count, int threads);
String name();
}- Crear N hilos (platform threads).
- Dividir el trabajo en segmentos.
- Ejecutar cada segmento en paralelo.
- Sincronizar usando
join(). - Concatenar resultados en orden.
El resultado debe ser idéntico al secuencial.
- Delegar el cálculo a la estrategia.
- Mantener el cálculo secuencial como fallback.
- Casos válidos (200 OK)
- Casos inválidos (400 Bad Request)
- Validación de parámetros
- Equivalencia secuencial vs paralelo
- Determinismo
- No deadlocks (tests con timeout)
- Cobertura mínima de líneas: 80%
mvn clean verifydebe pasar
Medir tiempos de ejecución para un count grande usando:
- strategy=sequential
- strategy=threads con:
- 1 hilo
- availableProcessors()
- 2 × availableProcessors()
- 200
- 500
- Objetivo
- Tabla de tiempos
- Análisis de resultados
- Interpretación de la Ley de Amdahl
- Conclusiones técnicas
- Código fuente
- Pruebas automatizadas
- Cobertura cumplida
- Swagger documentado
- Reporte PDF con análisis
| Criterio | Peso |
|---|---|
| Fase 0 – Implementación base | 20% |
| Fase 1 – Paralelismo con hilos | 25% |
| Arquitectura y diseño | 20% |
| Pruebas y cobertura | 20% |
| Análisis y conclusiones | 15% |
| Total | 100% |
- El proyecto no compila
- Las pruebas fallan
- No se cumple la cobertura mínima
- Resultados hardcodeados
- Copia entre equipos
El paralelismo no es una optimización automática.
Es una decisión arquitectónica con costos y límites.
Bienvenidos a Arquitectura de Software (ARSW).