Fachliche Referenz

Vom Enterprise-Monolithen zur kontrollierten Spring-Boot-Migration

Diese Referenz beschreibt nicht zwei Legacy-Systeme, sondern eine einzige Ausgangsbasis und die Sicherheitsmechanismen für eine schrittweise Ablösung.

1. Enterprise-Legacy als Ausgangspunkt

Die Legacy-Anwendung modelliert sechs fachlich unterschiedliche, aber absichtlich schlecht getrennte Abläufe. Sie mischt Validierung, Preis- und Steuerberechnung, Datenbankzugriffe, Remote Calls, JMS, Audit und Event-Erzeugung innerhalb großer EJB-Transaktionen.

KlasseFachliche VerantwortungTypische Altlast
OrderProcessingMonsterBeanOrder Intake bis ShipmentRemote Calls und viele Tabellen in einer Transaktion
BillingRunMonsterBeanInvoice, Collection, Dunning, LedgerBatch und Online-Logik vermischt
CustomerContractMonsterBeanCustomer Master und Contract LifecycleStringly Typed Maps und Replace-Updates
InventoryReplenishmentMonsterBeanReorder, Budget und TransportBestell- und Lagerlogik gekoppelt
ReturnsAndRefundMonsterBeanReturn, Restocking, RefundPayment, Stock und Shipment gemeinsam
EndOfDaySettlementMonsterBeanReconciliation und Day CloseGlobale Locks und erzwungener Abschluss
2. Konsistentes Datenmodell

DAO-SQL, JPA-Tabellennamen und Schema verwenden dieselben Namen: CUSTOMERS, ORDERS, ORDER_LINES, AUDIT_LOG, OUTBOX_EVENT und BATCH_CONTROL. Der reservierte Tabellenname ORDER wurde entfernt.

3. Safety Net vor Refactoring

Golden-Master-Snapshots erfassen stabile Business-Ausgaben. H2-Integrationstests prüfen das reale Schema und alle JDBC-DAO-Namen. Unit Tests decken Happy Paths, Grenzfälle und Provider-/Datenfehler ab. Erst danach werden ACL, Strangler und Parallel Run eingesetzt.

4. Migrationstechniken
  • ACL: mutable SOAP-Daten werden in das moderne Domain-Modell übersetzt.
  • Strangler: deterministischer Traffic Split, Shadow-Aufruf und kontrollierter Fallback.
  • Parallel Run: Legacy- und Modern-Ergebnisse werden feldweise mit Geldtoleranz verglichen.
  • Restartable Batch: Checkpoints, Chunk-Limits, Skip und Dead Letter ermöglichen sichere Datenmigration.
5. Moderne Runtime

Der moderne Pfad speichert Order und Outbox Event in einer Transaktion. Ein Publisher claimt fällige Zeilen per FOR UPDATE SKIP LOCKED, veröffentlicht mit Kafka, markiert erfolgreiche Events als SENT und plant Fehler als RETRY oder endgültig FAILED.

@Transactional
public Result place(Command command) {
    orders.save(order);
    outbox.save(event); // Transactional Outbox Pattern
}
6. Cutover-Regeln
  1. Characterization und Schema Tests sind grün.
  2. Legacy und Modern bestehen ihr 80-%-Coverage-Gate.
  3. Parallel Run zeigt keine kritische Abweichungsrate oberhalb der Freigabeschwelle.
  4. Fallback bleibt während der Beobachtungsphase aktiv.
  5. Legacy-Decommission erfolgt erst nach fachlicher, technischer und regulatorischer Freigabe.
⌂ Cockpit