Spring Cloud Netflix Konzepte

Was ist Spring?
Das Spring Framework (kurz Spring) ist ein quelloffenes Framework für die Java-Plattform. Ziel des Spring Frameworks ist es, die Entwicklung mit Java/Java EE zu vereinfachen und gute Programmierpraktiken zu fördern. Spring bietet mit einem breiten Spektrum an Funktionalität eine ganzheitliche Lösung zur Entwicklung von Anwendungen und deren Geschäftslogiken; dabei steht die Entkopplung der Applikationskomponenten im Vordergrund. [wikipedia]

Zu den Hauptprojekte von Spring gehören:

  • Spring Boot
  • Spring Framework
  • Spring Cloud Date Flow
  • Spring Cloud
  • Spring Data
  • Spring Integration
  • Spring Batch
  • Spring Security
  • Spring HATEOAS
  • spring REST Docs
  • Spring AMQP
  • Spring Mobile
  • Spring for Android
  • Spring Web Flow
  • Spring Web Services
  • Spring LDAP
  • Spring Session
  • Spring Shell
  • Spring Flo
  • Spring Kafka
  • Spring Statemachine
  • Sprin IO Platform

Zusätzlich beinhaltet Spring die beiden community Projekte:

  • Spring Roo
  • Spring SCALA

Die einzelnen Spring Projekte wie z.B. Spring Cloud bestehen ebenfalls aus einzelne Unterprojekte:

  • Spring Cloud Config
  • Spring Cloud Netflix
  • Spring Cloud Bus
  • Spring Cloud for Cloud Foundry
  • Spring Cloud Open Service Broker
  • Spring Cloud Cluster
  • Spring Cloud Consul
  • Spring Cloud Security
  • Spring Cloud Sleuth
  • Spring Cloud Data Flow
  • Spring Cloud Stream
  • Spring Cloud Stream App Starters
  • Spring Cloud Task
  • Spring Cloud Task App Starters
  • Spring Cloud Zookeeper
  • Spring Cloud for Amazon Web Services
  • Spring Cloud Connectors
  • Spring Cloud Starters
  • Spring Cloud CLI
  • Spring Cloud Contract
  • Spring Cloud Gateway
  • Spring Cloud OpenFeign
  • Spring Cloud Pipelines
  • Spring Cloud Function

Bei Spring Cloud basieren alle Projekte auf Spring Boot.

Spring Cloud Config
Möchte man eine Konfiguration innerhalb der Anwendung verwenden, so gibt es unterschiedliche Möglichkeiten:

  • Configuration innerhalb der Umgebungsvariablen verwenden. Nachteil: wird auf unterschiedlichen Systemen unterschiedlich behandelt.
  • Configuration innerhalb der Anwendung. Nachteil: nach jede Änderung muss die Anwendung neu gebaut und gestartet werden.
  • Configuration innerhalb des Dateisystems. Nachteil: Bei Cloud Anwendungen von außen nicht erreichbar.
  • Configuration innerhalb einer Cloud-Anbieter Infrastruktur. Nachteil: Abhängigkeit von einem Cloud-Anbieter.

Eine alternative Lösung bietet daher Spring Cloud Config.

Das Management der Konfigurationsdateien der einzelnen Microservices wird über den zentralen Spring Cloud Microservice gemanagt. Die Persistierung kann dabei innerhalb eines Versionierungssystems wie z.B. Git erfolgen. Der Zugriff auf die Config Dateien seitens der Microservices (Clients) erfolgt via REST. Die Übertragung der Parameter kann symmetrisch oder Asymmetrisch verschlüsselt werden.

Spring Cloud Netflix (Eureka)
Bei Eureka handelt es sich um ein Service-Discovery Server.

Service-Discovery bezeichnet die automatische Erkennung von Diensten in einem Rechnernetz. Hierbei kommen Kommunikationsprotokolle zum Einsatz, welche beschreiben, wie sich die Dienste finden, um miteinander kommunizieren können.
Grundsätzlich unterscheidet man zwischen zwei Gruppen von Service-Discovery-Protokollen (SDPs):

  • Dienste registrieren sich in einem zentralen Dienst (einer Registry) und können über diesen gefunden werden.
  • Dienste fragen mittels Broadcasting das gesamte Netzwerk nach einem bestimmten Dienst und der gesuchte Dienst oder eine Registry antwortet.

[Quelle: Wikipedia]

Innerhalb eine Region (z.B. Eureka Cluster DE) können sich Microservices beim Eureka  Server registrieren (Register). Eureka kennt anschließend alle Dienste innerhalb seiner Region.
Nach der Registrierung senden die Dienste nach einem Intervall von x Sekunden ein ‚heartbeat‘ an Eureka (Renew). Für den Fall, dass Eureka kein ‚Renew‘ erhalten sollte, so nimmt er den entsprechenden Dienst aus der Registery.
Die Eureka Server replizieren die (Registery) und die (Renew) Informationen untereinander.
Somit können Dienste Informationen über andere Dienste aus einer entfernten Region abfragen und eine entsprechende Anfrage an den entfernten Dienst starten (Remote Call).

Gegenüber von Eureka ist der Spring Cloud Config Server ein Client.

Spring Cloud Netflix (Ribbon)
Bei Ribbon handelt es sich im Gegensatz zu klassische Server Load Balancer um einen Clientseitigen Load Balancer, der nach Round Robin und weiteren Parametern die Kommunikation mit den Servern oder Serverseitigen Loadbalancer vornimmt.

Spring Cloud Netflix (Feign)
Feign hat die Zielsetzung das Erstellen von HTTP API clients zu vereinfachen.
Hierfür muss lediglich ein Interface deklariert und annotiert werden. Bei der Verwendung von Feign wird Ribbon und Eureka automatisch importiert.

Spring Cloud Netflix (Hystrix)
Bei Hystrix handelt es sich um ein ‚Circuit Breaker‘.

Eine Sicherung (englisch: circuit breaker) ist ein Verhaltensmuster in der Softwareentwicklung. Es dient dazu wiederkehrende Verbindungsfehler zu einer Ressource, wie z. B. einer Datenbank oder einem Webservice, zu entdecken und den Zugriff zu der Ressource für eine vorgegebene Zeit zu blockieren.

Angenommen eine Datenbank ist aufgrund von zu vielen Anfragen überlastet und es kommt zu Timeouts. Dies führt dazu, dass Benutzer, aus psychologischen Gründen, die zuletzt gesetzte Aktion erneut versuchen. Da die Anwendung ohne einer Sicherung für jede Anfrage auf die Datenbank bis zu einem Timeout in einem eigenen Task wartet, kommt es zu einer Erschöpfung des Thread-Pools und die Anwendung fällt ebenfalls aus.

Um dies zu verhindern wird in die Anwendung eine Sicherung eingebaut. Diese erkennt wenn es zu einer großen Anzahl von Verbindungsfehlern kommt und unterbindet den Zugriff auf die Datenbank. Anstatt auf die Datenbank bis zu einem Timeout warten zu müssen, kann die Anwendung gleich einen Fehler zurückliefern bzw. Teile der Anwendung deaktivieren und verbraucht dadurch keine zusätzlichen Threads des Pools. Die Anwendung kann dadurch auch ohne Datenbank, mit eingeschränkter Funktionalität, weiterlaufen. Zudem wird der Datenbank ermöglicht sich zu „erholen“.

Nach einer vorgegebenen Zeit wird die Sicherung wieder geschlossen und die Verbindung zur Datenbank erneut versucht. Scheitert dieser Versuch, wird die Sicherung sofort wieder geöffnet. Andernfalls wird die Funktionalität der Anwendung wiederhergestellt. [Quelle: Wikipedia]


Die obige Abbildung zeigt zunächst einmal eine erfolgreiche Anfrage seitens Client, der über den ‚Circuit Breaker‘ bzw. Hystrix an den Server bzw. Datenbank weitergeleitet wird. Die zweite Anfrage führt zu einem Timeout, da z.B. die DB nicht erreichbar ist.
Die nachfolgenden beiden Anfragen werden seitens Hystrix abgefangen und beantwortet. Hier kann auch eine alternative Route verwendet werden.
Bei der letzten Abfrage existieren die Verbindungsprobleme zum Server nicht, weshalb die Anfrage wieder an den Server weitergereicht wird.

Spring Cloud Netflix (Zuul)
Bei Zuul handelt es sich um ein API-Gateway. Um Zuul zu verstehen, sollten die folgenden Begriffe SOP und CORS bekannt sein.

SOP
Die Same-Origin-Policy (SOP; deutsch „Gleiche-Herkunft-Richtlinie“) ist ein Sicherheitskonzept, das clientseitigen Skriptsprachen wie JavaScript und ActionScript, aber auch Cascading Style Sheets untersagt, auf Objekte (zum Beispiel Grafiken) zuzugreifen, die von einer anderen Webseite stammen oder deren Speicherort nicht der Origin entspricht. Sie stellt ein wesentliches Sicherheitselement in allen modernen Browsern und Webanwendungen zum Schutz vor Angriffen dar. [Quelle: Wikipedia]

CORS
Als Cross-Origin-Requests werden Zugriffe einer Webseite oder Webanwendung auf Ressourcen einer anderen Servers bzw. einer anderen Domain bezeichnet.
Zugriffe dieser Art werden seit 1996 durch die Same-Origin-Policy (SOP) von Webbrowsern verhindert. Allerdings definiert die W3C die Methode des Cross-Origin Resource Sharing (CORS), die Webbrowsern und Clients den Zugriff auf Ressourcen anderer Herkunft wieder ermöglicht. [Quelle: Wikipedia]

Eine Möglichkeit, den Zugriff seitens externe Clients auf internen Ressourcen ohne CORS zu ermöglichen, besteht darin, den internen Zugriff über ein API-Gateway (Zuul) zu ermöglichen.

Zuul erfüllt unter anderem die folgenden Aufgaben:

  • Authentication and Security: Authentifizierung eines Clients beim Zugriff auf die einzelnen Ressourcen
  • Insights and Monitoring: Tracking und Erstellung von Statistiken über die Nutzung der Daten.
  • Dynamic Routing: Dynamisches Routing der Anfragen an die unterschiedlichen Backend Services
  • Stress Testing: Erhöht schrittweise den Traffic zu einem System, um die Leistung zu messen.
  • Load Shedding: Management der Anfragen, indem für jede Anfrage entsprechende Ressourcen reserviert werden und Ablehnung der Anfragen im Falle eines Timeouts.
  • Static Response handling: Es werden bestimmte Responses direct vom Edge beantwortet, statt diese zwecks Verarbeitung an die Cluster weiter zu leiten.
  • Multiregion Resiliency: ….

Spring Cloud Bus
Dieses Feature dient hauptsächlich dazu, zentrale Konfiguration- und Management Informationen zu broadcasten.
Wie unter ‚Cloud Config Server‘ beschrieben, können Konfigurationsinformationen seitens der einzelnen Services angefragt werden. Da sich eine Konfiguration in der Regel selten ändert, kann dabei unnötig Netzwer-Traffic entstehen. Spring Cloud Bus verwendet einen Message Broker, um alle Änderungen, die er vom ‚Cloud Config Server‘ erhält zu publishen. Alle registrierten Services (subscriber) werden anschließend bei einer Änderung informiert und können erst dann den ‚Cloud Config Server‘ nach der veränderten Konfiguration anfragen. Vom Hause aus wird der AMQP Broker unterstützt. Es können jedoch auch weitere Broker wie z.B. Apache Kafka oder RabbitMQ verwendet werden.

Die obige Abbildung zeigt, wie Microservice 1 und 3 nach dem Subscription vom Spring Cloud Bus (Broker) über eine Veränderung informiert werden.