Curcuit Breaker -Modus
In verteilten Umgebungen, insbesondere in verteilten Systemen mit Microservice -Strukturen, ist es sehr häufig, dass ein Softwaresystem ein anderes Remote -System aufruft. Der Callee dieses Remote -Anrufs kann ein weiterer Prozess oder ein anderer Host im Netzwerk sein. Der größte Unterschied zwischen diesem Remote -Anruf und dem internen Anruf des Prozesses besteht darin, dass der Remote -Anruf bis zur Zeitüberschreitung ohne Antwort fehlschlagen oder ohne Antwort hängen kann. Schlimmer noch, wenn mehrere Anrufer denselben anhängigen Dienst anrufen, ist es sehr wahrscheinlich, dass sich die Zeitlimit -Wartezeit eines Dienstes schnell auf das gesamte verteilte System ausbreitet, was zu einer Kettenreaktion führt und somit eine große Menge an Ressourcen des gesamten verteilten Systems verbraucht. Es kann schließlich zu einer Systemlähmung führen.
Der Leistungsschaltermodus besteht darin, Katastrophen zu verhindern, die durch eine solche Wasserfall-ähnliche Kettenreaktion in verteilten Systemen verursacht werden.
Sobald ein bestimmtes elektrisches Gerät Probleme hat, wird die Sicherung des Stromkreises blasen, um eine Katastrophe zu verhindern. Leistungsschalter ähneln den Schaltungssicherungen. Die Implementierungsidee ist sehr einfach. Sie können Remotedienste zusammenfassen, die Schutz benötigen und die Anzahl der Fehler intern überwachen. Sobald die Anzahl der Fehler einen bestimmten Schwellenwert erreicht hat, gibt alle nachfolgenden Aufrufe des Dienstes den Fehler direkt nach Abschnitt des Leistungsschalters an den Anrufer zurück und rufen den Dienst nicht weiter an, der bereits Probleme hatte, wodurch der Zweck des Schutzes des Anrufers erreicht wird. Das gesamte System wird keine durch Auszeitung verursachte Wasserfallkettenreaktion aufweisen.
1. Grundmodus
Die obige Abbildung ist die Struktur eines Leistungsschalters (Curcuit Breaker), der zwei grundlegende Zustände (nah und offen) und eine grundlegende Auslösewirkung hat:
Im engeren Zustand fordert der Kunde den Dienst den Dienst direkt über den Leistungsschalter ohne Hindernisse an. Der Rückgabewert des Lieferanten wird vom Leistungsschalter direkt an den Client zurückgegeben.
Im offenen Zustand wird der Leistungsschalter die Anfrage nicht an den Lieferanten übertragen, sondern den Kunden direkt weitergeben, nachdem der Kunde einen Serviceantrag an den Lieferanten initiiert hat, sondern den Kunden direkt zurückgibt, und der Pfad zwischen dem Kunden und dem Lieferanten wird unterbrochen.
Reise: Wenn der Lieferant im engeren Zustand weiterhin eine Auszeit und einen Fehler hat, tritt nach dem Erreichen des angegebenen Schwellenwerts die Reise im Leistungsschalter auf, und der Leistungsschalterstatus wird von der Schließung geöffnet.
2. Erweiterter Modus
Im Basis -Leistungsschaltermodus wird sichergestellt, dass der Leistungsschalter nicht aufgerufen wird, wenn sich der Leistungsschalter im offenen Zustand befindet, aber wir benötigen auch zusätzliche Maßnahmen, um den Leistungsschalter zurückzusetzen, nachdem der Versorger den Service wiederhergestellt hat. Eine praktikable Möglichkeit besteht darin, regelmäßig festzustellen, ob der Service des Lieferanten wiederhergestellt ist. Sobald er wiederhergestellt ist, wird der Status geschlossen. Der Zustand des Recher-Breaker-Wiederholung ist halb geöffnet.
3.. Verwenden Sie Anlässe für Leistungsschalter:
Ein Lieferant ist im Allgemeinen sehr stabil. Wenn einmal ein Fehler auftritt, dauert die Inspektions- und Wiederherstellungszeit lange und kann nicht in kurzer Zeit schnell repariert werden. Dieser Service eignet sich besser für die Verwendung des Leistungsschaltermodus. Andernfalls wird es wahrscheinlich zu einem Ping-Pong-Effekt führen.
3.. Der Leistungsschalter ist für Anlässe nicht geeignet:
Um zu verhindern, dass ein Antrag versucht, einen Remote -Dienst aufzurufen oder auf eine gemeinsam genutzte Ressource zuzugreifen, ist dieses Muster möglicherweise nicht geeignet, wenn der Betrieb sehr wahrscheinlich fehlschlägt.
Für die Verarbeitung von Anwendungen, die auf lokale dedizierte Ressourcen zugreifen, z. B. Datenstrukturen innerhalb des Speichers. In dieser Umgebung ist es normalerweise nicht geeignet, und die Verwendung eines Leistungsschalters erhöht nur den Systemaufwand.
Das Folgende ist eine direkte Einführung in die Verwendung des Leistungsschalters von Spring Cloud.
SpringCloud Netflix implementiert den Namen der Leiterschalterbibliothek namens Hystrix. Unter der Microservice -Architektur gibt es in der Regel mehrere Servicelegte. Das Folgende ist ein schematisches Diagramm des Browsers, der über API unter der Microservice -Architektur auf die Backend -Microservices zugreift:
Das Versagen eines Microservice -Timeouts kann zu einer Wasserfallkettenreaktion führen. In der folgenden Abbildung verhindert Hystrix durch einen autonomen Rückkopplungsschalter.
Service B in der Abbildung schlägt aus irgendeinem Grund fehl und ist nicht verfügbar. Alle Anrufe zum Service B werden sich einstellen. Wenn der Aufruf an B nicht einen bestimmten Schwellenwert erreicht (20 Fehler innerhalb von 5 Sekunden sind der von Hytrix definierte Standardwert), befindet sich die Verbindung im offenen Zustand, und dann werden alle Aufrufe zum Dienst B nicht ausgeführt, stattdessen eine Fallback -Nachricht, die die vom Leistungsschalter bereitgestellten Links angegeben hat. Hystrix bietet einen entsprechenden Mechanismus, mit dem Entwickler diese Fallbak -Nachricht definieren können.
Open blockiert den Link blockiert einen Wasserfallfehler und ermöglicht es überflutete oder falsche Dienste, Zeit zu beheben. Dieser Fallback kann ein weiterer hystrix geschützter Anruf, statische Daten oder einen rechtlichen Nullwert sein. Fallbacks können eine Kettenstruktur bilden, sodass der erste Fallback, der andere Geschäftsdienste unten aufruft, um statische Daten zurückzugeben.
Kommen wir als nächstes auf den Punkt, und fügen Sie den beiden vorherigen Hello World Service -Clustern einen Leistungsschalter hinzu, um zu verhindern, dass eine der Hello World nachlässt, und das System nicht mehr Zeitüberschreitungen anketten.
1. Fügen Sie die Hystrix -Bibliothek hinzu, um den Leistungsschalter im Pom.xml des Maven -Projekts zu unterstützen (Ribbon oder Vesign -Projekt, das im vorherigen Kapitel eingeführt wurde)
<Depopenty> <gruppe> org.springFramework.cloud </Groupid> <artifactId> Spring-Cloud-Starter-Hystrix </artifactid> </abhängig>
2. Verwenden Sie Leistungsschalter in Bandanwendungen
1). Fügen Sie @enableCircuitbreaker Annotation in der Spring Boot Startup -Klasse hinzu
@SpringBootApplication@enablediscoveryClient@EnableCircuitbreakerPublic Class ServiceribBonApplication {public static void main (String [] args) {Springapplication.run (serviceribbonApplication.class, args); }2). Annotieren Sie die Methode des Zugriffs von Diensten mit @HystrixCommand Annotation
@ServicePublic Class HelloService {@autowired rastTemplate rastTemplate; @HystrixCommand (fallbackMethod = "serviceFailure") public String gethellocontent () {return rastTemplate.getforObject ("http: // service-helloworld/", string.class); } public String serviceFailure () {return "Hello World Service ist nicht verfügbar!"; }}Die @HystrixCommand -Annotation definiert einen Leistungsschalter, der die Methode gethellocontant () zusammenfasst. Wenn der Service-Helloworld, den sie zugänglich macht, nicht die Schwelle erreicht, wird der Service-Helloworld nicht mehr aufgerufen. Stattdessen gibt es die von FallbackMethod definierte Method Service failure () zurück. Es gibt zwei Punkte, die bei der Definition der FallbackMethod -Methode, die durch die Annotation @HyStrixCommand definiert wurde, besondere Aufmerksamkeit geschenkt werden.
Erstens muss der Rückgaberück- und Parameter -Typ von FallbackMethod genau mit der von @HyStrixCommand kommetierten Methode übereinstimmen. Andernfalls wird eine Ausnahme zur Laufzeit ausgelöst. In diesem Beispiel sind beispielsweise der Rückgabewert von serviceFailure () und der Rückgabewert der Gethellocontant () -Methode beide Zeichenfolgen.
Zweitens ersetzt FallbackMethod, wenn der zugrunde liegende Dienst fehlschlägt, nicht die von @hystrixCommand (Gethellocontant in diesem Beispiel) kommentierte Methode ersetzt, sondern nur auf den spezifischen Dienst, der über RastTemplate zugegriffen wird. Sie können aus der Systemausgabe erkennen, dass auch wenn es fehlschlägt, es in der Konsolenausgabe immer noch "Call Service-Helloworld" gibt.
Starten Sie den Eureka -Dienst, starten Sie nur zwei HelloWorld -Dienste und unterbrechen Sie dann einen von ihnen (simulieren Sie eine der suspendierten Microservices), besuchen Sie http: // localhost: 8901/und aktualisieren Sie dann auf dem Ladungsausgleich auf, da die folgenden zwei Seiten abwechselnd erscheinen. Sie können sehen, dass der zweite anstehende Dienst durch die in der Band definierte Fehlerbehandlungsmethode ersetzt wird.
4. Verwenden Sie Leistungsschalter in vor vortragen Anwendungen
1). Tenden Sie vor, unterstützt bereits Leistungsschalter, sodass Sie nicht über die Methode von Ribbon nachdenken müssen. Fügen Sie der Spring -Boot -Startklasse zusätzliche Anmerkungen hinzu.
2). Fügen Sie die Fallback -Klasse mit @FeignClient Annotation hinzu, die die von @FeignClient geänderte Schnittstelle implementieren muss.
@FeignClient (name = "service-helloworld", fallback = helloWorldServiceFailure.class) öffentliche Schnittstelle HelloWorldService {@RequestMapPing (value = "/", method = requestMethod.get) public String sayshello (); }3). Um die HelloWorldServiceFailure -Klasse zu erstellen, müssen Sie die von @FeignClient geänderte HelloWorldService -Schnittstelle implementieren. Beachten Sie, dass Sie @Component oder @Service Annotation hinzufügen, um eine Bohne im Federbehälter zu generieren.
@ComponentPublic Class HelloWorldServiceFailure implementiert HelloWorldService {@Override public String sayshello () {System.out.println ("Hallo Weltdienst ist nicht verfügbar!"); Rückkehr "Hallo Weltdienst ist nicht verfügbar!"; }}4). In den Brixton -Versionen vor der Spring Cloud hat Vesign den Leistungsschalter standardmäßig automatisch aktiviert, aber die jüngste Dalston -Version hat die Standardkonfiguration in das Verbot geändert.
Aus Gründen finden Sie unter: https://github.com/spring-cloud/spring-cloud-netflix/issues/1277. Achten Sie auf diesen Punkt. Um den Leistungsschalter in vortäuschen zu verwenden, müssen Sie daher die folgende Konfiguration in application.yml hinzufügen:
vorstellen: hystrix: aktiviert: true
5). Starten Sie die vorliegende Anwendung und besuchen Sie http: // localhost: 8902/Hallo, um den gleichen Effekt wie das Ribbon zu sehen.
Referenz: http://projects
http://projects
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.