Micronaut für Cloud-native JVM-Microservices

Seite 4: Client-side Load-Balancing

Inhaltsverzeichnis

Um die Zugriffszeit auf Funktionen von Diensten zu optimieren oder mögliche Lastspitzen abzufangen, beziehungsweise die zuvor genannte Resilienz zu erzielen, skalieren Entwickler Microservices bei Bedarf auf mehrere Instanzen. Das ist durch den Einsatz von Tools wie Docker und Kubernetes schon lange kein Problem mehr, sondern gängige Praxis. Die HTTP-Client-Implementierung von Micronaut nutzt zur Verteilung von Requests eine clientseitige Round-Robin-Strategie. Sie kann Anfragen an andere Instanzen des Dienstes weiterleiten, bevor sie überlastet ist. Ribbon von Netflix ist eine Bibliothek, die Micronaut statt des internen Mechanismus zum Load Balancing einsetzen kann.

Anfragen in Microservice-Architekturen landen mitunter bei vielen Diensten. Eine gut durchdachte Architektur sollte gewährleisten, Anfragen von Anfang bis Ende zu verfolgen und Interaktionen zwischen Komponenten zu visualisieren. Tracing-Angebote ermöglichen es, Abhängigkeiten und Latenzprobleme in Architekturen verteilter Systeme über Grenzen hinweg zu identifizieren und zu analysieren.

Micronaut erlaubt mit den Annotationen @NewSpan und @ContinueSpan das Erzeugen und Weiterführen sogenannter Spans. Das sind benannte, zeitlich gekennzeichnete Operationen, die ein zusammenhängendes Segment von Ablauflogik darstellen. Die genannten Annotationen stellen den Einsprung in ein solches Segment und dessen Weiterführung über mehrere Methodenaufrufe dar. Die Annotation @SpanTag zeigt zusätzlich einen Methodenparameter, der den Span taggt. Dadurch können Nutzer verfolgen, wann und wo welche Funktion mit welchen Parametern aufgerufen beziehungsweise welches Segment abgearbeitet wurde. Mehrere Spans in Reihe ergeben zusammen in einem gerichteten azyklischen Graphen einen sogenannten Trace.

Falls die beiden Annotationen für diese Zwecke nicht ausreichend sind, können Entwickler Implementierungen der Open Tracing API verwenden, die weitere Möglichkeiten bereitstellen. Die bekanntesten Vertreter sind Zipkin von Twitter und Jaeger von Uber, das von Dapper und Zipkin inspiriert wurde. Zipkin Brave ist die zugehörige Bibliothek, die beim Sammeln und Übermitteln von Spans zum Einsatz kommt. Die Open-Tracing-Spezifikation und die Zipkin-Dokumentation beschreiben die Funktionsweise des verteilten Tracings im Detail.

Ein Teil von Serverless-Architekturen sind Serverless Functions beziehungsweise Functions as a Service (FaaS). Entwickler erstellen dabei Funktionen, die die Cloud-Umgebung vollständig verwaltet und in ephemeren Prozessen ausführt. Das besondere ist, dass ein FaaS-Server eine Funktion typischerweise für einen bestimmten Zeitraum mit einem Kaltstart auf Touren bringt und sie für eine gewisse Dauer "warm" hält. Das bedeutet, dass insbesondere ein schneller Start einer Funktion kritisch ist, um sie sinnvoll für eine Anfrage bereitzustellen und auszuführen.

Micronaut bietet Unterstützung für die Entwicklung und Bereitstellung von Funktionen für AWS Lambda und jedes FaaS-System, das Funktionen in Form von Containern unterstützt, wie OpenFaaS oder Fn. Funktionen melden sich gegebenfalls beim konfigurierten Service-Discovery-Dienst an, und ein mit @FunctionClient annotierter Client kann sie ansprechen. Entwickler können sie isoliert oder über einen HTTP-Server testen.

Ein weiteres Feature von Micronaut ist das Cloud Configuration Sharing. Damit ist es möglich, Konfigurationen extern abzulegen, damit sich in einem Cloud-Umfeld skalierte Instanzen eines Services eine gemeinsame Konfiguration teilen können und Änderungen direkte Auswirkungen auf alle Instanzen haben.

Abhängig von der Infrastruktur der Applikation kann man beispielsweise unterschiedliche Beans aktivieren. Micronaut erkennt Umgebungen wie Android, Test, Cloud, Amazon EC2, Google Compute, Kubernetes, Heroku, Cloud Foundry, Azure oder die IBM Cloud. Neben einem internen Mechanismus zum manuellen Auflösen verteilter Konfigurationen können Dienste wie Consul oder AWS Systems Manager Parameter Store verwendet werden.

Für die Verarbeitung verteilter Datenströme und Echtzeitdaten ist in der Praxis Apache Kafka beliebt. Mit der Unterstützung von Micronaut für Kafka können Entwickler Message-driven Microservices in wenigen Schritten mit Compile-Time-AOP-Annotationen wie @KafkaClient, @KafkaListener, @Topic, @Body, @Header, @KafkaKey und wenigen Zeilen YAML-Konfiguration verwirklichen. Der Micronaut Guide enthält eine umfassende Anleitung. Eine gleichwertige Unterstützung ist für RabbitMQ angedacht.