Microservices im Griff
Damit das Zusammenspiel der Services performant gelingt, ist Monitoring unerlässlich.
Die traditionelle Art und Weise, monolithische Unternehmensanwendungen zu verwalten und zu erweitern, wird mit deren zunehmender Größe und Komplexität problematisch. Der Umstieg auf Microservices bietet eine Lösung: Anwendungen werden dort als Sammlung von lose gekoppelten Services strukturiert. So können Dienste leichter erstellt, erweitert und skaliert werden. Doch wie genau unterscheidet sich eine Microservice- von einer monolithischen Architektur? Und welche Vorteile und Herausforderungen entstehen?
Die Grundidee hinter einer MicroserviceArchitektur ist, dass Anwendungen einfacher zu erstellen und zu pflegen sind, wenn sie in kleine, nahtlos zusammenwirkende Teile zerlegt werden. Die Softwarefunktionalität wird in mehreren unabhängigen Modulen isoliert. Diese sind einzeln für die Ausführung genau definierter eigenständiger Aufgaben verantwortlich. Die Module kommunizieren miteinander über einfache, universell zugängliche Application Programming Interfaces (APIs). Jeder Microservice kann eine andere Programmiersprache oder Datenbank nutzen, so dass neue Technologien jederzeit ausprobiert und eingebunden werden können. Außerdem lassen sich mit den Codebausteinen auch Legacy-Systeme erweitern, ohne dass allzu viel an ihrer Codebasis geändert werden muss.
Unternehmen gewinnen also durch Microservices ein Vielfaches an Flexibilität. Sie können schneller und zielgerichteter auf Veränderungen reagieren, Neues ausprobieren und Ressourcen einsparen. Da die einzelnen Bausteine voneinander isoliert sind, lässt sich jede Funktion so gestalten, dass sie sich an den unternehmensspezifischen Anforderungen und Kapazitäten orientiert.
So ist es möglich, viel genauer und effizienter zu skalieren. Möchte man zum Beispiel eine
neue Funktionalität zu einer Applikation hinzufügen, muss man nicht die gesamte Applikation umbauen. Dieses Vorgehen ist nicht nur schneller, es sorgt auch für mehr Stabilität in der Anwendung.
Sollte ein neuer Softwarebaustein nicht richtig funktionieren oder ausfallen, ist davon nur dieser einzelne, relativ einfache Microservice betroffen, nicht die gesamte Anwendung. So kann es sich das Unternehmen leisten, mit neuen Prozessen oder Algorithmen zu experimentieren, ohne dabei viel verlieren zu können.
Microservices machen Fehlersuche einfacher
Bei monolithischen Architekturen stehen Entwickler oft vor dem Problem, dass sämtliche Funktionen und Erweiterungen auf demselben Basiscode aufbauen. Verschiedene Teams arbeiten unabhängig an bestimmten Funktionen und Aufgaben, doch es ist unvermeidlich, dass sie dabei immer wieder Teile des gemeinsamen Codes verändern. Jede Änderung betrifft auch immer mindestens ein Nachbarteam.
In einer Microservice-Architektur besteht dieses Problem nicht. Jedes Entwicklerteam ist für eine bestimmte Zahl von Microservices, manchmal auch nur für einen einzigen Microservice, zuständig. Die Codeblöcke sind durch APIs miteinander verbunden, teilen sich aber keinen gemeinsamen Basiscode. So können die einzelnen Teams freier agieren, tragen dabei aber größere Verantwortung für ihre Funktionen. Zudem ist es möglich, kleinere Entwicklerteams zu bilden, die in ihrem Aufgabengebiet sehr flexibel agieren und sich vollständig auf die ihnen zugeteilten Microservices konzentrieren können. Das steigert die Produktivität.
Neu hinzustoßende Entwickler können schneller eingebunden werden, denn es ist einfacher, kleine, isolierte Funktionalitäten zu verstehen als eine gesamte monolithisch aufgebaute Applikation. Die gesteigerte Produktivität wirkt sich auch auf die Fehlerbehebung aus: Es ist einfacher, kleinere Strukturen zu überwachen und Bugs schnell zu beheben.
Für viele Entwickler sind Container die prädestinierte Architektur für Microservices. Dabei haben sich vor allem Docker-Container durchgesetzt. Meist sind sie so aufgebaut, dass mehrere Container zusammen eine Anwendung bilden. Wer sich mit dem Thema befasst, kommt aber auch an Kubernetes nicht vorbei – das Open-Source-System gilt als neuer Standard für Container-Orchestrierung. Namhafte Public-Cloud-Anbieter wie Google, AWS und Azure setzen Kubernetes wirksam ein. Auch On-Premise-Lösungen wie OpenShift setzen auf die Orchestrierungslösung.
Microservices können aber auch ohne Container verwendet werden. Der Server-lose Ansatz AWS Lambda von Amazon etwa erlaubt das Deployment einzelner geschriebener Funktionen in Java, Javascript und Python (Function as a Service). Welche Lösung die sinnvollere ist, hängt von den zur Verfügung stehenden Ressourcen, den Anforderungen an die Applikation und den benötigten Sicherheitsstandards ab.
Microservice-Architekturen sind komplex
Doch eine Microservice-Architektur bringt auch Herausforderungen mit sich. Zwar sind kleinere Codeblöcke für Entwickler leichter zu verstehen und zu managen, doch die Applikationen an sich sind aus viel mehr Komponenten aufgebaut – und diese Komponenten haben mehr Verbindungen. Diese Abhängigkeiten erhöhen die Gesamtkomplexität der Anwendung, was zu Problemen führen kann.
Einen besonderen Fokus sollte man hier auf das Application Performance Monitoring (APM) legen. Da bei einer einzigen Transaktion so viele bewegliche Teile eine Rolle spielen und jede Millisekunde Verzögerung die Benutzerfreundlichkeit beeinträchtigen kann, wird die Fehlerbehebung bei Performance-Problemen komplexer denn je.
Um Probleme und Fehler schnell zu identifizieren und zu beheben, ist es nötig, die Microservice-Architektur eng zu überwachen. Ein umfassender Überblick über die gesamte Struktur sowie tiefe Einblicke in alle Befehle und Transaktionen stützen sich auf drei Säulen:
Monitoring der Beziehungen zwischen den Applikationen und der Infrastruktur, in der sie laufen;
Monitoring der Applikationsarchitektur: wie die verschiedenen Komponenten zusammenhängen, und
Verfolgen der einzelnen Transaktionen, um Fehler aufzuspüren.
Infrastruktur und Anwendungen hängen untrennbar zusammen und beeinflussen sich gegenseitig. Im Idealfall zeigt das verwendete Monitoring-Tool die Leistungsdaten in Echtzeit in einer Ansicht an. So können Zusammenhänge schnell erkannt und größere Ausfälle vermieden werden.