Einführung in Spring Cloud Rest Client mit Netflix Ribbon

1. Einleitung

Netflix Ribbon ist eine IPC-Cloud-Bibliothek (Inter Process Communication). Ribbon bietet hauptsächlich clientseitige Lastausgleichsalgorithmen.

Neben den clientseitigen Lastausgleichsalgorithmen bietet Ribbon noch weitere Funktionen:

  • Service Discovery Integration - Ribbon Load Balancer bieten Service Discovery in dynamischen Umgebungen wie einer Cloud. Die Integration mit der Eureka- und Netflix-Serviceerkennungskomponente ist in der Multifunktionsleistenbibliothek enthalten
  • Fehlertoleranz - Die Multifunktionsleisten-API kann dynamisch bestimmen, ob die Server in einer Live-Umgebung aktiv sind, und die Server erkennen, die nicht verfügbar sind
  • Konfigurierbare Lastausgleichsregeln - Ribbon unterstützt sofort RoundRobinRule , AvailabilityFilteringRule und WeightedResponseTimeRule sowie das Definieren benutzerdefinierter Regeln

Die Ribbon-API basiert auf dem Konzept „Named Client“. Während der Konfiguration von Ribbon in unserer Anwendungskonfigurationsdatei geben wir einen Namen für die Liste der Server an, die für den Lastenausgleich enthalten sind.

Nehmen wir es für eine Spritztour.

2. Abhängigkeitsmanagement

Die Netflix Ribbon-API kann zu unserem Projekt hinzugefügt werden, indem die folgende Abhängigkeit zu unserer pom.xml hinzugefügt wird :

 org.springframework.cloud spring-cloud-starter-netflix-ribbon 

Die neuesten Bibliotheken finden Sie hier.

3. Beispielanwendung

Um die Funktionsweise der Ribbon-API zu sehen, erstellen wir eine Beispiel-Microservice-Anwendung mit Spring RestTemplate und erweitern sie mit der Netflix Ribbon-API zusammen mit der Spring Cloud Netflix-API.

Wir verwenden eine der Lastausgleichsstrategien von Ribbon, WeightedResponseTimeRule , um den clientseitigen Lastausgleich zwischen zwei Servern zu ermöglichen, die in unserer Konfigurationsdatei unter einem benannten Client in unserer Anwendung definiert sind.

4. Multifunktionsleistenkonfiguration

Mit der Ribbon-API können wir die folgenden Komponenten des Load Balancers konfigurieren:

  • Regel - Logikkomponente, die die Lastausgleichsregel angibt, die wir in unserer Anwendung verwenden
  • Ping - Eine Komponente, die den Mechanismus angibt, mit dem wir die Verfügbarkeit des Servers in Echtzeit ermitteln
  • ServerList - kann dynamisch oder statisch sein. In unserem Fall verwenden wir eine statische Liste von Servern und definieren sie daher direkt in der Anwendungskonfigurationsdatei

Schreiben Sie eine einfache Konfiguration für die Bibliothek:

public class RibbonConfiguration { @Autowired IClientConfig ribbonClientConfig; @Bean public IPing ribbonPing(IClientConfig config) { return new PingUrl(); } @Bean public IRule ribbonRule(IClientConfig config) { return new WeightedResponseTimeRule(); } }

Beachten Sie, wie wir die WeightedResponseTimeRule- Regel verwendet haben, um den Server zu bestimmen, und den PingUrl- Mechanismus, um die Verfügbarkeit des Servers in Echtzeit zu bestimmen.

Gemäß dieser Regel erhält jeder Server ein Gewicht entsprechend seiner durchschnittlichen Antwortzeit, je geringer die Antwortzeit, desto geringer das Gewicht. Diese Regel wählt zufällig einen Server aus, bei dem die Möglichkeit durch das Gewicht des Servers bestimmt wird.

Und die PingUrl pingt jede URL an, um die Verfügbarkeit des Servers zu bestimmen.

5. application.yml

Unten finden Sie die Konfigurationsdatei application.yml , die wir für diese Beispielanwendung erstellt haben:

spring: application: name: spring-cloud-ribbon server: port: 8888 ping-server: ribbon: eureka: enabled: false listOfServers: localhost:9092,localhost:9999 ServerListRefreshInterval: 15000

In der obigen Datei haben wir angegeben:

  • Anwendungsname
  • Portnummer der Anwendung
  • Benannter Client für die Liste der Server: "Ping-Server"
  • Deaktivierte Eureka-Diensterkennungskomponente durch Setzen von eureka: enabled auf false
  • Definierte die Liste der für den Lastenausgleich verfügbaren Server, in diesem Fall 2 Server
  • Konfigurierte die Serveraktualisierungsrate mit ServerListRefreshInterval

6. RibbonClient

Lassen Sie uns nun das Hauptanwendungskomponenten-Snippet einrichten, in dem wir den RibbonClient verwenden , um den Lastausgleich anstelle der einfachen RestTemplate zu aktivieren :

@SpringBootApplication @RestController @RibbonClient( name = "ping-a-server", configuration = RibbonConfiguration.class) public class ServerLocationApp { @LoadBalanced @Bean RestTemplate getRestTemplate() { return new RestTemplate(); } @Autowired RestTemplate restTemplate; @RequestMapping("/server-location") public String serverLocation() { return this.restTemplate.getForObject( "//ping-server/locaus", String.class); } public static void main(String[] args) { SpringApplication.run(ServerLocationApp.class, args); } }

Wir haben eine Controller-Klasse mit der Annotation @RestController definiert . Wir haben die Klasse auch mit @RibbonClient mit einem Namen und einer Konfigurationsklasse versehen.

Die hier definierte Konfigurationsklasse ist dieselbe Klasse, die wir zuvor definiert haben und in der wir die gewünschte Ribbon-API-Konfiguration für diese Anwendung bereitgestellt haben.

Beachten Sie , dass wir das RestTemplate auch mit @LoadBalanced kommentiert haben, was darauf hindeutet, dass dies ein Lastausgleich und in diesem Fall mit Ribbon sein soll.

7. Ausfallsicherheit in der Multifunktionsleiste

Wie bereits weiter oben in diesem Artikel erläutert, bietet die Ribbon-API nicht nur clientseitige Algorithmen für den Lastausgleich, sondern verfügt auch über eine integrierte Ausfallsicherheit.

Wie bereits erwähnt, kann die Ribbon-API die Verfügbarkeit des Servers durch ständiges Pingen von Servern in regelmäßigen Abständen ermitteln und die nicht aktiven Server überspringen.

Darüber hinaus wird ein Leistungsschaltermuster implementiert, um die Server nach festgelegten Kriterien herauszufiltern.

Das Leistungsschaltermuster minimiert die Auswirkungen eines Serverausfalls auf die Leistung, indem eine Anforderung an den Server, der ausfällt, schnell abgelehnt wird, ohne auf eine Zeitüberschreitung zu warten. Wir können diese Leistungsschalterfunktion deaktivieren, indem wir die Eigenschaft niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped auf false setzen .

Wenn alle Server ausgefallen sind und somit kein Server verfügbar ist, um die Anforderung zu bearbeiten , schlägt pingUrl () fehl und wir erhalten eine Ausnahme java.lang.IllegalStateException mit der Meldung "Es sind keine Instanzen verfügbar, um die Anforderung zu bearbeiten " .

8. Fazit

In diesem Artikel haben wir die Netflix Ribbon API und ihre Implementierung in einer einfachen Beispielanwendung erläutert.

Der vollständige Quellcode für das oben beschriebene Beispiel befindet sich im GitHub-Repository.