Inhalt | 9 |
Vorwort | 15 |
Danksagung | 19 |
Der Autor | 21 |
1 Grundlagen | 23 |
1.1 Definition Architektur | 23 |
1.1.1 Strukturierung in Komponenten – Modularisierung | 24 |
1.1.2 Abläufe | 25 |
1.1.3 Anforderungen | 26 |
1.1.4 Technologien | 27 |
1.1.5 Operative Systeme | 27 |
1.2 Was Architektur definitiv NICHT ist | 28 |
1.3 Organisation | 29 |
1.4 Über Enterprise-Architektur (EA) | 33 |
1.5 Evolution | 35 |
1.5.1 Managed Evolution (Credit Suisse) | 36 |
1.5.2 Aim42 | 37 |
1.5.3 Purer Pragmatismus | 38 |
1.6 Dokumentation | 38 |
1.6.1 Mikro-Architektur – Softwaredesign | 38 |
1.6.2 Makro-Architektur | 39 |
1.7 Digitale Transformation – Digitalisierung | 39 |
2 Prinzipien des Software-Entwurfs | 41 |
2.1 Keep it Simple and Stupid (KISS) | 41 |
2.2 Don’t Repeat Yourself (DRY) | 43 |
2.3 Information Hiding Principle | 43 |
2.4 Open Closed Principle | 46 |
2.5 Lose Kopplung | 47 |
2.5.1 Code Reuse | 48 |
2.5.2 Datenbankintegration – gemeinsames Datenmodell | 48 |
2.5.3 Datenbankintegration – selbe Datenbank, unterschiedliche Datenmodelle | 49 |
2.5.4 Synchroner Remote Procedure Call | 50 |
2.5.5 Datenreplikation | 50 |
2.5.6 Messaging | 50 |
2.5.7 Composite-UI | 51 |
2.6 Hohe Kohäsion | 52 |
2.7 Separation Of Concerns | 53 |
2.8 Hierarchischer Aufbau | 56 |
2.9 Zusammenfassung | 59 |
3 Mikro-Architektur – Softwaredesign | 61 |
3.1 SOLID | 62 |
3.1.1 Liskovsches Substitutionsprinzip | 62 |
3.1.2 Interface Segregation Principle | 64 |
3.1.3 Dependency Inversion Principle | 65 |
3.2 Dependency Injection | 66 |
3.3 Law of Demeter | 67 |
3.4 Composition over Inheritance | 68 |
3.5 Selbst-Dokumentation | 68 |
3.6 Design by Contract | 70 |
3.7 Design Pattern | 72 |
3.7.1 Decorator und Delegate (Structural) | 73 |
3.7.2 Adapter (Structural) | 74 |
3.7.3 Facade (Structural) | 75 |
3.7.4 Observer (Behavioral) | 76 |
3.7.5 Simple Factory (Creational) | 78 |
3.7.6 Factory Method (Creational) | 79 |
3.7.7 Abstract Factory (Creational) | 80 |
3.7.8 Builder (Creational) | 81 |
4 Domänengetriebener Entwurf – Domain Driven Design (DDD) | 85 |
4.1 Ubiquitous Language | 85 |
4.2 Aufteilung in Subdomänen | 86 |
4.3 Bounded Context | 86 |
4.4 Integration | 87 |
4.4.1 Das Problem mit dem Konformismus | 88 |
4.5 Upstream/Downstream-Beziehungen | 89 |
4.6 Context Map | 90 |
4.7 Beispiel | 90 |
4.8 Fazit | 92 |
5 Enterprise Application Integration Pattern (EAIP) | 95 |
5.1 Orchestrierung vs. Choreografie | 96 |
5.2 Das Prinzip der Dumb Pipes and Smart Endpoints | 96 |
5.3 Tooling | 98 |
5.3.1 Message Bus | 98 |
5.3.2 Message Broker | 99 |
5.3.3 Enterprise Service Bus (ESB) | 99 |
5.3.4 Business Process-Management-Systeme (BPMS) | 101 |
5.3.5 API-Gateways | 103 |
5.3.6 Service Discovery/Service Registration | 104 |
6 Makro-Architektur | 105 |
6.1 Antipattern | 106 |
6.1.1 Maximierung des Reuse | 106 |
6.1.2 Kanonisches Modell | 107 |
6.1.3 Service Versioning | 109 |
6.1.4 Zentraler Mediator – Enterprise Service Bus (ESB) | 110 |
6.2 Empfohlene Pattern | 113 |
6.2.1 Consumer Driven Contract Tests | 113 |
6.2.2 Robustness Principle (Tolerant Reader) | 113 |
6.2.3 Feature Toggles | 114 |
6.2.4 Circuit Breaker | 115 |
6.2.5 Bulkhead | 116 |
6.2.6 Adapter | 117 |
6.2.7 Backend for Frontend (BFF) | 118 |
6.2.8 Saga | 118 |
6.2.9 Pipes and Filters | 119 |
6.2.10 Correlation IDs | 120 |
6.2.11 Event Sourcing | 120 |
7 Verteilte Systeme – Distributed Systems | 123 |
7.1 Monolithen | 124 |
7.1.1 Keine Continuous Delivery möglich!? | 125 |
7.1.2 Automatische Erosion der Struktur!? | 126 |
7.1.3 Monolithische Architekturen skalieren nicht!? | 126 |
7.1.4 Es ist eine Frage von entweder/oder!? | 129 |
7.2 Idempotenz | 130 |
7.2.1 Idempotent Receiver Pattern | 130 |
7.3 Representational State Transfer – REST | 131 |
7.4 Konsistenz | 134 |
7.4.1 Datenbankintegration (Konsistent) | 136 |
7.4.2 Two Phase Commit (Konsistent) | 136 |
7.4.3 Ein großer Datenservice (Konsistent) | 136 |
7.4.4 Send at least once (Eventually Consistent) | 137 |
7.4.5 Orchestrierung (Eventually Consistent) | 139 |
7.4.6 Choreografie (Nicht automatisch Konsistent) | 140 |
7.4.7 Event Sourcing und CQRS (Konsistent) | 141 |
7.4.8 Zentraler Mediator Antipattern – Enterprise Service Bus (Eventually Consistent) | 141 |
8 Service-orientierte Architektur (SOA) | 143 |
8.1 Service-Antipattern | 144 |
8.1.1 Service-Kategorien | 144 |
8.1.2 Webservice vs. Service | 145 |
8.1.3 API im Vordergrund | 145 |
8.1.4 SOA 1.0 | 145 |
8.2 Microservices | 150 |
8.2.1 Monolith First | 154 |
8.2.2 Hybride | 154 |
8.3 Nanoservices | 155 |
8.4 Modulare SOA – Right Sized Services – SOA 2.0 | 156 |
8.5 Self Contained Systems (SCS) | 157 |
8.6 Integration kommerzieller Systeme (Commercial off the Shelf – COTS) | 158 |
9 Metriken | 161 |
9.1 Unit-Test-Abdeckung und das Legacy-Code-Dilemma | 162 |
9.2 Technische Schuld | 163 |
9.3 Komplexität und Modulgröße | 164 |
9.3.1 Semantische Komplexität | 165 |
9.3.2 Strukturelle Komplexität | 165 |
9.3.3 Verschachtelungskomplexität | 166 |
9.4 Kohäsion | 166 |
9.4.1 Relational Cohesion | 166 |
9.4.2 Lack of Cohesion in Methods IV (LCOM4) | 166 |
9.5 Component Rank | 168 |
9.6 Software-Package-Metriken nach Robert C. Martin | 168 |
9.6.1 Afferent Coupling (Ca) | 169 |
9.6.2 Efferent Coupling (Ce) | 169 |
9.6.3 Instability | 170 |
9.7 Metriken nach John Lakos | 170 |
9.7.1 Depends Upon und Used From | 170 |
9.7.2 Cumulative Component Dependency (CCD) | 171 |
9.7.3 Average Component Dependency (ACD) | 171 |
9.7.4 Relative Average Component Dependency (RACD) | 172 |
9.7.5 Normalized Cumulative Component Dependency (NCCD) | 172 |
9.8 Relative Cyclicity | 173 |
9.8.1 Azyklischer Monolith | 174 |
9.9 Strukturkennzahlen und verteilte Systeme | 175 |
10 Zusammenfassung | 177 |
10.1 Die Frage nach dem „richtigen Schnitt“ | 177 |
10.1.1 Ausrichtung nach dem Kunden | 177 |
10.1.2 Optimierung der Software | 178 |
10.2 Geteilte Daten | 179 |
10.3 Migration | 180 |
10.3.1 Extraktion | 180 |
10.3.2 APIs First | 182 |
10.3.3 Aushöhlung | 184 |
10.3.4 Ach wenn ich doch nur anfangen könnte! | 185 |
10.3.5 Über die Migration der Mitarbeiter | 186 |
10.4 Pitfalls | 186 |
10.4.1 Es funktioniert | 186 |
10.4.2 Enterprise- vs. Makro-Architektur | 187 |
10.4.3 Scrum | 187 |
10.4.4 Microservices | 187 |
10.4.5 Vereinheitlichung | 188 |
10.4.6 Keine klare Linie | 188 |
10.4.7 Überbewertung des Themas Prozesse | 189 |
10.4.8 Irrationalität | 189 |
10.4.9 Big-Bang-Migration | 192 |
10.4.10 Scope Creep | 192 |
10.4.11 Elfenbeinturm | 193 |
10.4.12 Ignorieren von Feedback zu Machbar- und Sinnhaftigkeit | 193 |
10.4.13 Widersprüchliche Ziele | 194 |
10.4.14 Management durch Kennzahlen | 194 |
10.4.15 Falsche Anreize (Kobra-Effekt) | 195 |
10.4.16 Cargo-Kult | 195 |
10.5 War Story | 196 |
10.6 Fazit | 198 |
11 Umsetzung | 201 |
11.1 Datenreplikation | 201 |
11.1.1 Extract Transform Load (ETL) | 201 |
11.1.2 Features der Datenbanken | 201 |
11.1.3 Polling | 201 |
11.1.4 Push Messaging | 202 |
11.2 Composite UI | 202 |
11.2.1 Partielle Integration im Web | 203 |
11.2.2 Integration über ein Trägerportal | 204 |
11.2.3 Vollständige Pages | 205 |
11.2.4 Komplexe Integration | 205 |
11.3 Design eines Moduls | 206 |
11.4 Consumer Driven Contract Testing mit PACT | 208 |
11.5 Modulares Design | 208 |
11.5.1 Javascript | 208 |
11.5.2 TypeScript | 209 |
11.5.3 Java | 210 |
11.5.4 Open Services Gateway initiative – OSGi | 211 |
11.5.5 ArchUnit | 212 |
11.5.6 Sonargraph | 213 |
12 Glossar | 217 |
13 Quellen | 219 |
Index | 223 |
Leere Seite | 2 |