Microservices sind in aller Munde. Immer wieder kommen wir in Gesprächen mit unseren Kunden auf dieses Thema. Doch was sind Microservices? Wann ist deren Einsatz sinnvoll? Und wann nicht?
Was sind Microservices?
Wikipedia definiert den Begriff folgendermassen:
Microservices sind ein Architekturmuster der Informationstechnik, bei dem komplexe Anwendungssoftware aus unabhängigen Prozessen komponiert wird, die untereinander mit sprachunabhängigen Programmierschnittstellen kommunizieren. Die Dienste sind weitgehend entkoppelt und erledigen eine kleine Aufgabe.
Nehmen wir als Beispiel einen Webshop. Typische Geschäftsprozesse bestehen aus dem Suchen von Artikeln, der Verwaltung eines Warenkorbs, dem Lager- oder Artikelmanagement, dem Checkout und vielen weiteren. Jeder dieser Prozesse soll nun in einer eigenen Software implementiert werden. Der Webshop selber besteht letztendlich noch aus einem Frontend, das die verschiedenen Dienste über eine Schnittstelle (typischerweise eine REST API über HTTP verknüpft.
Das Zerlegen einer grossen Applikation in kleinere Einheiten hat einige Vorteile:
Doch auch diese Architektur hat ihre Stolperfallen. Sind die einzelnen Dienste nicht konsequent genug voneinander getrennt, baut man sich einen verteilten Monolithen. Das macht das System noch komplexer, als es vielleicht sonst schon war.
Die folgenden Fragen sollen die Entscheidung erleichtern, sich beim Design eines Systems für oder gegen Microservices zu entscheiden.
Im Vergleich zu herkömmlichen Architekturen gibt es keine zusätzlichen technischen Voraussetzungen. Allerdings gibt es ein paar Werkzeuge und Technologien, die beim Betrieb von Microservices helfen können.
Automatisierte Tests sind nun definitiv zwingend. Unit Tests sichern das interne Verhalten des Dienstes ab, während Integrationstests das Zusammenspiel zwischen verschiedenen Services auf eine automatische Weise sicherstellen können.
Um das einfachere Deployment und die unabhängige Skalierbarkeit von kleineren Diensten voll auszunutzen, ist es sinnvoll auf eine Container-Technologie wie Docker zu setzen. Grosse Plattformen - wie RedHat OpenShift oder Cloud Foundry - haben Funktionen für automatische Deployments oder Auto-Scaling eingebaut.
Zudem lohnt es sich, in das Thema Infrastructure-As-Code zu investieren. Mehr Services bedeutet auch mehr Infrastruktur. Diese von Hand zu pflegen ist Fehleranfällig und aufwändig. Tools wie Puppet, Ansible und Terraform können helfen, viele Prozesse zu automatisieren und die Infrastruktur zu versionieren.
Weil eine Aufgabe sich über mehrere verschiedene Dienste in der Applikationslandschaft erstrecken kann, ist es wichtig, eine zentrale und strukturierte Stelle für Logging-Daten zu schaffen. Ein Frontend-Request sollte bis zum letzten Dienst in der Schlange identifizierbar sein, damit Debugging und eine Auditierung möglich sind.
Microservices können helfen, grosse und komplexe Systeme in kleinere und übersichtlichere Einheiten aufzuteilen. Es ist jedoch enorm wichtig, auf eine sinnvolle Zerlegung zu achten und die Dienste unabhängig voneinander zu gestalten. Die Anzahl produzierter Microservices sollte keine Messgrösse für die Effektivität eines Entwicklungsteams sein.
Erhalten Sie weitere spannende Informationen zu technischen Hintergründen und Erfahrungsberichten von unseren Engineers. Melden Sie sich für die Engineering Logbook Updates an, damit Sie nichts verpassen.