In Microservices teilen wir das System in viele Serviceinheiten auf, und jede Einheit ist durch Serviceregistrierung und Abonnementverbrauch voneinander abhängig. Aber was passiert, wenn einige Dienste Probleme haben?
Beispielsweise gibt es drei Dienste (ABC), A -Anrufe B und B Anruf C. Aufgrund der Netzwerkverzögerung oder des Codeproblems von C erhält B lange keine Antwort, sodass die Anforderung B Anrufe C suspendiert und wartet.
Im Falle eines hohen gleichzeitigen Zugriffs können diese suspendierten Threads nicht freigegeben werden, was zu Blockanfragen führt, und schließlich wird B auch auflegen. In Analogie kann auch ein aufgehängt werden, was das gesamte System zum Absturz bringt.
Um das gesamte Problem zu lösen, verwendet Spring Cloud Hystrix für Service-Fehler-toleranter Schutz, einschließlich einer Reihe von Schutzfunktionen wie Leistungsschalter und Gewinde-Isolation. Heute werden wir uns ansehen, wie Circuit Breakers über Hytrix implementiert werden.
1. Was ist Frühlingswolkenhystrix? Was ist ein Leistungsschalter?
Spring Cloud Hystrix wird basierend auf dem Open -Source -Framework von Netflix, Hystrix, implementiert. Sein Ziel ist es, eine starke Fehlertoleranz für Latenz und Misserfolg zu liefern, indem die Knoten kontrolliert werden, die auf Remote -Systeme, -Dienste und Dritte zugreifen.
Der Leistungsschalter ähnelt dem Leckageschalter, der in der starken Elektrokasten in unserem Haus verwendet wird. Wenn die Serviceinheit fehlschlägt (ähnlich dem Kurzschluss des elektrischen Geräts), wird eine Fehlerantwort durch die Fehlerüberwachungsfunktion des Leistungsschalters (ähnlich der Sicherung) an den Anrufer zurückgegeben, wodurch das Warten von Langzeiten vermieden wird, wodurch sich die Ausbreitung des Fehlers auf das gesamte System ausbreitet.
2. Wenn es keinen Leistungsschalter gibt, wird die Seitenanzeige angezeigt
Erinnern Sie sich noch an die drei Dienste in der Spring Cloud Einführung Serie 2: Verwenden von Eureka für Service Governance (Eureka/Hello-Service/Hello-Consumer), die wir zuvor geschrieben haben? Darauf basieren Experimente.
1. Starten Sie das Eureka Service Registration Center mit der Hafennummer 1111
2. Starten Sie den Hello-Service-Serviceanbieter. Hier starten wir zwei Dienste mit Portnummern 9090, 9091.
3. Starten Sie Hello-Consumer, um den Verbrauchern mit der Hafennummer 9999 zu bedienen. Zu diesem Zeitpunkt haben wir kein Problem damit, http: // localhost: 9999/hello consumumer mehrmals zu besuchen.
4. Schalten Sie den Service mit der Portnummer 9091 aus und besuchen Sie dann mehrmals http: // localhost: 9999/hello consumumer, und ein Fehler wurde gemeldet.
PS: Hier erklären wir, warum wir mehrmals zugreifen müssen, da wir Lastausgleich durch das Band erreicht haben. Wenn wir auf http: // localhost: 9999/hello-consumer zugreifen, werden wir zwei Dienste befragen, die auf Hello-Service zugreifen. Ein Fehler wird beim Zugriff auf einen Dienst mit der Portnummer 9091 gemeldet. Es wird kein Problem mit dem Zugriff auf einen Dienst mit 9090 geben.
3. Implementierung des Leistungsschaltercodes
Schauen wir uns als nächstes an, wie der Code implementiert wird. Wir ändern nicht das Service Registration Center und den Service Provider, sondern müssen nur den Hello-Consumer des Service Consumer ändern.
1. Ändern Sie die POM -Dateien und führen Sie Hytrixabhängigkeiten ein
<project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sam</groupId> <artifactId>hello-consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> <properties> <javaVersion>1.8</javaVersion> </properties> <dependencyManagement> <dependencies> <dependency> <gruppeID> org.springFramework.cloud </GroupId> <artifactId> Spring-Cloud-Abhängigkeiten </artifactID> <version> camden.sr6 </Version> <Typs> pom </type> <scope> import </scope> </abhängig> </abhängig> </abhängig> <! <gruppe> org.springframework.cloud </Groupid> <artifactid> Spring-Cloud-Starter-Eureka </artifactid> </abhängig> <!-Die Abhängigkeit von der Bande einführen wird zum Implementieren von Lastausgleich verwendet. Wir verwenden es nur hier und werden es an anderer Stelle nicht vorstellen-> <Depopentcy> <gruppe> org.springFramework <artifactid> Spring-Cloud-Starter-Hystrix </artifactid> </abhängig> </abhängig> </project>
2. Ändern Sie die Startklasse, fügen Sie Annotation @enableCircuitbreaker hinzu und aktivieren Sie den Leistungsschalter
@EnablediscoveryClient@SpringBootApplication@EnableCircuitbreakerPublic -Klasse ConsumerApp {//@bean wird auf der Methode angewendet und verwendet, um den Methode zurückzulegen, um bean @Bean @LoadBalanced // LoadBalanced zu erreichen, um das Ladeausgleich zu erreichen. } public static void main (String [] args) {SpringApplication.run (ConsumerApp.class, Args); }}Zu diesem Zeitpunkt werden Sie feststellen, dass diese Start -up -Klasse drei Anmerkungen hat. Ist das nicht sehr problematisch? Es spielt keine Rolle, wir können die Annotation @SpringCloudApplication verwenden
@SpringCloudApplicationPublic Class ConsumerApp {// @bean wird auf der Methode angewendet und wird verwendet, um den Methode -Rückgabewert auf bean @bean @LoadBalanced // @loadBalanced festzulegen, um das Lastausgleich public rastTemplate rastTemplate () {retoure rastTemplate () zurückzusetzen; } public static void main (String [] args) {SpringApplication.run (ConsumerApp.class, Args); }}@SpringCloudApplication = @enablediscoveryClient +@SpringbootApplication +@EnableCircuitbreaker, Sie können im Quellcode sehen:
@Target (elementtype.type) @Retention (retentionPolicy.runtime)@documented@erbte@springbootApplication@enablediscoveryClient@EnableCircuitbreakerPublic @Interface SpringCloudApplication {}3.Add Service
@ServicePublic Class ConsumerService {@autowired rastTemplate rastTemplate; @HystrixCommand (fallbackMethod = "errormsg") public String Consumer () {// Rufen Sie den Hello-Service-Dienst an, beachten Sie, dass der Dienstname hier verwendet wird, nicht die spezifische IP+Port rastTemplate.getforObject ("http: // Hallo-Sservice/Hallo", String.class); Rückkehr "Hallo Konsumenten Finish !!!"; } public String errormsg () {return "Fehler !!!"; }}Wir haben die Implementierung des Originalcontrollers von RastTemplate in den Dienst eingerichtet und die Rückrufmethode über @hyStrixCommand angeben und diese Methode aufrufen, wenn ein Fehler auftritt.
4. Ändern Sie den Controller
/** *Die RestTemplate wird hier nicht mehr direkt aufgerufen, *wird jedoch durch den Aufruf von Dienst * */ @rastControllerPublic class ConsumerTontroller { @autowired // rastTemplate rastTemplate; Consumerservice Service; @RequestMapping ("/hello-consumer") public String helloconsumer () {// // Rufen Sie den Hello-Service-Dienst an, beachten Sie, dass der Dienstname hier verwendet wird, nicht der spezifische IP+port // rastTemplate.getforObject ("http: // Hallo-Service/Hello", String.class); return Service.consumer (); }}5. Test, mehrere Besuche und wenn ein Fehler gemeldet wird, wird der folgende Inhalt angezeigt.
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.