🧪 Problem-Driven Systems Lab

☕ Caso 07 — Java 21#

⬅️ Caso 07 · ⚖️ Comparativa de los 7 stacks · ☕ Perfil de Java · 🧬 Todos los perfiles

Stack Java operativo del caso 07. Strangler con routing por consumer + ACL como closure.

Primitivas nativas#

PrimitivaRol
ConcurrentHashMap<String, Function<Request, Response>>Tabla de routing mutable en runtime. Registrar nuevo modulo = 1 linea, sin reload del proceso.
Function<Request, Response>ACL como closure que filtra contrato — la firma del handler es el contrato.
record Request/ResponseInmutables, audit-friendly, sin boilerplate.
LongAdderContadores lock-free de calls / migrations.

Contraste#

Legacy — cambio toca shared_schema, blast radius alto:

java
// todos los consumers pegan al mismo monolito
int blastRadius = 4;  // 4 modulos afectados al unisono
int risk = 8;

Strangler — routing table consulta primero si hay handler nuevo:

java
Function<Request, Response> handler = routingTable.get(consumer + ":" + op);
if (handler != null) return handler.apply(req);   // routedTo=new-module
// fallback al monolito con ACL acotada al consumer

Rutas#

RutaQue muestra
/healthliveness
/change-legacy?consumer=billing&op=changeblast_radius=4 — afecta todo el monolito
/change-strangler?consumer=billing&op=changerouted_to=new-billing-svc — monolito intocado
/flowsmigration_progress por consumer + routing_table_size
/diagnostics/summarycontraste legacy vs strangler
/reset-labreinicia contadores

Hub#

docker compose -f compose.java.yml up -d --build
curl "http://127.0.0.1:8400/07/change-strangler?consumer=billing&op=change"

Modo aislado#

docker compose -f cases/07-incremental-monolith-modernization/java/compose.yml up -d --build
curl "http://127.0.0.1:847/change-strangler?consumer=billing&op=change"

Ver esta carpeta en GitHub ↗