Eine Anwendung basierend auf Microservices mit Java zu entwickeln kann ja so schwer nicht sein. Schließlich gibt es Frameworks wie Spring Boot oder MicroProfile, die dem Entwickler das technologische Rahmengerüst vorgeben. Nur leider ist es damit nicht getan. Wie zum Beispiel sieht der optimale Service-Schnitt aus? Wie kommunizieren die Services untereinander, ohne dabei ihre Unabhängigkeit zu verlieren? Wie soll die Anwendung reagieren, wenn mal ein Service nicht so kann, wie er soll? Und wie bindet man seine Microservices an bestehende Infrastruktur wie Distributed Tracing, Monitoring oder Identity Provider an?
Was sich in der Theorie einfach anhört, bringt in der Praixis so manchen Stolperstein mit sich. Im Rahmen des Workshops werden wir daher gemeinsam eine kleine, auf Microservices basierende Anwendung bauen und zum „Fliegen“ bringen. Angefangen bei der Diskussion über den optimalen Service-Schnitt via Domain-driven Design, über die Integration der Services untereinander via unterschiedlicher Kommunikationspatterns inkl. eingebauter Fehlertoleranz bis hin zur Instrumentalisierung der Services zwecks Laufzeitanalyse und -optimierung, lassen wir dabei kaum ein Thema aus.
Am Ende steht eine Anwendung, die live gehen könnte – naja, fast.
3. #WISSENTEILEN
Functional Decompensation
Single Responsibility Principle
Share nothing*
Consumer Contracts (a.k.a. Interfaces)
Lightweight Communication
Independently develop, test, deploy, run
Heterogeneous (a.k.a. Polyglot)
*share as little as possible
50. #WISSENTEILEN
Photo by Irene Fertik, USC News Service. Copyright 1994, USC.
„Be conservative in what you do,
Be liberal in what you accept
from others“
RFC 793, Robustness Principal (John Postel)
51. #WISSENTEILEN
Es darf nichts entfernt werden
Keine Veränderung von Verarbeitungsregel
Optionales darf nie Required werden
http://zalando.github.io/restful-api-guidelines
Alles was hinzugefügt wird, muss optional sein
72. #WISSENTEILEN
Checkout
Idee:
Der gesamte Bestellvorgang
kann im „Normalfall“ mit Hilfe
des Checkout-Service
abgehandelt werden.
Datenversorgung:
Zu dem Zweck hält der
Checkout-Service ein
Replikat der notwendigen
Daten*.
Orders
Preferred Delivery Address
Preferred Payment Method*ggf. als eigene Domänen-Repräsentation
73. #WISSENTEILEN
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Idee:
Der gesamte Bestellvorgang
kann im „Normalfall“ mit Hilfe
des Checkout-Service
abgehandelt werden.
Herausforderung:
Aber was ist, wenn die
bevorzugte Lieferadresse bzw.
Zahlungsmethode nicht zur
Anwendung kommen soll?
74. #WISSENTEILEN
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Idee:
Der gesamte Bestellvorgang
kann im „Normalfall“ mit Hilfe
des Checkout-Service
abgehandelt werden.
Alternative Adresse:
… im „Ausnahmefall“ wird der
Address-Service zur Auswahl
einer anderen Adresse heran-
gezogen.
75. #WISSENTEILEN
Checkout
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
POST https://ok-shop.de/orders
Orders
Preferred Delivery Address
Preferred Payment Method
76. #WISSENTEILEN
Checkout
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
201 created
Location: …/orders/1234
Orders
Preferred Delivery Address
Preferred Payment Method
77. #WISSENTEILEN
Address
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
78. #WISSENTEILEN
Address
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
GET …/addresses
(list all addresses)
79. #WISSENTEILEN
Address
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
200 ok
[
„list of
addresses“
]
80. #WISSENTEILEN
Address
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
PUT …/addresses/123
(change pref. delivery address)
81. #WISSENTEILEN
Address
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
204 no content
[ ]
82. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
83. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
pref. delivery
address changed
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
84. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
pref. delivery address changed
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
85. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
pref. delivery
address changed
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
86. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
88. #WISSENTEILEN
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Idee:
Der gesamte Bestellvorgang
kann im „Normalfall“ mit Hilfe
des Checkout-Service
abgehandelt werden.
Neue Adresse anlegen:
… neue Adressen werden über
den Address-Service angelegt
und im Anschluss repliziert.
89. #WISSENTEILEN
Address
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
POST …/addresses/
(add new pref. delivery address)
90. #WISSENTEILEN
Address
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
201 created
Location ...
91. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
92. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
pref. delivery
address changed
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
93. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
pref. delivery address changed
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
94. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
pref. delivery
address changed
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
95. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Address MQ
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service.
96. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service
Herausforderung:
Und was ist, wenn der
Address-Service nicht
verfügbar ist?
97. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service
Fachlicher Workaround :
z.B. durch Setzen der Adresse
nur für die aktuelle
Bestellung via UI.
98. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
POST …/orders/
(with typed in address)
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service
Fachlicher Workaround :
z.B. durch Setzen der Adresse
nur für die aktuelle
Bestellung via UI.
99. #WISSENTEILEN
Address Checkout
Orders
Preferred Delivery Address
Preferred Payment Method
Addresses
Preferred Delivery Address
201 created
Location …
Idee:
Im „Normalfall“ nur der
Checkout-Service.
Im „Ausnahmefall“ zusätzlich
der Address-Service
Fachlicher Workaround :
z.B. durch Setzen der Adresse
nur für die aktuelle
Bestellung via UI.
105. #WISSENTEILEN
Product
Idee:
Ein Product-Service liefert
zu empfehlende Produkte
oder alternativ die Liste der
Bestseller.
Product
nicht eingeloggt eingeloggt
gutes Service Design:
Ein Service hat genau eine
fachlich Verantwortlichkeit
und ein dazu passendes
Domänen Modell
106. #WISSENTEILEN
Neue Idee:
Wenn nicht eingeloggt,
liefert ein Bestseller-Service
die Liste der Top-10.
Wenn eingeloggt, liefert ein
Recommendation-Service
zu empfehlende Produkte.
Bestseller Recomm
nicht eingeloggt eingeloggt
107. #WISSENTEILEN
Herausforderungen:
Wer stellt fest, ob
eingeloggt oder nicht
(UI vs. Services)?
Wie kommen die Login-
Informationen zum
Recommendation-Service?
Wie werden „Session“ Info
verteilt, wenn mehrere Services
in einen Call involviert sind
(Context Propagation)?
Bestseller Recomm
nicht eingeloggt eingeloggt
108. #WISSENTEILEN
Exkurs: Sicher ist sicher! Sicher?
• Server based Security
via Session auf dem Server
• Token based Security
via Austausch von Token
111. #WISSENTEILEN
Exkurs: Sicher ist sicher! Sicher?
JWT (JSON Web Token)
• neue, einfache und kompakte Specs
• Token plus public & private „Claims“
• digitale Signatur und/oder Encryption
• als Bearer Token und für SSO
113. #WISSENTEILEN
Herausforderungen:
Wer stellt fest, ob
eingeloggt oder nicht
(UI vs. Services)?
Wie kommen die Login-
Informationen zum
Recommendation-Service?
Wie werden „Session“ Info
verteilt, wenn mehrere Services
in einen Call involviert sind
(Context Propagation)?
Bestseller Recomm
nicht eingeloggt eingeloggt
125. #WISSENTEILEN
Search
Idee:
Bei einer Suche durch den
Search-Service wird neben
den Treffern auch deren
Verfügbarkeit angezeigt.
gutes Service Design:
Ein Service hat genau eine
fachlich Verantwortlichkeit
und ein dazu passendes
Domänen Modell
126. #WISSENTEILEN
Search Inventory
Search
API
Koordination der Aufrufe
Aggregation der Ergebnisse
Neue Idee:
Bei einer Suche wird neben
den Treffern auch deren
Verfügbarkeit angezeigt.
Ein Search-Service liefert die
Suchergebnisse.
Ein Inventory-Service liefert
die Verfügbarkeit.
129. #WISSENTEILEN
Search Inventory
Search
API
Koordination der Aufrufe
Aggregation der Ergebnisse
Neue Idee:
Ein Search-Service liefert die
Suchergebnisse.
Ein Inventory-Service liefert
die Verfügbarkeit.
Herausforderung:
Performance ist deutlich
schlechter als erwartet!
Wo liegt das Problem?
Und was ist eigentlich
„passiert“?
130. #WISSENTEILEN
Search Inventory
Search
API
Koordination der Aufrufe
Aggregation der Ergebnisse
Neue Idee:
Ein Search-Service liefert die
Suchergebnisse.
Ein Inventory-Service liefert
die Verfügbarkeit.
Distributed Tracing:
Unique Trace ID wird
als „Klammer“ erzeugt
und durch den gesamten
Aufruf geschleust.
id
131. #WISSENTEILEN
Search Inventory
Search
API
Koordination der Aufrufe
Aggregation der Ergebnisse
Neue Idee:
Ein Search-Service liefert die
Suchergebnisse.
Ein Inventory-Service liefert
die Verfügbarkeit.
Distributed Tracing:
Unique Trace ID wird
als „Klammer“ erzeugt
und durch den gesamten
Aufruf geschleust.
id
132. #WISSENTEILEN
Search Inventory
Search
API
Koordination der Aufrufe
Aggregation der Ergebnisse
Neue Idee:
Ein Search-Service liefert die
Suchergebnisse.
Ein Inventory-Service liefert
die Verfügbarkeit.
Distributed Tracing:
Unique Trace ID wird
als „Klammer“ erzeugt
und durch den gesamten
Aufruf geschleust.
id
133. #WISSENTEILEN
Search Inventory
Search
API
Koordination der Aufrufe
Aggregation der Ergebnisse
Neue Idee:
Ein Search-Service liefert die
Suchergebnisse.
Ein Inventory-Service liefert
die Verfügbarkeit.
Distributed Tracing:
Unique Trace ID wird
als „Klammer“ erzeugt
und durch den gesamten
Aufruf geschleust.
id
134. #WISSENTEILEN
Search Inventory
Search
API
Koordination der Aufrufe
Aggregation der Ergebnisse
Neue Idee:
Ein Search-Service liefert die
Suchergebnisse.
Ein Inventory-Service liefert
die Verfügbarkeit.
Distributed Tracing:
Unique Trace ID wird
als „Klammer“ erzeugt
und durch den gesamten
Aufruf geschleust.
id
135. #WISSENTEILEN
Search Inventory
Search
API
Koordination der Aufrufe
Aggregation der Ergebnisse
Neue Idee:
Ein Search-Service liefert die
Suchergebnisse.
Ein Inventory-Service liefert
die Verfügbarkeit.
Distributed Tracing:
Unique Trace ID wird
als „Klammer“ erzeugt
und durch den gesamten
Aufruf geschleust.
id
136. #WISSENTEILEN
Search Inventory
Search
API
Koordination der Aufrufe
Aggregation der Ergebnisse
Neue Idee:
Ein Search-Service liefert die
Suchergebnisse.
Ein Inventory-Service liefert
die Verfügbarkeit.
Distributed Tracing:
Unique Trace ID wird
als „Klammer“ erzeugt
und durch den gesamten
Aufruf geschleust.
id
137. #WISSENTEILEN
Search Inventory
Search
API
Koordination der Aufrufe
Aggregation der Ergebnisse
Neue Idee:
Ein Search-Service liefert die
Suchergebnisse.
Ein Inventory-Service liefert
die Verfügbarkeit.
Distributed Tracing:
Unique Trace ID wird
als „Klammer“ erzeugt
und durch den gesamten
Aufruf geschleust.
id
138. #WISSENTEILEN
Search Inventory
Search
API
Koordination der Aufrufe
Aggregation der Ergebnisse
Neue Idee:
Ein Search-Service liefert die
Suchergebnisse.
Ein Inventory-Service liefert
die Verfügbarkeit.
Distributed Tracing:
Unique Trace ID wird
als „Klammer“ erzeugt
und durch den gesamten
Aufruf geschleust.
id
143. #WISSENTEILEN
Search Inventory
Search
API
Koordination der Aufrufe
Aggregation der Ergebnisse
Neue Idee:
Ein Search-Service liefert die
Suchergebnisse.
Ein Inventory-Service liefert
die Verfügbarkeit.
Herausforderung:
Service liefert nicht das
erwartete Ergebnis. Wo
genau liegt das Problem?
Und was ist eigentlich im
Detail passiert?
144. #WISSENTEILEN
Search Inventory
Search
API
Koordination der Aufrufe
Aggregation der Ergebnisse
Neue Idee:
Ein Search-Service liefert die
Suchergebnisse.
Ein Inventory-Service liefert
die Verfügbarkeit.
Distributed Logging:
Die Logs der einzelnen
Services werden in einem
„Topf“ aggregiert und
ausgewertet.