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.
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.
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.
Auch in einer realen Produktionsumgebung können Benutzer Dashboards verwenden, um den Datenverkehr zu konfigurieren und zu überwachen.
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