Microservices Frameworks

Von: Thomas Bayer
Datum: 10. Oktober 2019

Betrieb und Cloudfähigkeit stellen an Microservices spezielle Anforderungen. Beispielsweise können mehrere Instanzen eines Microservices in der Cloud betrieben werden. Die Microservices müssen konfiguriert und im Netzwerk entdeckt werden. Die Cloud sollte nicht funktionsfähige Instanzen erkennen und neu starten. An monolithischen Anwendung die nur mit einer oder wenigen Deployment Einheit betrieben werden, werden diese Anforderungen nicht in diesem Maße gestellt. Die Eigenschaften, die die Cloud Fähigkeit sicherstellen, können zeitaufwendig selbst entwickelt werden, oder es wird dafür ein Microservices Framework verwendet.

1. Cloud Features

Jeder einzelne Microservice benötigt in der Regel einige der hier aufgeführten Features.

Konfiguration

Services müssen mit Konfigurationswerten abhängig von der Umgebung z.B. Entwicklung, Test oder Produktion versorgt werden. Es könnte auch erforderlich sein, die Konfiguration im laufenden Betrieb zu ändern.

Health Check

Der Health Check gibt Auskunft über die Einsatzbereitschaft eines Services. Bevor ein Service sich „gesund“ meldet, sollte der Service die Verfügbarkeit seiner Ressourcen und die Einsatzbereitschaft seiner Abhängigkeiten überprüfen. Zu den Abhängigkeiten zählen u.a. die Datenbankverbindung oder die Verfügbarkeit der Services, die vom Microservice aufgerufen werden.

Service Discovery

In der Cloud haben Services nicht immer die selbe IP-Adresse oder Port-Nummer. Das Service Discovery erlaubt einem Service andere Service zu finden, um diese aufzurufen. Service Discovery kann z.B. über eine Registry oder über Proxy Server ( API Gateways) realisiert werden.

Fault Tolerance

Services oder das Netzwerk können ausfallen. Kann ein Service damit umgehen, ist er „Fault Tolerant“. Diese Eigenschaft kann z.B. mit der Wiederholung von gescheiterten Aktionen z.B. Service Aufrufen und mit alternativen Aktionen und Defaultwerten erzielt werden.

Monitoring und Metriken

Je mehr Services betrieben werden, desto schwieriger wird es, Kennzahlen zu Betrieb und der Ressourcennutzung zu bekommen. Mit der Monitoring Funktionalität wird die Anbindung an ein zentrales Monitoring System und Dashboard erleichtert. Ein im Microservices Umfeld beliebtes Monitoring System ist Prometheus in Verbindung mit Grafana als Dashboard Lösung.

Tracing

Mit dem Tracing können Service Aufrufe auch über Servicegrenzen hinaus nachverfolgt werden. Beispiele für Tracing Lösungen sind Zipkin und Jaeger.

Security

Microservices stellen erhöhte Anforderungen an die Sicherheit. Für die Verschlüsselung genügt es nicht, wie beim Monolithen ein Zertifikat auf dem Server abzulegen. Es kann erforderlich sein, auf jedem einzelnen Service ein Zertifikat einzurichten. Weitere Anforderungen sind Authentifizierung, Autorisierung oder die Weitergabe der Identität des Aufrufers.

Log Aggregation

Die zentrale Zusammenführung und Auswertung von Logeinträgen ist bei Microservices ein absolutes Muss. Das Durchsuchen von duzenden Logdateien, die in Docker Containern verstreut sind, ist nicht praktikabel. Log Features unterstützen das Abziehen der Logeinträge und die Übergabe an einen zentralen Logdienst.

Die aufgezählten Features kommen oft für Microservices zum Einsatz. Darüber hinaus gibt es noch weitere Features, die die Frameworks anbieten. Meist kommen nicht alle, sondern nur ein Teil der Features in einem Service zur Anwendung.

2. Deployment

Die Installation und der Betrieb eines Microservices müssen isoliert durchgeführt werden können. Anstatt eines Application Servers verwendet man bei den Microservices z.B. Container, virtuelle Maschinen oder isolierte virtuelle Java Maschinen.

2.1 Self-Contained Applications und Fat Jars

Ein „dickes“ Jar ist ein Java Archiv, bei dem der Application Server bzw. Web Container samt allen notwendigen Bibliotheken ins Archiv integriert werden. Die Anwendung hat so immer ihre Laufzeitumgebung dabei. Fat Jars sind mit ca. 20 bis 100 Mbytes wesentlich größer als Anwendungen für Application Server. Dafür gestaltet sich der Betrieb einfacher und ist besser mit DevOps Prinzipien umsetzbar. Außer einer virtuellen Maschine wird keine weitere Software für die Ausführung benötigt.

2.2 Container und Cloud Support

Prinzipiell kann fast alles im Container laufen. Die Frameworks unterstützen z.B. mit generierten Dockerfiles, Fat Jars oder der Graal VM den Betrieb im Container.

3 Was ist ein Microservices Framework?

Microservices Frameworks erleichtern die Implementierung der obigen Features und unterstützen Deployments wie Fat Jar und Container.

Die Basis für die Frameworks Spring Boot bzw. Cloud, „Microprofile“ und Micronaut für die Java Plattform bildet die Dependency Injection, bei der Komponenten flexibel verbunden werden können.

Für die Service zu Service Kommunikation enthalten die Frameworks REST API Clients, die sich mit den Funktionen Retries, Failover oder Circuit Breaker kombinieren lassen.

3.1 Microservices Frameworks

Microservices sind nicht auf eine Programmiersprache oder Plattform festgelegt. Eine Stärke der Micoservices ist es, verschiedene Technologien und Sprachen gleichzeitig einsetzen zu können. Dennoch kann die Wahl einer Plattform entscheidenden Einfluss auf die Entwicklung und den Betrieb von Microservices haben. Microservices erfordern spezifische Eigenschaften wie Ausfallsicherheit, Cloud Support oder Monitoring, die von der Plattform unterstützt werden können. Frameworks können helfen, diese Eigenschaften schnell und effizient umzusetzen. So kann die Entscheidung für ein Framework sogar wichtiger sein, als die Entscheidung für eine Plattform oder Programmiersprache.

4 Vor- und Nachteile

Die Verwendung eines Frameworks für die Entwicklung von Microservices bringt die folgenden Vor- und Nachteile mit sich.

Vorteile

  • Die Entwicklung eines Service geht wesentlich schneller, da der Programmierer sich auf die eigentliche Funktionalität konzentrieren kann.
  • Der Code eines Services ist kürzer
  • Die Bereitschaft für die Cloud kann schneller erreicht werden
  • Es muss kein Infrastrukturcode selbst entwickelt werden.

Nachteile

  • Die Frameworks erfordern eine Einarbeitung und bringen einige Konzepte mit, die verstanden werden müssen.
  • Die Frameworks arbeiten alle mit „Magie“, die Funktionalität hinzufügt, ohne dass der Entwickler gefragt wird. Oft wissen Entwickler nicht genau was genau was passiert und geben Kontrolle ab.
  • Die Frameworks sind auf zahlreiche Bibliotheken verteilt, die alle ihre eigenen Versionsnummern mitbringen. Dies führt oft zu Versionsproblemen und mühseliger Fehlersuche.

5 Fazit

Spezielle Frameworks sind für die Entwicklung und den Betrieb von Microservices nicht nötig. Die Frameworks erleichtern aber erheblich die Entwicklung von Cloud fähigen Microservices. Wenn mehr als 3 Services zu entwickeln sind, lohnt sich der Einarbeitungsaufwand für ein Framework.