Dans les microservices, nous avons divisé le système en de nombreuses unités de service, et chaque unité est interdépendante par l'enregistrement des services et la consommation d'abonnement. Mais que se passe-t-il si certains services ont des problèmes?
Par exemple, il y a trois services (ABC), A appelle B et B appelle C. En raison du retard du réseau ou des problèmes de code de C, B n'obtiendra pas de réponse pendant longtemps, de sorte que les appels de demande B seront suspendus et attendent.
Dans le cas d'un accès simultané élevé, ces threads suspendus ne peuvent pas être libérés, provoquant un blocage des demandes ultérieures, et éventuellement B raccrochera également. Par analogie, A peut également raccrocher, provoquant une écrasement de l'ensemble du système.
Afin de résoudre l'intégralité du problème, Spring Cloud utilise Hystrix pour une protection tolérante aux pannes de service, y compris une série de fonctions de protection telles que les disjoncteurs et l'isolement de thread. Aujourd'hui, nous allons voir comment implémenter des disjoncteurs via Hystrix.
1. Qu'est-ce que Spring Cloud Hystrix? Qu'est-ce qu'un disjoncteur?
Spring Cloud Hystrix est implémenté en fonction du cadre open source de Netflix, Hystrix, et son objectif est de fournir une forte tolérance aux défauts pour la latence et l'échec en contrôlant les nœuds qui accèdent aux systèmes distants, aux services et aux tiers.
Le disjoncteur est similaire au disjoncteur de fuite utilisé dans la boîte électrique forte dans notre maison. Lorsque l'unité de service échoue (similaire au court-circuit de l'appareil électrique), une réponse d'erreur est renvoyée à l'appelant via la fonction de surveillance des défauts du disjoncteur (similaire au fusible), évitant l'attente à long terme, empêchant ainsi le défaut de se propager à l'ensemble du système.
2. S'il n'y a pas de disjoncteur, l'affichage de la page
Vous souvenez-vous encore des trois services de la série Spring Cloud Introduction 2: Utilisation d'Eureka pour la gouvernance des services (Eureka / Hello-Service / Hello-Consumer) que nous avons écrit plus tôt? Nous effectuons des expériences en fonction de cela.
1. Démarrez le centre d'enregistrement des services Eureka avec le numéro de port 1111
2. Commencez le fournisseur de services Hello-Service. Ici, nous commençons deux services, avec les numéros de port 9090, 9091 respectivement.
3. Commencez Hello-Consumer pour servir les consommateurs, avec le numéro de port 9999; À l'heure actuelle, nous n'avons aucun problème à visiter http: // localhost: 9999 / bonjour-consommateur plusieurs fois.
4. Éteignez le service avec le numéro de port 9091, puis visitez http: // localhost: 9999 / bonjour-consommateur plusieurs fois, et une erreur a été signalée.
PS: Ici, nous expliquons pourquoi nous devons accéder plusieurs fois, car nous avons atteint l'équilibrage de la charge via le ruban. Lorsque nous accéderons à http: // localhost: 9999 / bonjour-consomme, nous interrogerons deux services qui accèdent à Hello-Service. Une erreur sera signalée lors de l'accès à un service avec le numéro de port 9091. Il n'y aura aucun problème à accéder à un service avec 9090.
3. Implémentation du code du disjoncteur de circuit
Ensuite, examinons comment implémenter le code. Nous ne modifions pas le centre d'enregistrement de service et le fournisseur de services, nous devons seulement modifier le consommateur de services Hello-Consumer.
1. Modifier les fichiers POM et introduire les dépendances Hystrix
<project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "> <ModelVersion> 4.0.0 </ ModelVersion> <ProupId> com.sam </prouverid> <ArtifActid> Hello-Consumer </ Artifactid> <version> 0.0.1-Snapshot </DERNIFROITION> <MAPTAL> <GroupId> org.springframework.boot </proupId> <Ertifactid> printemps-boot-starter-parent </retifactid> <version> 1.5.1.release </ version> </parent> <preperties> <javavaversion> 1.8 </ javavaversion> </properties> <dependancemanagement> <dependcs> <pedency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR6</version> <type>pom</type> <scope>import</scope> </dependency> </dependency> </dependencyManagement> <dependencies> <!-- Introduce eureka client dependencies--> <dependency> <GroupId> org.springframework.cloud </prôdId> <ArtefactId> Spring-Cloud-Starter-eureka </refactId> </Dependance> <! - Introduire la dépendance du ruban est utilisée pour implémenter l'équilibrage de la charge. Nous l'utilisons simplement ici et ne le présenterons pas ailleurs -> <dependency> <proupId> org.springframework.cloud </proupId> <ArtefactId> Spring-Cloud-Starter-Ribbon </ Artifactid> </ Dependency> <! - Introduire des dépendances Hystrix pour mettre en œuvre la protection de la tolérance aux défauts. <ArtefactId> Spring-Cloud-Starter-Hystrix </ Artifactid> </Dependency> </Dependance> </randing>
2. Modifiez la classe de démarrage, ajoutez l'annotation @enableCircuitBreaker et activez le disjoncteur
@VeablediscoveryClient @ SpringbootApplication @ perteCircuitBreakerPublic Class ConsumerApp {// @ bean est appliqué sur la méthode et utilisé pour définir la valeur de retour de la méthode pour être bean @bean @loadBalanced // @ loadBalanced pour atteindre la charge d'équilibrage public RestTemplate RestTemplate () {return new restTemplate (); } public static void main (String [] args) {springApplication.run (consumerApp.class, args); }}Pour le moment, vous constaterez que cette classe de startup a trois annotations. N'est-ce pas très gênant? Peu importe, nous pouvons utiliser l'annotation @springCloudApplication
@SpringCloudApplicationPublic Class ConsumerApp {// @ bean est appliqué sur la méthode et est utilisé pour définir la valeur de retour de la méthode pour être bean @bean @loadBalanced // @ loadBalanced pour atteindre l'équilibrage de chargement public restemplate resttemplate () {return new restTEmplate (); } public static void main (String [] args) {springApplication.run (consumerApp.class, args); }}@SpringCloudApplication = @enablediscoveryClient + @ SpringbootApplication + @ IntactiableCircuitbreaker, vous pouvez voir dans le code source:
@Target (elementType.Type) @retention (retentionPolicy.runtime) @ documenté @ hérité @ springbootapplication @ eablediscoveryClient @ perteCircuitBreakerPublic @Interface SpringCloudApplication {}3.Add Service
@ServicePublic Class ConsumerService {@Autowired RestTemplate RestTemplate; @Hystrixcommand (FallbackMethod = "errormsg") public String Consumer () {// Appelez le service Hello-Service, notez que le nom du service est utilisé ici, et non le port IP + spécifique RestTemplate.getForObject ("http: // bonjour-service / hello", string.class); Retour "Hello Consumer Finish !!!"; } public String errormsg () {return "error !!!"; }}Nous mettons l'implémentation par le contrôleur d'origine de l'appel RestTemplate dans le service et spécifions la méthode de rappel via @hystrixcommand, et appelons cette méthode lorsqu'une erreur se produit.
4. Modifier le contrôleur
/ ** * Le RestTemplate n'est plus appelé directement ici, * mais est implémenté en appelant Service * * / @ RESTControllerPublic Class ConsumerController {@ Autowired // RestTemplate Reststallate; Service de service consommé; @RequestMapping ("/ Hello-Consumer") public String HelloConSumer () {// // Appelez le service Hello-Service, notez que le nom du service est utilisé ici, pas le port IP + spécifique // RestTemplate.getForObject ("http: // hello-service / hello", string.class); return Service.Consumer (); }}5. Tester, plusieurs visites, et lorsqu'une erreur est signalée, le contenu suivant sera affiché.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.