Microservices
Ein Architekturmuster, bei dem eine Anwendung aus vielen kleinen, unabhängigen Services besteht, die jeweils eine spezifische Aufgabe erfüllen.
Eine Software-Architektur, bei der alle Komponenten einer Anwendung in einer einzigen, zusammenhängenden Codebasis entwickelt und deployed werden.
Ein Monolith ist eine Software-Anwendung, bei der alles zusammen in einer Codebasis lebt und als eine Einheit deployed wird. Frontend, Backend, Datenbank-Zugriff – alles in einem Paket.
Monolith vs. Microservices:
Monolith:
┌─────────────────────────────────┐
│ Eine Anwendung │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │User │ │Order│ │Pay- │ │
│ │Modul│ │Modul│ │ment │ │
│ └─────┘ └─────┘ └─────┘ │
│ Eine Datenbank │
└─────────────────────────────────┘
Microservices:
┌─────┐ ┌─────┐ ┌─────┐
│User │ │Order│ │Pay- │
│Svc │ │Svc │ │ment │
│ DB │ │ DB │ │ DB │
└─────┘ └─────┘ └─────┘
↕ ↕ ↕
API Gateway
Vorteile des Monolithen:
| Vorteil | Erklärung |
|---|---|
| Einfachheit | Eine Codebasis, ein Deployment, ein Debugging |
| Schneller Start | Kein Overhead für Service-Kommunikation |
| Einfaches Testing | Alles in einem Prozess testbar |
| Keine Netzwerk-Latenz | Funktionsaufrufe statt API-Calls |
Nachteile bei Wachstum:
| Nachteil | Erklärung |
|---|---|
| Deployment-Risiko | Kleine Änderung = ganzes System neu deployen |
| Skalierung | Alles oder nichts skalieren |
| Team-Blockaden | Alle arbeiten in derselben Codebasis |
| Tech-Stack-Lock-in | Eine Sprache/Framework für alles |
Typische Schichten:
┌─────────────────────────────────┐
│ Presentation Layer │
│ (UI, API Controllers) │
├─────────────────────────────────┤
│ Business Logic Layer │
│ (Services, Use Cases) │
├─────────────────────────────────┤
│ Data Access Layer │
│ (Repositories, ORM) │
├─────────────────────────────────┤
│ Database │
└─────────────────────────────────┘
Der Kompromiss zwischen Monolith und Microservices:
┌─────────────────────────────────┐
│ Monolith │
│ ┌─────────┐ ┌─────────┐ │
│ │ User │ │ Order │ │
│ │ Module │ │ Module │ │
│ │ ─────── │ │ ─────── │ │
│ │ Public │ │ Public │ │
│ │ API │←→│ API │ │
│ │ ─────── │ │ ─────── │ │
│ │ Private │ │ Private │ │
│ │ Impl │ │ Impl │ │
│ └─────────┘ └─────────┘ │
└─────────────────────────────────┘
Regeln:
| Kriterium | Monolith | Microservices |
|---|---|---|
| Team-Größe | < 10 Entwickler | > 20 Entwickler |
| Deployment-Frequenz | Wöchentlich | Täglich/stündlich |
| Skalierung | Gleichmäßig | Unterschiedlich pro Service |
| Domain-Komplexität | Einfach-mittel | Hoch, viele Bounded Contexts |
| Ops-Expertise | Begrenzt | Stark (K8s, Observability) |
Horizontal:
Load Balancer
│
├── Monolith Instance 1
├── Monolith Instance 2
└── Monolith Instance 3
│
Shared Database
Optimierungen:
Strangler Fig Pattern:
Phase 1: Phase 2: Phase 3:
┌────────┐ ┌────────┐ ┌─────┐
│Monolith│ │Mono- │ │Svc A│
│ │ │lith │ └─────┘
│ │ ├────────┤ ┌─────┐
│ │ │ Svc A │ │Svc B│
└────────┘ └────────┘ └─────┘ Ein Monolith ist wie ein Schweizer Taschenmesser: Alles ist in einem Werkzeug vereint – praktisch für den Anfang, aber wenn eine Klinge bricht, musst du das ganze Messer reparieren.
Gesamte Anwendung in einer Codebasis und einem Deployment
Einfacher Start, aber schwieriger zu skalieren bei Wachstum
Gegenstück zu Microservices – beide haben ihre Berechtigung
Startups & MVPs
Schneller Start ohne Overhead verteilter Systeme
Kleine Teams
Ein Team, eine Codebasis – einfache Koordination
Einfache Domains
Anwendungen ohne komplexe Skalierungsanforderungen
Modular Monolith
Monolith mit klaren internen Modul-Grenzen als Kompromiss
Nein. Monolithen sind für viele Anwendungen die richtige Wahl – besonders am Anfang. Die Komplexität von Microservices lohnt sich erst ab einer gewissen Größe und Team-Struktur.
Wenn: Teams sich gegenseitig blockieren, Deployments zu riskant werden, einzelne Teile unterschiedlich skalieren müssen, oder die Codebasis unüberschaubar wird.
Ein Monolith mit klaren internen Modul-Grenzen. Kombiniert die Einfachheit eines Monolithen mit der Struktur von Microservices. Guter Zwischenschritt.
Ja, durch horizontale Skalierung (mehrere Instanzen) und Caching. Grenzen entstehen, wenn verschiedene Teile unterschiedliche Ressourcen brauchen.