Einführung in den Spring Cloud Rest Client mit Netflix Ribbon

1. Einführung

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

Neben den clientseitigen Lastausgleichsalgorithmen bietet Ribbon auch weitere Funktionen:

  • Service Discovery Integration - Ribbon Load Balancer bieten

Service Discovery in dynamischen Umgebungen wie einer Cloud. Integration mit Die Komponente zum Erkennen von Eureka- und Netflix-Diensten ist im Menüband enthalten Bibliothek Fault Tolerance ** - Die Ribbon-API kann dynamisch feststellen, ob

Die Server sind in einer Live-Umgebung betriebsbereit und können dies erkennen die Server, die ausgefallen sind Konfigurierbare Lastausgleichsregeln ** - Multifunktionsleiste unterstützt

RoundRobinRule , AvailableFilteringRule , WeightedResponseTimeRule ist standardmäßig vorhanden und unterstützt auch das Definieren benutzerdefinierter Regeln

Die Ribbon-API basiert auf dem Konzept namens "Named Client". Bei der Konfiguration von Ribbon in unserer Anwendungskonfigurationsdatei geben wir einen Namen für die Liste der Server an, die für den Lastausgleich enthalten sind.

Nehmen wir es für eine Runde.

2. Abhängigkeitsmanagement

Die Netflix Ribbon-API kann zu unserem Projekt hinzugefügt werden, indem die unten stehende Abhängigkeit in unsere pom.xml eingefügt wird:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

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 und 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 in der Konfigurationsdatei unter einem benannten Client definiert sind.

4. Bandkonfiguration

Über die Ribbon-API können wir die folgenden Komponenten des Lastenausgleichs konfigurieren:

  • Rule - Logikkomponente, die die Lastausgleichsregel we angibt

verwenden in unserer Anwendung ** Ping - Eine Komponente, die den Mechanismus angibt, den wir zur Bestimmung verwenden

Verfügbarkeit des Servers in Echtzeit ** ServerList - kann dynamisch oder statisch sein. In unserem Fall verwenden wir eine

statische Liste der Server und daher definieren wir sie direkt in der Konfigurationsdatei der Anwendung

Lassen Sie eine einfache Konfiguration für die Bibliothek schreiben:

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 Regel WeightedResponseTimeRule verwendet haben, um den Server und den PingUrl -Mechanismus zu bestimmen, um die Verfügbarkeit des Servers in Echtzeit zu ermitteln.

Gemäß dieser Regel wird jedem Server eine Gewichtung entsprechend der durchschnittlichen Antwortzeit zugewiesen. Je geringer die Antwortzeit, desto geringer die Gewichtung.

Diese Regel wählt zufällig einen Server aus, bei dem die Möglichkeit durch das Gewicht des Servers bestimmt wird.

Das PingUrl sendet an jede URL einen Ping, um die Verfügbarkeit des Servers zu ermitteln.

5. application.yml

Nachfolgend 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 Folgendes angegeben:

  • Anwendungsname

  • Portnummer der Anwendung

  • Benannter Client für die Liste der Server: "Ping-Server"

  • Deaktivierte Eureka-Serviceerkennungskomponente durch Festlegen von eureka:

enabled bis false ** Definiert die Liste der Server, die für den Lastausgleich verfügbar sind

Fall 2 Server ** Konfigurierte Serveraktualisierungsrate mit ServerListRefreshInterval

6. RibbonClient

Lassen Sie uns nun das Hauptanwendungskomponenten-Snippet einrichten. Dort verwenden wir RibbonClient , um den Lastausgleich anstelle des 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(
          "http://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. Die Klasse wurde mit @ RibbonClient mit einem Namen und einer Konfigurationsklasse versehen.

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

Beachten Sie, dass wir das RestTemplate auch mit @ LoadBalanced annotiert haben. Dies legt nahe, dass wir einen Lastausgleich und in diesem Fall das Ribbon wünschen.

7. Ausfallsicherheit im Farbband

Wie wir bereits in diesem Artikel besprochen haben, bietet die Ribbon-API nicht nur clientseitige Lastausgleichs-Algorithmen, sondern auch eine Ausfallsicherheit.

Wie bereits erwähnt, kann die Ribbon-API die Verfügbarkeit des Servers durch das ständige Ping von Servern in regelmäßigen Abständen bestimmen und kann Server, die nicht live sind, überspringen.

Darüber hinaus implementiert es auch ein Circuit Breaker-Muster, um die Server anhand bestimmter Kriterien herauszufiltern.

Das Circuit Breaker-Muster minimiert die Auswirkungen eines Serverausfalls auf die Leistung, indem eine Anfrage an den Server, die ausfällt, schnell abgelehnt wird, ohne auf ein Timeout zu warten. Wir können diese Circuit Breaker-Funktion deaktivieren, indem Sie die Eigenschaft niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped auf false setzen.

Wenn alle Server inaktiv sind und somit kein Server für die Anforderung verfügbar ist, 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 bedienen" .

8. Fazit

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

Den vollständigen Quellcode für das oben beschriebene Beispiel finden Sie im https://github.com/eugenp/tutorials/tree/master/spring-cloud/spring-cloud-ribbon-client …​