© Zally/Shutterstock.com
Microservices aus einem Monolith extrahieren

In kleinen Schritten


Da steht er nun, der seit Jahrzehnten gewachsene Monolith, und wird zunehmend schwieriger zu warten und zu erweitern. Ein undifferenzierter Rewrite wäre zu teuer und keine Garantie, dass es diesmal besser würde. Um den Monolith dennoch zu bändigen, können wir ihn im großen Maßstab einem Refactoring unterziehen, d. h. verhaltenserhaltend, aber strukturverbessernd überarbeiten. Das geht beispielsweise, indem wir Microservices extrahieren – und das am liebsten in kleinen Schritten.

Typischerweise ist die Unübersichtlichkeit des Monoliths ein großes Problem. Sein schierer Umfang, eine mangelhafte Dokumentation und die Abwesenheit seiner ursprünglichen Entwickler erschweren uns häufig das Verständnis seiner internen Komponenten und ihrer Abhängigkeiten. Vielleicht gibt es Indizien wie Namespaces – aber niemand kann garantieren, dass die Ordnungsprinzipien über alle Entwickler hinweg mit dem gleichen Elan befolgt wurden. Spätestens beim Einsatz schwarzer Magie hilft auch keine statische Codeanalyse mehr und wir leben in ständiger Angst, dass eine Änderung unbeabsichtigte Nebeneffekte haben könnte.

Sobald wir den alten Code verstanden haben, jucken uns wahrscheinlich schon mehrere Refactorings in den Fingern: Hier schnell etwas geradeziehen, jenes nebenher vereinfachen. Aber der Monolith ist komplex, und ehe wir uns versehen, grinst uns ein sehr zotteliges Yak an, das wir zumindest in diesem Moment doch lieber nicht rasieren wollen. Deshalb ist es wichtig, eine Strategie mit vielen Reißleinen zu haben. Sobald wir bemerken, dass wir uns verrannt haben, müssen wir schnell wieder auf den letzten Commit fliehen, in Sicherheit durchatmen und dann noch einmal frisch anfangen können. Aber Moment mal, ist das nicht ein Standardproblem der Softwareentwicklung? Ja, ist es! Und es gibt auch eine Standardlösung: automatisierte Softwaretests.

Automatisierte Blackboxtests

Im besten Fall decken wir mit z. B. in Behat [1] geschriebenen Blackboxtests alle Funktionen des als Microservice zu extrahierenden Features ab. Wir klicken das Feature im Monolith einmal komplett durch und halten unsere Beobachtungen als Testerwartungen fest. So können wir nicht nur später die Funktionalität absichern, sondern lernen auch nach und nach die Details des zu extrahierenden Features kennen. (Kasten: „Datenbankdumps mit slimdump) Beispielsweise können wir HTTP-Statuscode und spezifische Seiteninhalte für die Featurestartseite testen, etwa für eine Log-in-Funktion, Erstellen-, Lesen-, Bearbeiten-...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang