Die Entwicklung einer Cloud-native-Anwendung ist nur eine Seite der Medaille, die andere Seite ist die Cloud-Umgebung, in der die Anwendung betrieben werden soll. Als Architekt muss man Entscheidungen treffen, die auch von der Laufzeitumgebung abhängig sind. Einige Aspekte, wie zum Beispiel Konfiguration, Resilienz, Health Checks, Metriken, Request Tracing und Service Discovery besitzen eine starke Kopplung mit der Cloud-Umgebung.
Istio, das als offene Plattform auf beispielsweise Kubernetes betrieben werden kann, bietet diese Funktionalitäten. Auf der anderen Seite besitzt MicroProfile auch eine Menge von Spezifikationen, die bei der Implementierung der Cloud-native-Anwendung hilfreich sein können. Die Session startet mit einer kurzen Einführung in Istio und MicroProfile und zeigt im Anschluss, wie diese beiden Welten in einer Cloud-native-Anwendung am besten miteinander kombiniert werden können.
Microservices mit Java EE - am Beispiel von IBM Liberty
Service Mesh mit Istio und MicroProfile - eine harmonische Kombination?
1. Service Mesh mit Istio und
MicroProfile
-
eine harmonische Kombination?
Michael Hofmann
Hofmann IT-Consulting
info@hofmann-itconsulting.de
https://hofmann-itconsulting.de
2. Service Mesh
„The term service mesh is used to describe the network of
microservices that make up such application and the
interactions between them.“ (istio.io)
Anzahl der Services steigt ...
Ohne Werkzeug lässt sich
Service Mesh (Big Ball of Mud)
nicht beherrschen!
Quelle: https://twitter.com/Werner/status/741673514567143424
(Werner Vogels, CTO Amazon)
7. What is Eclipse MicroProfile?
● Eclipse MicroProfile is an open-source community specification for Enterprise Java
microservices
● A community of individuals, organizations, and vendors collaborating within an open
source (Eclipse) project to bring microservices to the Enterprise Java community
7
Quelle: microprofile.io
14. Konfiguration: Stolperstein
Namenskonflikt der Variablen
K8S Environment Variables:
"must be a C identifier
(matching regex [A-Za-z_][A-Za-z0-9_]*)"
bei MicroProfile: entsprechend Package-Konvention mit .
Seit MicroProfile Config 1.3:
Mapping von non-alphanumeric auf .
(Mapping-Reihenfolge: abc.key, abc_key, ABC_KEY)
15. Konfiguration: Reload
Environment-
Variablen können nur
bei Start des Pods
gesetzt werden!
Ausweg: K8S
ConfigMap als
Volume mounten
@Inject
@ConfigProperty(name="xyz.key", defaultValue="100")
private javax.inject.Provider<Long> xyz;
public interface ConfigSource {
Map<String, String> getProperties();
default Set<String> getPropertyNames(){...}
default int getOrdinal(){...}
String getValue(String propertyName);
String getName();
...
}
18. Resilienz: wer die Wahl hat...
●
Frameworks (Hystrix (eol!), Resilience4J, Failsafe, MicroProfile Fault Tolerance)
ABER:
●
richtiges Pattern und Werte: erst in Produktion erkannt (neues Deployment!)
●
Abhängigkeit Bibliothek zur Programmiersprache
●
Versionsmix der Bibliotheken über alle Services hinweg
●
Abhängigkeiten zu anderen Frameworks (Service-Call → LoadBalancing → Service Registry)
●
Service Registry für andere Services verwendbar? Doppelte Service Registry? (hohe
Kopplung der Services an Infrastruktur-Komponenten!)
●
Lernkurve bzgl. vieler Frameworks bei jedem Entwickler-Team
19. Resilienz Fazit
●
Probleme der Infrastruktur sollten auch dort behoben werden!
●
Fallback-Schalter
●
Healthchecks durch Sidecar
auf Loadbalancing Pool
●
Istio Fault Injection:
Resilienz einfach testen
●
Globale Wirkung
Resilienz im Service Mesh!
apiVersion:networking.istio.io/
v1alpha3
kind: VirtualService
metadata:
name: ratings
...
spec:
hosts:
- ratings
http:
- fault:
delay:
fixedDelay: 7s
percent: 100
20. Tracing
●
Vom Sidecar oder Istio-Gateway erzeugt
●
Service schickt Header mit (MP OpenTracing)
●
Istio: Jaeger (OpenZipkin, LightStep)
●
Trace-Anzeige über alle beteiligte Komponenten
●
Datenmenge
– Reduktion: PILOT_TRACE_SAMPLING = "0.1"
– Tracing trotzdem erzwingen: Header x-envoy-force-trace = „true“
x-request-id
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
x-ot-span-context
21. MicroProfile Rest Client
●
Trace-Header von Client
– JAX-RS Client
– MicroProfile Rest Client erst seit Spec 1.2 (02/2019)
●
Namensproblem bei Config (geht, … nicht beschrieben in der
Spec!)