[JAVA] Verwenden von Hystrix und Sentinel im Codebeispiel

In dieser Artikelserie stellen wir das Open Source ** Sentinel Java ** Flusskontrollprojekt von ** Alibaba ** im Vergleich zu ** Hystrix ** vor.

In meinem letzten Blog habe ich die beiden Bibliotheken auf hohem Niveau verglichen. Lassen Sie uns nun sehen, wie Sie beide verwenden, während Sie sich das Codebeispiel ansehen.

Beispiel

Das hier verwendete Beispiel stammt aus diesem Spring Tutorial (https://spring.io/guides/gs/circuit-breaker/?spm=a2c65.11461447.0.0.7e4717c6AVEkbf). Dies ist eine Beispiel-App aus einem berühmten Buchladen.

Bevor Sie beginnen, stellen Sie sicher, dass Sie die Schritte in der Originaldokumentation befolgen, um die Beispiel-App herunterzuladen und zu konfigurieren.

Die Probe kann mit geringfügigen Änderungen wiederverwendet werden. Sentinel ist Teil der neuesten Spring Framework-Version. Daher gibt es keine zusätzlichen Abhängigkeitsänderungen.

Gehen wir direkt zu "read / src / main / java / hello / BookService.java" und fügen den folgenden Code ein.

@Service
public class BookService {
  private final RestTemplate restTemplate;
  public BookService(RestTemplate rest) {
    this.restTemplate = rest;
  }
  @SentinelResource(value = "readingList", fallback = "reliable")
  public String readingList() {
    URI uri = URI.create("http://localhost:8090/recommended");
    return this.restTemplate.getForObject(uri, String.class);
  }
  public String reliable() {
    return "Cloud Native Java (O'Reilly)";
  }
}

Wie Sie sehen können, habe ich gerade die Annotation "@ HystrixCommand" durch "@ SentinelResource" ersetzt. Das Attribut value kennzeichnet die Methode, die Sie auf den Leistungsschalter anwenden möchten. Und das Attribut "Fallback" zeigt auf die Funktion "FallbackMethod". Fügen Sie dann die "Fallback" -Funktion "zuverlässig ()" hinzu. Diese Funktion entspricht dem Beispiel.

Bisher ist es ziemlich nah an dem, was Hystrix tut. Wie im vorherigen Artikel erwähnt, steuert Hystrix jedoch den Betrieb des Leistungsschalters. Nach dem Hinweis auf die Ressource werden die Bedingungen zum Starten des Leistungsschalters unverändert verarbeitet.

Sentinel hingegen überlässt die Kontrolle dem Benutzer, der Regeln erstellen muss, um die Bedingungen zu definieren. Lassen Sie uns das tun und eine Regel hinzufügen. Sie können es am Ende der Datei hinzufügen.

DegradeRuleManager.loadRules(Collections.singletonList(
    new DegradeRule("readingList") // resource name
        .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) // strategy
        .setCount(0.5) // threshold
        .setTimeWindow(10) // circuit breaking timeout (in second)
));

Ich habe gerade eine "DegradeRule" erstellt und den Modus auf Ausnahmerate, Schwellenwert auf 0,5 (1 von 2) und Wiederherstellungszeit auf 10 Sekunden eingestellt. DegradeRuleManager lädt und aktiviert diese Regel.

Probieren wir es aus. Es wird nur der Lesedienst gestartet, nicht der Buchhandlungsdienst. Daher schlägt es jedes Mal fehl, wenn eine Anforderung eingeht. Lassen Sie uns nach zwei Versuchen (und zwei Fehlern) die Fallback-Funktion aktivieren.

Cloud Native Java (O'Reilly)

Starten wir nun den Bookstore-Service. Nach 10 Sekunden sehen wir die normale Antwort.

Spring in Action (Manning), Cloud Native Java (O'Reilly), Learning Spring Boot (Packt)

In einer Produktionsumgebung ist es tatsächlich einfacher, diese Regel mithilfe des Sentinel-Dashboards festzulegen, als die Regel über Code hinzuzufügen. Unten ist ein Screenshot.

image.png

Außerdem

Bisher haben wir die gleiche Funktionalität gesehen, die Hystrix ausgeführt hat. In Wirklichkeit braucht Sentinel einen weiteren Schritt. Schauen wir uns ein Beispiel an.

Mit Sentinel können Sie Regeln festlegen, die auf verschiedenen Metriken basieren. In diesem Beispiel wird QPS verwendet.

Suchen wir zunächst nach der Hauptklasse "bookstore / src / main / java / hello / BookstoreApplication.java".

@RestController
@SpringBootApplication
public class BookstoreApplication {
    private static final Logger LOGGER = LoggerFactory.getLogger(BookstoreApplication.class);
    @SentinelResource(value = "readingList", blockHandler = "handleTooManyRequests")
    @RequestMapping(value = "/recommended")
    public String readingList(){
        return "Spring in Action (Manning), Cloud Native Java (O'Reilly), Learning Spring Boot (Packt)";
    }
    public String handleTooManyRequests(BlockException ex) {
        LOGGER.error("Too many requests: " + ex.getClass().getSimpleName());
        return "Sentinel in Action";
    }
  public static void main(String[] args) {
    SpringApplication.run(BookstoreApplication.class, args);
  }

Ich habe "@ SentinelResource" hinzugefügt, aber ich verwende die "blockHandler" -Funktion anstelle der "Fallback" -Funktion. Diese Funktion druckt einfach die Meldung "Sentinel in Aktion". Jetzt müssen wir eine neue Regel hinzufügen, wenn diese Funktion ausgelöst wird.

FlowRule rule = new FlowRule("readingList")
    .setCount(1);
FlowRuleManager.loadRules(Collections.singletonList(rule));

Diese Regel gilt, wenn eine oder mehrere Anforderungen pro Sekunde vorliegen. Ein Teil dieses Codes kann am Ende der Datei hinzugefügt werden.

Bei der ersten Anfrage nach dem Start des "BookStore" -Dienstes müssen wir eine normale Antwort erhalten.

Spring in Action (Manning), Cloud Native Java (O'Reilly), Learning Spring Boot (Packt)

Wenn Sie jedoch mehr als eine Anfrage pro Sekunde stellen, sollte die Funktion "blockHandler" aktiviert sein.

Sentinel in Action

Und nach 1 Sekunde können Sie die normale Reaktion wieder sehen.

image.png

Auch in einer realen Produktionsumgebung können Benutzer Dashboards verwenden, um den Datenverkehr zu konfigurieren und zu überwachen.

einpacken

Sentinel möchte Benutzern mehrere Optionen zur Steuerung des Flusses zum Service bieten. Dazu muss der Benutzer die Regeln über die GUI oder den Code definieren. Zusätzlich zu QPS können Benutzer die Anzahl der Threads steuern und Whitelists für die Zugriffssteuerung erstellen. Wenn verteilte Dienste komplexer werden, wird dieses Modell den Benutzeranforderungen besser gerecht.

Recommended Posts

Verwenden von Hystrix und Sentinel im Codebeispiel
Beispiel für Codierung und Decodierung in Java
Schreiben Sie Code mit Ruby-Klassen und -Instanzen
Versuchen Sie es mit Sourcetrail (Win-Version) mit Java-Code
Versuchen Sie es mit Sourcetrail (MacOS-Version) mit Java-Code
CSRF-Gegenmaßnahmenrichtlinie und Implementierungsbeispiel in einer REST-Anwendung unter Verwendung von "Spring Boot" + "EXT JS"
Verknüpfte HashMap, auf die in der Reihenfolge des Einfügens verwiesen wird, und deren Verwendungsbeispiel
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
Unterschiede im Code bei Verwendung des Längensystems in Java
Java-Codebeispiel zum Erfassen und Anzeigen von DBLINK-Quell- und Zieldaten in Oracle Database mithilfe von DBLINK
Beispiel für die Verwendung von vue.config.js
Implementieren Sie CustomView im Code
Implementieren Sie Thread in Java und versuchen Sie, die anonyme Klasse Lambda zu verwenden
So legen Sie mit JAXB Zeichencode und Zeilenvorschubcode fest
So legen Sie den Zeichencode und den Zeilenvorschubcode in Eclipse fest
Abrufen von Fehlerinformationen mithilfe von DefaultErrorAttributes und ErrorAttributeOptions in Spring Boot 2.3
Erstellen Sie einen QR-Code für Google Authenticator mit ZXing in Java
Korrigieren Sie den Zeichencode in Java und lesen Sie von der URL
Tipps zur Verwendung von Salesforce SOAP und Bulk API in Java
Die Geschichte der Verwendung von Java Input Waiting (Scanner) mit VSCode