Herbert Dowalil
Grundlagen des modularen Softwareentwurfs
Der Bau langlebiger Mikro- und Makro-Architekturen wie Microservices und SOA 2.0
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
© 2009-2024 ciando GmbH