Microservices
Microservices sind ein Architekturparadigma, das sich in den letzten zehn Jahren stark verbreitet hat. Der Begriff steht für eine Herangehensweise, bei der Software nicht mehr als eine große, monolithische Anwendung entwickelt und betrieben wird, sondern als Sammlung kleiner, voneinander unabhängiger Dienste. Jeder dieser Dienste erfüllt eine klar abgegrenzte Aufgabe innerhalb des Gesamtsystems und kommuniziert mit anderen Diensten über wohldefinierte Schnittstellen.
Ursprünge und Motivation
Die Idee der Microservices entwickelte sich im Kontext wachsender monolithischer Systeme, die mit zunehmendem Umfang schwer wart- und testbar wurden. Die Beobachtung: Je größer der Code und je mehr Teams beteiligt sind, desto größer wird die Reibung beim gemeinsamen Arbeiten an einer gemeinsamen Codebasis. Änderungen in einem Bereich ziehen häufig Änderungen in anderen Bereichen nach sich, und das Deployment eines Features kann durch die Abhängigkeit von nicht fertiggestellten Teilbereichen blockiert sein.
Microservices sind eine Antwort auf diese Skalierungsprobleme. Sie setzen auf:
-
Lose Kopplung: Jeder Dienst ist weitgehend unabhängig von den anderen.
-
Hohe Kohäsion: Jeder Dienst konzentriert sich auf eine spezifische Funktion oder Domäne.
-
Unabhängige Deployments: Jeder Dienst kann einzeln aktualisiert werden.
-
Technologievielfalt: Dienste können mit verschiedenen Sprachen und Frameworks implementiert werden.
Technisches Grundprinzip
Ein Microservice-System besteht aus mehreren eigenständigen Prozessen, die über Netzwerkprotokolle miteinander kommunizieren – in der Regel über HTTP (REST oder GraphQL), gRPC oder asynchrone Messaging-Systeme wie Kafka oder RabbitMQ.
Jeder Dienst bringt idealerweise seine gesamte technische Infrastruktur mit:
-
eigenes Repository
-
eigene Build- und Deployment-Pipeline
-
eigene Datenbank oder zumindest isolierten Zugriff auf persistente Daten
Diese vollständige Kapselung wird in der Praxis jedoch nicht immer konsequent umgesetzt. Besonders im Bereich der Datenpersistenz kommt es oft zu Überschneidungen, etwa wenn mehrere Dienste auf dieselbe Datenbank oder Tabelle zugreifen müssen. Das steht im Spannungsfeld zum Prinzip der vollständigen Isolation.
Paradigmen und Interpretationen
Es gibt verschiedene Interpretationen und Ableitungen des Microservices-Gedankens:
-
Domain-Driven Design (DDD): Dienste orientieren sich an fachlichen Domänen („Bounded Contexts“) und spiegeln die Struktur der Geschäftslogik wider.
-
Self-Contained Systems (SCS): Jeder Dienst enthält Backend, Businesslogik und sogar das zugehörige UI.
-
Modular Monolith: Die Anwendung bleibt ein Prozess, ist aber intern stark modularisiert und potenziell in Microservices aufteilbar.
Diese Vielfalt führt dazu, dass unter dem Begriff „Microservices“ oft unterschiedliche Dinge verstanden werden. Eine klare und konsistente Definition fehlt bis heute.
Vorteile von Microservices
| Vorteil | Beschreibung |
|---|---|
| Skalierbarkeit | Einzelne Services lassen sich unabhängig skalieren (z. B. CPU-hungrige Module). |
| Flexibilität | Technologieentscheidungen können pro Dienst individuell getroffen werden. |
| Deployment-Freiheit | Teams können unabhängig voneinander releasen. |
| Fehlertoleranz | Ein Fehler in einem Dienst betrifft nicht notwendigerweise das Gesamtsystem. |
| Teamautonomie | Kleinere Teams können Verantwortung für „ihren“ Dienst übernehmen. |
Herausforderungen und Kritik
| Nachteil / Herausforderung | Beschreibung |
|---|---|
| Systemkomplexität | Die Gesamtarchitektur wird komplexer, insbesondere hinsichtlich Kommunikation und Datenfluss. |
| Testing-Aufwand | Integrationstests und End-to-End-Tests werden aufwendiger. |
| Verteilte Transaktionen | ACID-Eigenschaften sind über mehrere Dienste schwer zu garantieren. |
| Fehlende Übersicht | Es kann schwierig sein, einen systemweiten Überblick zu behalten. |
| Tooling & Infrastruktur | Microservices benötigen reifes CI/CD, Observability, Logging, Monitoring. |
Entwicklung und Trendwende
Microservices galten über Jahre hinweg als das Ideal moderner Softwarearchitektur. Viele Unternehmen haben ihre Systeme unter großem Aufwand von Monolithen auf Microservices umgestellt. Mittlerweile mehren sich jedoch die Stimmen, die auf die Nachteile und Überforderungen durch zu viele verteilte Komponenten hinweisen.
In der Praxis zeigt sich: Nicht jedes Team ist darauf vorbereitet, eine derart feingranulare Architektur sinnvoll zu betreiben. Auch große Unternehmen wie Amazon oder Uber haben Teile ihrer Architektur wieder konsolidiert oder stark modularisierte Monolithen eingeführt.
Derzeit entstehen vermehrt Architekturen, die eine Balance zwischen Modularität und Einfachheit suchen:
-
Modulare Monolithen mit klar abgegrenzten Domänen und interner API-Struktur
-
„Micro-Frontends“ als Antwort auf verteilte Zuständigkeiten im UI-Bereich
-
Backend-for-Frontend (BFF)-Muster zur Trennung von domänenspezifischer Darstellung
Wann sind Microservices sinnvoll?
Microservices lohnen sich besonders, wenn folgende Bedingungen erfüllt sind:
-
Das System ist fachlich sehr komplex und wächst weiter.
-
Es gibt mehrere Entwicklungsteams, die unabhängig voneinander arbeiten sollen.
-
Die Anwendung muss stark skalieren oder hohe Verfügbarkeit garantieren.
-
Es besteht ein Bedarf an Technologievielfalt oder Dienstgrenzen entlang von Domänen.
Für kleinere Projekte oder Teams kann ein gut strukturierter Monolith hingegen deutlich effektiver und wartbarer sein.
Infrastruktur und Orchestrierung
Microservices entfalten ihr volles Potenzial erst mit der passenden Infrastruktur. Zwei Schlüsseltechnologien, die den Betrieb verteilter Systeme ermöglichen, sind:
-
Docker: Eine Container-Technologie, mit der einzelne Microservices isoliert, reproduzierbar und unabhängig voneinander paketiert werden können. Jeder Dienst läuft in seinem eigenen Container mit definierter Laufzeitumgebung.
-
Kubernetes: Eine Open-Source-Plattform zur Orchestrierung von Containern (wie Docker). Kubernetes verwaltet die Verteilung, Skalierung, Wiederherstellung und Kommunikation von Microservices über einen Cluster aus Maschinen hinweg. Es ist damit das Rückgrat vieler Cloud-nativer Architekturen.
Ein „Cluster“ ist in diesem Zusammenhang eine Gruppe vernetzter physischer oder virtueller Server, auf denen Kubernetes die Microservices verteilt und steuert.
Der Aufbau eines produktionsreifen Microservice-Systems setzt daher Kenntnisse in Containerisierung und Orchestrierung voraus – ein Grund, warum der Infrastrukturaufwand im Vergleich zu monolithischen Architekturen deutlich höher ist.
Glossar
| Begriff | Bedeutung |
|---|---|
| API-Gateway | Zentrale Anlaufstelle für externe Anfragen an ein Microservice-System. |
| Cluster | Gruppe aus mehreren Servern, die gemeinsam eine verteilte Umgebung bilden. |
| Container | Leichtgewichtige Umgebung zur isolierten Ausführung von Software-Komponenten. |
| DDD | Domain-Driven Design – domänenzentrierter Ansatz zur Softwaremodellierung. |
| Docker | Plattform zur Containerisierung und zum Deployment verteilter Anwendungen. |
| Kubernetes | System zur automatisierten Verwaltung, Skalierung und Orchestrierung von Containern. |
| Monolith | Architektur, bei der die gesamte Anwendung als eine Einheit betrieben wird. |
| Self-contained System | Architekturansatz, bei dem jeder Dienst auch UI, Logik und Persistenz umfasst. |
| Service Discovery | Verfahren, mit dem Microservices einander automatisch auffinden können. |