Moderne Software-Architektur – Monolithen aufbrechen

In 8 Schritten vom schwerfälligen Monolithen zu Microservices

Andreas Grabner

© Shutterstock / PPVector

 

Kleiner, schneller, flexibler: Die Aufteilung von großen monolithischen Anwendungen in Microservice-Module hat zahlreiche Vorteile. Doch viele Unternehmen fürchten den Transformationsaufwand. Dabei funktioniert dieser effizient in acht Schritten.

Das Aufbrechen von Monolithen in einzelne Dienste ist nicht so komplex und schwierig, wie es auf den ersten Blick erscheint. Der Weg in eine völlig neuen Softwarearchitekturwelt gelingt über eine Aufsplittung in Komponenten, die Zuordnung dieser zu verarbeitenden Teams und schließlich die Aufteilung in Services.

Zunächst wissen Unternehmen häufig nicht, welche Abhängigkeiten existieren und was innerhalb der monolithischen Codebasis geschieht, wenn sie aktiviert wird. Daher gilt es im ersten Schritt, Informationen zu diesen Abhängigkeiten zu gewinnen.

Schritt 1: Abhängigkeiten ermitteln

Hierfür sind Monitoring-Agenten auf den Hosts zu installieren, auf denen die Anwendungen ausgeführt werden. Diese erkennen automatisch die Abhängigkeiten monolithischer oder in Services zerlegter Applikationen.

Abb. 1: Monitoring-Agenten erkennen die Abhängigkeiten von Anwendungen

Schritt 2: Service-Endpunkte, Nutzung und Verhalten erkennen

Zudem identifiziert die Software automatisch alle Anwendungsendpunkte sowie den Durchsatz und Ressourcenverbrauch pro Anfrage. Mit diesen Informationen können Unternehmen besser entscheiden, welche Bestandteile zuerst für eine Extraktion aus dem Monolithen in Frage kommen. Um das Risiko zu minimieren, können das etwa Endpunkte mit geringem Durchsatz oder weniger kritische Anwendungen sein. Alternativ lassen sich auch diejenigen Bestandteile extrahieren, die viel CPU-Leistung verbrauchen.

Schritt 3: Serviceablauf pro Endpunkt verstehen

Ein weiterer wichtiger Faktor ist die Art und Weise, wie Endpunkt-Implementierungen andere abhängige Dienste in Anspruch nehmen. Starke Abhängigkeiten von einem Backend-Service wie einer Datenbank oder einem externen Service sollten bei allen Entscheidungen berücksichtigt werden. Läuft der neue Service in einer anderen Umgebung, etwa der Cloud, sind zudem Fragen rund um Interoperabilität, Skalierung, Latenz und Kosten zu klären.

Abb. 2: Es muss berücksichtigt werden, wie eine Endpunkt-Implementierung Backend-Services nutzt

Schritt 4: Einstiegspunkte mit CPU Sampling finden

Die richtige Auswahl für erste Microservices lässt sich durch die folgende Fragestellung finden: Welche Methode wird zuerst in einem bestimmten Modul im benutzerdefinierten Code aufgerufen? Dazu lassen sich CPU-Stichproben erstellen, diese nach der Einstiegsmethode filtern und daraus der erste Aufruf einer Methode oder einer Klasse ermitteln, die zur eigenen Codebasis gehört. Ein anderer Ansatz wäre die Suche nach Methoden mit hohem CPU-Verbrauch. Diese ließen sich dann aus dem Monolithen herausbrechen und in einem separaten Service ausführen.

Schritt 5: Benutzerdefinierte Service-Einstiegspunkte

Nach dem Ermitteln eines geeigneten Kandidaten sollten benutzerdefinierte Service-Einstiegspunkte genutzt werden. Dabei wird eine bestimmte Methode in der Codebasis als Einstiegspunkt eines „logischen Dienstes“ behandelt. Diese Methode kann als Instanzmethode einer Klasse, als Interface-Methode oder als Methode mit einer bestimmten Java-Annotation definiert werden. Schritte 4 und 5 sind dabei für jeden Einstiegspunkt zu wiederholen.

Schritt 6: Testen und Verfeinern

Anschließend sollten Unternehmen prüfen, ob das Extrahieren der gewählten Funktionen, Module oder Komponenten aus dem Monolithen tatsächlich vielversprechend ist. Dazu können Monitoring-Agenten den Monolithen in einzelne virtuelle Services aufteilen und deren Funktionsfähigkeit in einer Simulation darstellen. Dadurch ermitteln Unternehmen die tatsächlichen Abhängigkeiten zwischen den einzelnen Teilen des Monolithen und die Verbindung dieser Teile mit den Backend-Diensten. Gute Kandidaten sind dabei lose mit einer oder mehreren Komponenten gekoppelt. Schlechte Kandidaten sind fest damit verzahnt und werden mehrfach von der gleichen Komponente aufgerufen.

Abb. 3: Simulationen decken gute und schlechte Kandidaten für die Extraktion auf

Schritt 7: Den Code umgestalten

Nach dieser Simulation, um bessere Einblicke in die Abhängigkeiten und Abläufe zu erhalten, können Unternehmen mit dem eigentlichen Umbau der Codebasis starten. Dazu beginnen sie mit Bereichen des Monolithen, deren Herausbrechen sinnvoll erscheint, und kümmern sich zu einem späteren Zeitpunkt um problematische Teile.

Schritt 8: Die neue Codebasis kontinuierlich überprüfen

Nachdem die ersten Dienste aus dem Monolithen extrahiert wurden, sollten Unternehmen kontinuierlich überprüfen, wie gut die neue Codebasis wirklich funktioniert. Wichtig ist hier ein Vergleich zwischen Zielsetzung und realem Ergebnis. Zudem ist der Service-Fluss nach jedem Einzelprojekt erneut zu validieren. Dies deckt frühzeitig auf, ob etwas nicht wie geplant läuft, und ermöglicht das Korrigieren von Fehlern und Aktionen, bevor der neue Code in die Produktion gelangt.

Fazit

Diese acht Schritte erleichtern Unternehmen das Aufbrechen von großen, monolithischen Anwendungen in kleine Microservices. Man stellt so sicher, welche Abhängigkeiten existieren, mit welchen Bestandteilen es besonders sinnvoll ist zu beginnen, wie vielversprechend die Ansätze sind und ob die neuen Dienste tatsächlich Vorteile bringen. Durch diese Vorgehensweise lassen sich Fehler vermeiden. Im Ergebnis kann das Unternehmen effizient von der neuen Software-Architektur profitieren.

Geschrieben von
Andreas Grabner
Andreas Grabner
Andreas Grabner hat mehr als 15 Jahre Berufserfahrung als Architekt, Entwickler und DevOps Advokat. In seiner derzeitigen Funktion als Technology Strategist bei Dynatrace ist er Teil des Innovation Labs. Dabei arbeitet er mit Kunden bei der Implementierung von Performance-Management-Lösungen über den gesamten Anwendungslebenszyklus zusammen. Zu Performance-, Architektur- und DevOps- relevanten Themen ist er ein vielgefragter Sprecher auf internationalen Technologie-Konferenzen. Als Blogger publiziert Andreas Grabner regelmäßig Fachartikel. https://www.linkedin.com/in/grabnerandi/; @grabnerandi
Kommentare

Hinterlasse einen Kommentar

4 Kommentare auf "In 8 Schritten vom schwerfälligen Monolithen zu Microservices"

avatar
400
  Subscribe  
Benachrichtige mich zu:
Abrasax
Gast

Im Text ist nicht beschrieben, warum ein Monolith schwerfällig sein soll. Warum habe ich das Gefühl, daß Sie die Leserschaft manipulieren wollen? Ist das heute so üblich, den Leuten ständig das sogenannte Alte madig zu machen, und das Neue, als das Best, Tollste, Genialste und überhaupt AllerGrößte zu verkaufen? Ist das die neue TrumpManier? Oder ist das die neue AntifaManier? Oder BrainFuck?

Guido Laures
Gast

Also, da fehlt mir die Betrachtung des Hauptproblems: das „Aufbrechen des Monolithen“, wie es im Artikel genannt wird. Da steckt doch die Komplexität. Was tun, wenn innerhalb des Monolithen (ich gehe mal davon aus, dass er keine gute interne Architektur hat, sonst müsste man ihn ja nicht ablösen), hunderte von Stellen gefunden werden müssen, die dann auf den Micro-Service umgebogen werden müssen?

Reiner
Gast

Wir sind gerade dabei einen Monolithen aufzubrechen. Allerdings spielen Microservices dort nicht die geringste Rolle sondern Wartbarkeit und Zuverlässigkeit der Software. Mich nervt dieser permanente Microservice-Hype ebenfalls kolossal da er vollkommen unrealistisch und weltfremd ist.

Christoph
Gast

Naja es gibt halt sehr viele Leute die davon leben, neue Sachen zu entwickeln bzw. diese Themen anderen näher zu bringen (Consultants, Blogger, …). Also wird auch ständig eine neue Sau durchs Dorf getrieben. Ich mag Microservices, aber der Heilsbringer sind sie definitiv nicht. Viel mehr tauscht man damit nur bestehende Probleme gegen neue ein.