Viele kleine Dienste zähmen

Spring Cloud – Das Microservices-Framework

Eberhard Wolff
© shutterstock.com/phloxii

Microservices stellen Entwickler vor neue Herausforderungen: Viele kleine Dienste müssen koordiniert werden. Die Kommunikation zwischen diesen Diensten kann ausfallen, so dass man sich mit neuartigen Fehlerszenarien beschäftigen muss. Genau dieser Herausforderungen nimmt sich das neue Projekt Spring Cloud an.

Der erste Meilenstein von Spring Cloud ist gerade erschienen. Es ist nicht eine einzige Technologie, sondern eine Sammlung verschiedener Ansätze, um die Herausforderungen von verteilten Systemen, wie sie bei der Entwicklung von Microservices entstehen, besser zu meistern. Microservices teilen Systeme in eine Vielzahl von Services auf, die typischerweise über REST kommunizieren. Dadurch werden Anwendungen zu verteilten Systemen, die wesentliche schwieriger zu handhaben sind. Schließlich muss eine Vielzahl von Prozessen auf verschiedenen Servern konfiguriert und überwacht werden. Die Kommunikation zwischen den Bestandteilen der Anwendung erfolgt nun über das Netzwerk und kann daher ausfallen.

Spring Cloud Config

Spring Cloud Config stellt eine Lösung für die Konfiguration einer Microservices-Architektur dar. Es bietet ein zentralisiertes Konfigurationsmanagement, so dass alle im Netzwerk verteilten Microservices zentral konfiguriert werden können. Der Config Server liefert dazu Konfigurationen im JSON-Format über eine REST-Schnittstelle aus. Die Konfigurationsdaten stellt ein Git-Repository zur Verfügung, so dass sie versioniert und auch leicht zusammen mit der Software verwaltet werden können. Die Schnittstelle von Spring Cloud Config kann natürlich prinzipiell von beliebigen Clients genutzt werden – besonders einfach ist es jedoch mit Spring Boot. Dann muss nur eine einzige zusätzliche Abhängigkeit in der Anwendung vorhanden sein, um die Konfigurationseinstellungen vom zentralen Service auszulesen. Konfigurationsänderungen können auch an die Dienste im Netz weitergereicht werden, so dass die Rekonfiguration einer Anwendung ebenfalls möglich ist. Spring Cloud Config unterstützt Verschlüsselung. So müssen Daten wie Passwörter nicht im Klartext im Git-Repository liegen. Da der Spring Cloud Config Server eine Spring-Boot-Anwendung ist, kann sie auch erweitert werden. So kann der Zugriff beispielsweise mithilfe von Spring Security abgesichert werden.

Spring Cloud Netflix

Netflix ist in Deutschland erst vor Kurzem mit einem Online-Streaming-Dienst für Videos gestartet. In den USA ist es schon länger für einen erheblichen Teil des Internet-Traffics verantwortlich. Netflix nutzt eine Architektur, die auf verteilte Dienste setzt. Dieses System ist sehr widerstandsfähig: Unter anderem wird es mit der Simian Army getestet. Dabei wird auch der Ausfall von Servern simuliert – die das System natürlich ohne Beeinträchtigung der Funktionalität überstehen soll. Normalerweise bedeutet der Ausfall eines Servers ein erhebliches Problem für ein Software-System.

Netflix ist ein Pionier der Microservices-Architekturen – und stellt vor allem viele Technologien für den Aufbau solcher Systeme als Open Source zur Verfügung. Spring Cloud integriert einige dieser Technologien in die Spring-Welt, um so die Nutzung dieser Werkzeuge weiter zu vereinfachen:

  • Eureka dient zur Service Discovery, führt also Buch über die im Netzwerk verfügbaren Dienste. Eine Spring-Anwendung kann als Instanz dienen – sich also bei Eureka als Dienst registrieren. Oder sie kann als Client agieren – dann kann die Anwendung andere Services finden. Außerdem kann der Eureka-Server als Spring-Boot-Anwendung starten, was die Nutzung wesentlich vereinfacht.
  • Ein echter Klassiker unter den Netflix-Tools ist mittlerweile Hystrix. Es stellt im Wesentlichen eine Implementierung des Pattern Circuit Breaker aus dem Buch „Release It“ von Michael Nygard dar. Bei dem Ausfall eines Systems wird nach der ersten Fehlermeldung die Kommunikation mit dem System unterbrochen. Weitere Aufrufe werden also gar nicht mehr an das ausgefallene System weitergeleitet. Dadurch wird vermieden, dass die Systeme sofort mit der vollen Last konfrontiert werden, wenn sie wieder zur Verfügung stehen. Außerdem kann so dem Aufrufer eine Fehlersituation sofort mitgeteilt werden. Wenn ein Timeout auftritt, muss der Aufrufer den Timeout nur einmal abwarten. Alle folgenden Aufrufe schlagen sofort fehl. Circuit Breaker vermeidet, dass sich der Ausfall eines Systems auf andere Systeme auswirkt. Dazu muss das aufrufende System natürlich sinnvoll mit dem Ausfall der anderen Systeme umgehen. Hystrix bietet eine Implementierung des Circuit-Breaker-Patterns. Durch Spring Cloud kann Hystrix sehr einfach in Spring-Anwendungen integriert werden – es müssen nur die passenden Annotationen an die Spring Beans geschrieben werden. Ebenso ist es einfach möglich, Spring-Anwendungen mit einem Hystrix-Dashboard zu versehen, in dem der Stand der verschiedenen Circuit Breaker untersucht werden kann.
  • Mit Feign ist ein vereinfachter Zugriff auf REST-Web-Services möglich. Letztendlich können durch diese Bibliothek mit einfachen Java-Schnittstellen REST-Systeme angesprochen werden. Mit den üblichen Spring-Annotationen wie @RequestMapping kann ein Interface annotiert werden. Aufrufe an das Interface werden dann an den REST-Web-Service weitergeleitet. So wird die Nutzung eines REST-Web-Services genauso einfach wie die Nutzung jedes anderen Java-Objekts.
  • Ribbon ist eine Library, mit der die Kommunikation zu anderen Servern um Load Balancing oder Ausfallsicherheit ergänzt werden kann, und zwar auf der Client-Seite. Dazu nutzt es Hystrix. Es kann Eureka nutzen, um die Service-Instanzen zu finden. Mit Spring Cloud wird Ribbon in das Spring-Ökosystem integriert – und kann beispielsweise hinter den Kulissen im RestTemplate verwendet werden, um REST-Web-Services aufzurufen.
  • Die Zuul-Bibliothek dient dem Routing. Nach außen kann eine Website aussehen, als würde sie von einem einzigen Server angeboten. Gerade bei einer Microservices-Architektur kann es aber vorkommen, dass einzelne Teile der Anwendung von verschiedenen Microservices umgesetzt werden. So kann die Benutzerverwaltung unter dem URL http://myshop.de/user angeboten werden und der Katalog unter http://myshop.de/catalog . Aber hinter den Kulissen gibt es jeweils einen Dienst, der diese Funktionalität implementiert. Mit Zuul kann das dafür notwendige Routing implementiert, also bestimmte URLs auf andere Server gemappt werden. Mit Spring Cloud kann eine Spring-Anwendung recht einfach so erweitert werden, dass sie Aufrufe an bestimmte URLs an andere Dienste weiterleitet.
  • Archaius dient zur Konfiguration von Anwendungen und steht damit in Konkurrenz zu Spring Cloud Config. In Spring Cloud wird die Nutzung von Spring Cloud Config empfohlen, aber Archaius ist notwendig, um die anderen, in Spring Cloud integrierten Netflix-Projekte zu konfigurieren. Daher muss es ebenfalls in Spring Cloud integriert werden.

Spring Cloud Bus

Der Spring Cloud Bus dient dazu, Anwendungen mit einem asynchronen Mechanismus zu verbinden. So können beispielsweise Änderungen an der Konfiguration zu den verschiedenen Diensten propagiert werden. Dieser Anwendungsfall ist auch schon implementiert. Aber langfristig soll der Spring Cloud Bus das Management verteilter Systeme vereinfachen – wobei er natürlich auch für andere Arten von Nachrichten genutzt werden kann. Intern nutzt der Spring Cloud Bus das AMQP-Protokoll und als Implementierung RabbitMQ. Diese Lösung hat sich in der Praxis für skalierbare Anwendungen bewährt. Andere Technologien werden sicher folgen.

Spring Cloud Security

Sicherheit ist bei Microservices eine Herausforderung: Die Information, welcher Benutzer zu einem Request gehört, muss von Microservice zu Microservice weitergereicht werden. Den Benutzernamen und das Passwort mit jedem Request weiterzuschicken erscheint kaum sinnvoll – dann müsste jeder Service wieder den Benutzernamen und das Passwort überprüfen. Stattdessen kann OAuth2 genutzt werden, bei dem sich der Nutzer bei einem Server einmal authentifiziert und dann jeden Dienst nutzen kann. Spring Cloud bietet eine recht einfach Möglichkeit an, um eine Anwendung mit OAuth2 abzusichern und dann die OAuth2-Token auch an andere Dienste weiterzuschicken.

Spring Cloud und Spring Boot

Spring Cloud setzt auf Spring Boot auf. Das bedeutet konkret, dass es die Spring Boot CLI erweitert. Dieses Werkzeug kann genutzt werden, um Spring-Boot-Anwendungen mit Groovy zu starten und zu testen. Spring Cloud erweitert diese Anwendung so, dass sie auch mit Spring-Cloud-Anwendungen arbeiten kann. Außerdem gibt es Spring Boot Starter für Spring Cloud. Diese Bibliotheken erleichtern das Dependency Management. Dadurch wird die Nutzung von Spring Cloud sehr einfach – und Spring Boot kann noch mehr typische Herausforderungen für die Implementierung von Microservices lösen. Spring Boot ist sowieso schon eine gute Plattform für Microservices, weil Spring-Boot-Anwendungen zur Laufzeit ohne Application Server auskommen können und so die Komplexität des Deployments geringer ist. Das macht sich in Microservices-Umgebungen bezahlt, weil dort sehr viele Anwendungen deployt werden müssen. Jede Vereinfachung ist äußerst willkommen.

Fazit

Durch Microservices werden verteilte Systeme zunehmend wichtiger. Spring Cloud enthält Technologien, um die typischen Herausforderungen solcher Systeme zu lösen. Dazu zählt das Verteilen der Konfigurationsdaten, das Auffinden der Services, die Absicherung gegen Ausfälle oder Lastspitzen und Sicherheit. Spring Cloud erfindet das Rad dabei nicht zum zweiten Mal, sondern bedient sich aus dem umfangreichen Technologieschatz von Netflix, wo es sinnvoll ist. Der Fokus liegt auf Komplexitätsreduktion, der einfachen Nutzung der Technologien und der Integration in das Spring-Ökosystem. Für die einfache Nutzung ist auch die Integration in Spring Boot sehr sinnvoll. So nimmt sich Spring der Herausforderungen bei der Entwicklung von Microservices an – und stellt aktuell den vollständigsten Ansatz in der Java-Community dar.

Aufmacherbild: spring cloud word von shutterstock.com / Urheberrecht: phloxii

Geschrieben von
Eberhard Wolff
Eberhard Wolff
Eberhard Wolff ist Fellow bei innoQ und arbeitet seit mehr als fünfzehn Jahren als Architekt und Berater, oft an der Schnittstelle zwischen Business und Technologie. Er ist Autor zahlreicher Artikel und Bücher, u.a. zu Continuous Delivery und Microservices und trägt regelmäßig als Sprecher auf internationalen Konferenz vor. Sein technologischer Schwerpunkt sind moderne Architektur- und Entwicklungsansätze wie Cloud, Continuous Delivery, DevOps, Microservices und NoSQL.
Kommentare

Hinterlasse einen Kommentar

1 Kommentar auf "Spring Cloud – Das Microservices-Framework"

avatar
400
  Subscribe  
Benachrichtige mich zu:
Michael Kaluza
Gast

Guten Tag Herr Wolff,

ihr Artikel ist zwar schon etwas älter, aber immer noch sehr hilfreich für den Einstieg (sowie auch Ihr Buch über MicroServices – gerade das Beispiel mit dem Netflix Stack hat mir sehr geholfen).

Zu meiner eigentlichen Frage:
Sie haben folgendes geschrieben:
„In Spring Cloud wird die Nutzung von Spring Cloud Config empfohlen, aber Archaius ist notwendig, um die anderen, in Spring Cloud integrierten Netflix-Projekte zu konfigurieren. Daher muss es ebenfalls in Spring Cloud integriert werden.“

Gilt dies immer noch? Muss man tatsächlich – wenn man die Netflix-Projekte nutzt – auch Archaius verwenden oder reicht lediglich Spring Cloud Config?

Viele Grüße
Michi