Mode disjoncteur de curcuit
Dans les environnements distribués, en particulier dans les systèmes distribués avec des structures de microservice, il est très courant qu'un système logiciel appelle un autre système distant. La callee de cet appel distant peut être un autre processus ou un autre hôte sur le réseau. La plus grande différence entre cet appel distant et l'appel interne du processus est que l'appel distant peut échouer ou suspendre sans réponse avant le délai d'attente. Pire encore, si plusieurs appelants appellent le même service en attente, il est très probable que l'attente du délai d'attente d'un service se propage rapidement à l'ensemble du système distribué, provoquant une réaction en chaîne, et consommera ainsi une grande quantité de ressources de l'ensemble du système distribué. Cela pourrait éventuellement conduire à une paralysie du système.
Le mode disjoncteur est d'empêcher les catastrophes causées par une telle réaction en chaîne de type cascade dans les systèmes distribués.
Une fois qu'un certain appareil électrique a des problèmes, le fusible du circuit soufflera pour éviter la catastrophe. Les disjoncteurs sont similaires aux fusibles de circuit. L'idée de mise en œuvre est très simple. Ils peuvent encapsuler les services à distance qui nécessitent une protection et surveiller le nombre de défaillances en interne. Une fois que le nombre de défaillances atteindra un certain seuil, tous les appels ultérieurs au service renverront directement l'erreur à l'appelant après l'interception du disjoncteur et ne continueront pas à appeler le service qui a déjà eu des problèmes, atteignant ainsi le but de protéger l'appelant. L'ensemble du système ne connaîtra pas une réaction en chaîne en cascade causée par le temps mort.
1. Mode de base
La figure ci-dessus est la structure d'un disjoncteur (disjoncteur de curcuit), qui a deux états de base (proches et ouverts) et une action de base:
Dans l'état proche, le client demande le service au fournisseur directement via le disjoncteur sans aucun obstacle. La valeur de retour du fournisseur est directement retournée au client par le disjoncteur.
À l'état ouvert, après que le client ait déclenché une demande de service au fournisseur, le disjoncteur ne transférera pas la demande au fournisseur, mais renverra directement le client et le chemin entre le client et le fournisseur est rompu.
Trip: Dans l'état proche, si le fournisseur continue de passer du temps et d'erreur, après avoir atteint le seuil spécifié, un voyage se produira dans le disjoncteur, puis l'état du disjoncteur entrerara à partir de clôture.
2. Mode étendu
En mode disjoncteur de base, il garantit que le disjoncteur ne sera pas appelé lorsque le disjoncteur est à l'état ouvert, mais nous avons également besoin de mesures supplémentaires pour réinitialiser le disjoncteur après que le fournisseur a restauré le service. Un moyen possible consiste à détecter régulièrement si le service du fournisseur est restauré, et une fois restauré, le statut est défini pour fermer. L'état du disjoncteur de circuit est à moitié ouvert.
3. Utiliser des occasions pour les disjoncteurs:
Un fournisseur est généralement très stable. Si une fois une défaillance, le temps d'inspection et de récupération prend beaucoup de temps et ne peut pas être rapidement réparé en peu de temps, ce service est plus adapté à l'utilisation du mode disjoncteur. Sinon, cela entraînera probablement un effet de ping-pong.
3. Disjoncteur ne convient pas aux occasions:
Pour empêcher une application d'essayer d'invoquer un service à distance ou d'accéder à une ressource partagée, ce modèle peut ne pas convenir si l'opération est très susceptible d'échouer.
Pour le traitement des applications accédant aux ressources dédiées locales, telles que les structures de données en mémoire. Dans cet environnement, il ne convient généralement pas, et l'utilisation d'un disjoncteur n'augmentera qu'augmenter les frais généraux du système.
Ce qui suit est une introduction directe à la façon d'utiliser le disjoncteur de Spring Cloud.
SpringCloud Netflix implémente le nom de la bibliothèque du disjoncteur appelé Hystrix. Dans le cadre de l'architecture de microservice, il y a généralement plusieurs niveaux d'appels de service. Ce qui suit est un diagramme schématique du navigateur accédant aux microservices backend via l'API sous l'architecture de microservice:
La défaillance d'un délai d'expiration microservice peut entraîner une réaction en chaîne en cascade. Dans la figure ci-dessous, Hystrix empêche cela de se produire via un disjoncteur de rétroaction autonome.
Le service B sur la figure échoue pour une raison quelconque et devient indisponible. Tous les appels au service B seront désactivés. Lorsque l'appel à B ne parvient pas à un seuil spécifique (20 défaillances se produisent dans les 5 secondes sont la valeur par défaut définie par Hystrix), le lien sera à l'état ouvert, puis tous les appels au service B ne seront pas exécutés, au lieu de cela un message de secours indiquant le lien ouvert fourni par le disjoncteur de circuit. Hystrix fournit un mécanisme correspondant qui permet aux développeurs de définir ce message Fallbak.
Le lien d'Open bloque une erreur de cascade, permettant aux services inondés ou mauvais d'avoir le temps de réparer. Cette secours peut être un autre appel protégé par l'hystrice, des données statiques ou une valeur nulle légale. Les replies peuvent former une structure de chaîne, de sorte que le premier repli qui appelle d'autres services commerciaux en bas pour retourner des données statiques.
Ensuite, passons au point, ajoutant un disjoncteur aux deux précédents clusters de services Hello World pour empêcher l'un des Hello World de se relâcher, ce qui fait que le système échoue à la chaîne.
1. Ajouter la bibliothèque Hystrix pour prendre en charge les disjoncteurs dans le projet POM.xml de Maven (projet de ruban ou de feign introduit dans le chapitre précédent)
<dependency> <proupId> org.springframework.cloud </proupId> <ArtefactId> Spring-Cloud-Starter-Hystrix </retifactid> </Dependency>
2. Utilisez des disjoncteurs dans des applications de ruban
1). Ajouter une annotation @enableCircuitBreaker sur la classe de démarrage de Spring Boot
@ SpringbootApplication @veablediscoveryClient @ perteCircuitBreakerPublic classe ServiceBbonApplication {public static void main (String [] args) {SpringApplication.Run (ServiceBbonApplication.class, args); }2). Annotez la méthode d'accès aux services avec @hystrixcommand annotation
@ServicePublic class helloService {@Autowired RestTemplate RestTemplate; @HystrixCommand (FallBackMethod = "ServiceFailure") public String GethelloContent () {return restTemplate.getForObject ("http: // Service-Helloworld /", string.class); } public String ServiceFailure () {return "Hello World Service n'est pas disponible!"; }}L'annotation @HystrixCommand définit un disjoncteur qui résume la méthode Gethelloconant (). Lorsque le service-Helloworld, il accède à la fin du seuil, le service-helloworld ne sera plus appelé. Au lieu de cela, il renvoie la méthode ServiceFailure () définie par FallbackMethod. Il y a deux points qui doivent être accordés une attention particulière à la définition de la méthode FallbackMethod définie par l'annotation @hystrixcommand:
Tout d'abord, la valeur de retour et le type de paramètre de FallbackMethod doivent être exactement les mêmes que la méthode annotée par @hystrixcommand. Sinon, une exception sera lancée au moment de l'exécution. Par exemple, dans cet exemple, la valeur de retour de ServiceFailure () et la valeur de retour de la méthode Gethelloconant () sont les deux chaînes.
Deuxièmement, lorsque le service sous-jacent échoue, FallbackMethod ne remplace pas la méthode entière annotée par @hystrixcommand (Gethelloconant dans cet exemple), mais uniquement le service spécifique accessible via Rest -mplate. Vous pouvez voir dans la sortie du système qui, même s'il échoue, il y aura toujours "Call Service-Helloworld" dans la sortie de la console.
Démarrez le service Eureka, démarrez seulement deux services Helloworld, puis interrompez l'un d'eux (simulez l'un des microservices suspendus), visitez http: // localhost: 8901 / puis actualiser, en raison de l'équilibrage de charge, vous pouvez voir que les deux pages suivantes apparaissent alternativement. Vous pouvez voir que le deuxième service en attente est remplacé par la méthode de gestion des erreurs définie dans le ruban.
4. Utilisez des disjoncteurs dans des applications FEIG
1). Feign prend déjà en charge les disjoncteurs, vous n'avez donc pas besoin de penser à la méthode du ruban, ajoutez des annotations supplémentaires à la classe de démarrage de Spring Boot.
2). Ajoutez une classe de secours avec @FeignClient Annotation, qui doit implémenter l'interface modifiée par @FeignClient.
@FeignClient (name = "Service-Helloworld", Fallback = HelloworldServiceFailure.class) Interface publique HelloworldService {@RequestMapping (Value = "/", méthode = requestMethod.get) Public String Sayshello (); }3). Pour créer la classe HelloworldServiceFailure, vous devez implémenter l'interface HelloworldService modifiée par @FeignClient. Notez que vous ajoutez @Component ou @Service Annotation pour générer un bean dans le conteneur à ressort.
@ComponentPublic class helloworldServiceFailure implémente helloworldService {@Override public String Sayshello () {System.out.println ("Hello World Service n'est pas disponible!"); Retour "Hello World Service n'est pas disponible!"; }}4). Dans les versions Brixton avant Spring Cloud, Feign a automatiquement activé le disjoncteur par défaut, mais la version récente de Dalston a changé la configuration par défaut pour interdire.
Pour des raisons, veuillez vous référer à: https://github.com/spring-cloud/spring-cloud-netflix/issues/1277. Faites attention à ce point. Par conséquent, pour utiliser des disjoncteurs dans Feign, vous devez ajouter la configuration suivante dans Application.yml:
feign: Hystrix: Activé: true
5). Lancez l'application Feign et visitez http: // localhost: 8902 / bonjour pour voir le même effet que le ruban.
Référence: http://projects.spring.io/spring-cloud/spring-cloud.html#_circuit_breaker_hystrix_clients
http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign-hystrix
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.