Unsere Erfahrungen des letzten Jahres bestärken uns im Einsatz von Microservices. Sie ermöglichen eine effiziente Entwicklung und gute Testbarkeit komplexer Systeme durch deren Aufteilung in unabhängige und überprüfbare Dienste.
Die Koordination und Kommunikation zwischen den Diensten stellt jedoch eine Herausforderung dar. Jeder zusätzliche Microservice bedeutet ein Mehr an Komplexität, sowohl im Betrieb als auch in der Entwicklung. Der Frage, welche Teile einer Applikation als eigenständige Dienste ausgeführt werden sollen, kommt deshalb eine grosse Bedeutung zu.
Um die Anzahl der Dienste überschaubar zu halten, ist es nicht zwingend notwendig, diese so klein wie möglich zu gestalten, wie es der Begriff "Microservice" suggeriert. Es kann sich auch als Vorteil erweisen, ein System zunächst als Monolith zu bauen, um es später in Microservices aufzuteilen. Da die einzelnen Dienste erst voneinander getrennt werden, wenn das System und dessen Anforderungen etwas besser bekannt sind, können voreilig gezogene Grenzen vermieden werden, welche den Betrieb und die Weiterentwicklung des Systems erschweren würden. Eine solch organischer Entwicklungsansatz minimiert die Herausforderungen und nutzt dennoch die Vorteile von Microservices.
Microservices sind ein Architekturstil, bei dem eine Anwendung als Sammlung unabhängiger Dienste entwickelt wird, die zusammenarbeiten, um eine übergreifende Funktionalität anzubieten. Die einzelnen spezialisierten Dienste kommunizieren miteinander über ein Nachrichtensystem, wie zum Beispiel Kafka.
Bei Inventage erweitern wir die Definition von Microservices auf das Frontend. Ein Microservice besteht sowohl aus Micro-Backend, als auch aus Micro-Frontend. Mit den Micro-Frontends werden unabhängig voneinander auslieferbare Frontend-Anwendungen zu einem grösseren Ganzen zusammengefügt. Um solche Micro-Frontends zu entwickeln, eigenen sich aus unserer Sicht Web Components.
Der Hauptvorteil von Microservices besteht darin, dass die Aufteilung der Applikation in einzelne Dienste es ermöglicht, Anwendungen schneller und flexibler zu entwickeln. Jeder einzelne Microservice ist weniger abhängig von anderen Teilen der Anwendung. Die Applikation lässt sich erweitern, indem neue Microservices entwickelt und in die bestehende Architektur integriert werden.
Unsere Erfahrung zeigt aber auch, dass Microservices bei der Entwicklung und Wartung zu einer erhöhten Komplexität führen. Einerseits aufgrund der Kommunikation der einzelnen Services über Nachrichten, die möglicherweise die Verwaltung von Fehlern und die Überwachung von Leistungsproblemen erfordern. Andererseits aufgrund der expliziten Trennung des eigentlichen Codes, was Refactorings der Schnittstellen erschwert.
Zudem braucht es viel Erfahrung, um die Funktionalität sinnvoll in einzelne Dienste zu unterteilen. Wenn es die Anforderungen erlauben, haben wir bei Inventage gute Erfahrungen damit gemacht, die Applikation anhand der unterschiedlichen Benutzergruppen aufzuteilen. Indem der Dienst einer Benutzergruppe mehrfach installiert wird, lässt sich auf diese Weise auch eine Mandantenfähigkeit elegant lösen.
Über Microservices lassen sich moderne Applikationen in der Cloud entwickeln. Eine genaue Analyse der Anforderungen und ein Abwägen der Vor- und Nachteile ist aber in jedem Fall erforderlich. Nicht immer sind Microservices die einzige Lösung, wie eine Software umgesetzt werden kann. Eine Alternative zur Microservice-Architektur ist zum Beispiel der modulare Monolith, bei dem ein Monolith in austauschbare und wiederverwendbare Module unterteilt wird.