Softwarearchitektur
Softwarearchitektur beschreibt die grundlegende Struktur und Organisation eines Software-Systems.
Sie definiert die Hauptkomponenten, ihre Beziehungen zueinander und die Prinzipien, nach denen das System aufgebaut ist.
Eine gute Architektur ist das Fundament für:
- Wartbarkeit - Code lässt sich einfacher ändern
- Skalierbarkeit - System kann wachsen
- Erweiterbarkeit - Neue Funktionen hinzufügen
- Verständlichkeit - Entwickler finden sich schnell zurecht
- Wiederverwendbarkeit - Komponenten können mehrfach genutzt werden
Architekturmuster
MVC - Model View Controller
MVC trennt die Anwendung in drei Hauptkomponenten:
Die drei Schichten:
- Model - Daten und Datenbank-Logik
- View - Benutzeroberfläche
- Controller - Vermittelt zwischen Model und View
┌──────────┐
│ View │ ← Zeigt Daten an (HTML, CSS)
└─────┬────┘
│
┌─────▼────────┐
│ Controller │ ← Verarbeitet Anfragen
└─────┬────────┘
│
┌─────▼────┐
│ Model │ ← Datenbankzugriff
└──────────┘
Ablauf:
- Benutzer klickt Button (View)
- Controller empfängt Request
- Controller fragt Model nach Daten
- Model holt Daten aus Datenbank
- Controller gibt Daten an View
- View zeigt Ergebnis an
Vorteile:
- ✅ Klare Trennung der Verantwortlichkeiten
- ✅ Testbarkeit (jede Komponente einzeln testbar)
- ✅ Mehrere Views für ein Model möglich
Layered Architecture (Schichtenarchitektur)
Die Anwendung wird in horizontale Schichten aufgeteilt, wobei jede Schicht nur mit der darunterliegenden kommuniziert.
┌─────────────────────────────────┐
│ Presentation Layer (UI) │ ← Benutzeroberfläche
├─────────────────────────────────┤
│ Business Logic Layer │ ← Geschäftslogik
├─────────────────────────────────┤
│ Data Access Layer │ ← Datenbankzugriff
├─────────────────────────────────┤
│ Database Layer │ ← Datenspeicherung
└─────────────────────────────────┘
Die 4 Schichten:
1. Presentation Layer (Präsentationsschicht)
- Zeigt Daten dem Benutzer
- Nimmt Eingaben entgegen
- Technologien: HTML, React, JavaFX
2. Business Logic Layer (Geschäftslogik)
- Enthält die Geschäftsregeln
- Verarbeitet Daten
- Validiert Eingaben
- Beispiel: "Ein Kunde darf maximal 10.000€ Kredit haben"
3. Data Access Layer (Datenzugriffsschicht)
4. Database Layer (Datenbankschicht)
- Speichert die Daten
- MySQL, PostgreSQL, MongoDB
- ✅ Klare Strukturierung
- ✅ Austauschbarkeit einzelner Schichten
- ✅ Einfache Wartung
- ✅ Wiederverwendbarkeit
- ❌ Kann zu starr sein
- ❌ Performance-Overhead durch Schichten
- ❌ Änderungen durchlaufen alle Schichten
Microservices-Architektur
Statt einer großen Anwendung (Monolith) baut man viele kleine, unabhängige Services.
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ User │ │ Payment │ │ Order │
│ Service │ │ Service │ │ Service │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└────────────────┼────────────────┘
│
┌─────▼─────┐
│ API │
│ Gateway │
└───────────┘
Charakteristiken:
- Jeder Service hat seine eigene Datenbank
- Services kommunizieren über REST API oder Message Queues
- Unabhängig deploybar
- Können in verschiedenen Programmiersprachen geschrieben sein
- ✅ Unabhängige Entwicklung und Deployment
- ✅ Skalierbarkeit (nur benötigte Services skalieren)
- ✅ Fehler isoliert (ein Service-Ausfall ≠ Gesamtausfall)
- ✅ Technologie-Freiheit
- ❌ Komplexere Kommunikation
- ❌ Verteilte Systeme schwerer zu debuggen
- ❌ Mehr Deployment-Aufwand
- ❌ Netzwerk-Latenz zwischen Services
Client-Server-Architektur
Der Server stellt Dienste bereit, die Clients nutzen.
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Client │ │ Client │ │ Client │
│ (PC) │ │ (Handy) │ │ (Web) │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
└────────────┼────────────┘
│
┌─────▼─────┐
│ Server │
│ │
└─────┬─────┘
│
┌─────▼─────┐
│ Datenbank │
└───────────┘
Vorteile:
- ✅ Zentrale Datenhaltung
- ✅ Einfache Wartung (nur Server updaten)
- ✅ Zentrale Sicherheit
- ✅ Ressourcen-Sharing
Nachteile:
- ❌ Single Point of Failure (Server fällt aus → alle betroffen)
- ❌ Netzwerk erforderlich
- ❌ Server kann Engpass werden
Monolithische Architektur
Die gesamte Anwendung ist ein einziges, großes Programm.
┌─────────────────────────────────┐
│ │
│ Monolithische App │
│ │
│ ┌────────┐ ┌────────┐ │
│ │ UI │ │ Logic │ │
│ └────────┘ └────────┘ │
│ │
│ ┌──────────────────┐ │
│ │ Database │ │
│ └──────────────────┘ │
│ │
└─────────────────────────────────┘
Vorteile:
- ✅ Einfach zu entwickeln (für kleine Teams)
- ✅ Einfach zu deployen (eine Datei)
- ✅ Einfach zu testen
- ✅ Keine Netzwerk-Latenz zwischen Komponenten
Nachteile:
- ❌ Schwer skalierbar
- ❌ Ein Fehler kann alles zum Absturz bringen
- ❌ Große Code-Basis schwer wartbar
- ❌ Technologie-Lock-in
Architekturprinzipien
Separation of Concerns (Trennung der Zuständigkeiten)
Jede Komponente sollte eine klare Aufgabe haben.
❌ Schlecht: Eine Klasse macht Datenbankzugriff, UI-Rendering UND Geschäftslogik
✅ Gut:
UserRepository- DatenbankzugriffUserService- GeschäftslogikUserController- UI-Logik
Loose Coupling (Lose Kopplung)
Komponenten sollten möglichst unabhängig voneinander sein.
Vorteil: Änderungen in einer Komponente beeinflussen andere nicht.
High Cohesion (Hohe Kohäsion)
Verwandte Funktionen sollten zusammen in einer Komponente sein.
Don't Repeat Yourself (DRY)
Vermeide Code-Duplikation - schreibe wiederverwendbare Komponenten.
Architekturentscheidungen
Kleine Anwendung, kleines Team:
→ Monolith oder Layered Architecture
Mittlere Anwendung, klare Trennung UI/Logik/Daten:
→ MVC oder Layered Architecture
Große Anwendung, viele Teams, hohe Skalierung:
→ Microservices
Web-Anwendung:
→ Client-Server mit MVC
Cloud vs. On-Premises
| Aspekt | Cloud | On-Premises |
|---|---|---|
| Hosting | Server bei Anbieter | Eigene Server |
| Kosten | Monatlich (OpEx) | Anfangsinvestition (CapEx) |
| Skalierung | Flexibel | Fixe Kapazität |
| Wartung | Anbieter | Eigenes IT-Team |
| Kontrolle | Begrenzt | Volle Kontrolle |
| Setup-Zeit | Minuten | Wochen/Monate |
Cloud-Modelle:
- SaaS - Software as a Service (z.B. Microsoft 365)
- PaaS - Platform as a Service (z.B. Azure App Service)
- IaaS - Infrastructure as a Service (z.B. AWS EC2)
Speicher-Architekturen
NAS - Network Attached Storage
Datei-basierter Speicher im Netzwerk - wie ein gemeinsamer Ordner.
Verwendung:
- Datei-Sharing
- Backup-Speicher
- Medienserver
SAN - Storage Area Network
Block-basierter Speicher - wie eine lokale Festplatte über Netzwerk.
Verwendung:
- Datenbank-Server
- Virtualisierung
- Hochperformante Anwendungen
| NAS | SAN |
|---|---|
| Datei-basiert | Block-basiert |
| Einfach einzurichten | Komplex |
| Günstiger | Teurer |
| Langsamer | Schneller |
Best Practices
- ✅ Modular - Komponenten unabhängig austauschbar
- ✅ Dokumentiert - Architektur-Diagramme und Beschreibungen
- ✅ Testbar - Komponenten isoliert testbar
- ✅ Skalierbar - System kann wachsen
- ✅ Sicher - Security von Anfang an mitgedacht
- ✅ Performance - Engpässe vermeiden
- ❌ Keine klare Architektur (Code wächst chaotisch)
- ❌ Zu komplexe Architektur für einfache Probleme
- ❌ Architektur nicht dokumentiert
- ❌ Komponenten zu stark gekoppelt
- ❌ Security als Nachgedanke
Siehe auch: