Nos microsserviços, dividimos o sistema em muitas unidades de serviço e cada unidade é interdependente por meio de registro de serviço e consumo de assinatura. Mas o que acontece se alguns serviços tiverem problemas?
Por exemplo, existem três serviços (ABC), a chamadas B e B chamadas C. Devido ao atraso da rede ou aos problemas de código de C, B não receberá uma resposta por um longo tempo; portanto, a solicitação B Chamadas C será suspensa e aguardando.
No caso de alto acesso simultâneo, esses threads suspensos não podem ser liberados, causando pedidos subsequentes para bloquear e, eventualmente, B também desligará. Por analogia, A também pode desligar, fazendo com que todo o sistema falhe.
Para resolver todo o problema, o Spring Cloud usa a Hystrix para proteção tolerante a falhas de serviço, incluindo uma série de funções de proteção, como disjuntores de circuitos e isolamento de roscas. Hoje vamos dar uma olhada em como implementar os disjuntores através do Hystrix.
1. O que é a Hystrix da Spring Cloud? O que é um disjuntor?
A Hystrix da Cloud Spring é implementada com base na estrutura de código aberto da Netflix, Hystrix, e seu objetivo é fornecer forte tolerância a falhas à latência e falha, controlando os nós que acessam sistemas, serviços e terceiros.
O disjuntor é semelhante ao disjuntor de vazamento usado na caixa elétrica forte em nossa casa. Quando a unidade de serviço falha (semelhante ao curto-circuito do aparelho elétrico), uma resposta de erro é retornada ao chamador através da função de monitoramento de falhas do disjuntor (semelhante ao fusível), evitando a espera a longo prazo, impedindo assim que a falha se espalhe para todo o sistema.
2. Se não houver disjuntor, a exibição da página
Você ainda se lembra dos três serviços na Spring Cloud Introduction Series 2: Usando Eureka for Service Governança (Eureka/Hello-Service/Hello-Consumer) que escrevemos anteriormente? Realizamos experimentos com base nisso.
1. Inicie o Centro de Registro de Serviço Eureka com a porta número 1111
2. Inicie o provedor de serviços da Hello-Service. Aqui começamos dois serviços, com os números de porta 9090.9091, respectivamente.
3. Comece o Hello-Consumer para servir os consumidores, com o número da porta 9999; Neste momento, não temos problemas em visitar http: // localhost: 9999/Hello-Consumer várias vezes.
4. Desligue o serviço com a porta número 9091 e visite http: // localhost: 9999/hello-consumer várias vezes, e um erro foi relatado.
PS: Aqui explicamos por que precisamos acessar várias vezes, porque alcançamos o balanceamento de carga através da fita. Quando acessarmos http: // localhost: 9999/hello-consumer, pesquisaremos dois serviços que acesam a Hello-Service. Um erro será relatado ao acessar um serviço com a porta número 9091. Não haverá problema em acessar um serviço com 9090.
3. Implementação do código do disjuntor
Em seguida, vamos dar uma olhada em como implementar o código. Não modificamos o centro de registro de serviço e o provedor de serviços, precisamos apenas modificar o consumidor do consumidor de serviço.
1. Modifique arquivos POM e introduza dependências Hystrix
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "> <ModelVersion> 4.0.0 </modelVersion> <voundid> com.sam </foupid> <stifactId> hello-consumer </artifactId> <Versão> 0,0.1-snapshot </versão> <PuerpId> org.springframework.boot </foupiid> <TRAFACTID> Spring-Boot-Starter-Parent </ArtifactId> <Versão> 1.5.1.reLease </sipers> </parenti> <pendepergies> <navaversion> 1.8 </javaversion> </Properties> <idependencies> <PupidId> org.springframework.cloud </frupiD> <ArtifactId> Dependências de mola-cloud </ArtifactId> <versão> Camden.sr6 </versão </type> pom </type> scope> import </scope> </dependency> </dependency> </dependenceGerManagem-Sergente> <ependências> <! <GrupidId> org.springframework.cloud </frupiD> <ArtifactId> Spring-Cloud-Starter-eureka </stutifactId> </dependency> <!-Introduce a dependência da fita é usada para implementar o balanceamento de carga. Estamos apenas usando aqui e não o apresentaremos em outro lugar-> <Depency> <PuerpId> org.springframework.cloud </groupid> <stifactId> Spring-cloud-starter-ribbon </strofactId> </dependência> <!-Introdução de dependências de Hystrix para implementar o serviço de serviço de serviço- <TarfactId> Spring-cloud-starter-hystrix </stifactId> </dependency> </dependências> </project>
2. Modifique a classe de inicialização, adicione anotação @enablecircuitbreaker e ative o disjuntor
@Enablediscoveryclient@springbootApplication@EnableCircuitBreakerPublic Classe ConsumerApp {//@Bean é aplicado no método e usado para definir o valor do retorno do método como bean @Bean @loadBalanced //@loadBalanced para obter o balanceamento de carga Public Resttemplate Resttemplate () {Return New RestTemplate (); } public static void main (string [] args) {springapplication.run (consumerApp.class, args); }}Neste momento, você descobrirá que esta aula de inicialização tem três anotações. Isso não é muito problemático? Não importa, podemos usar a anotação @springcloudApplication
@SpringcloudApplicationPublic Classe ConsumerApp {// @Bean é aplicado no método e é usado para definir o valor de retorno do método como bean @bean @loadbalanced // @loadbalanced para obter o balanceamento de carga public Resttemplate Resttemplate () {Return Resttemplate (); } public static void main (string [] args) {springapplication.run (consumerApp.class, args); }}@SpringcloudApplication = @EnablediscSoveryclient +@springbootapplication +@enableCircuitbreaker, você pode ver no código -fonte:
@Target (elementType.type) @retention (retentionpolicy.runtime)@documentado@herded@springbootApplication@habilablediscoveryclient@EnableCircuitBreakerPublic @Interface springcloudApplication {}3.Add Service
@ServicePublic Classe ConsumerService {@AUTOWIRed Resttemplate Resttemplate; @HystrixCommand (FallbackMethod = "errorMsg") public String Consumer () {// Ligue para o Serviço Hello-Service, observe que o nome do serviço é usado aqui, não o IP+portTemplate.getObject específico (http: // hello-service/hello ", string.class); Retornar "Hello Consumer Acabar !!!"; } public String errorMsg () {return "Error !!!"; }}Colocamos a implementação do controlador original de chamar Resttemplate no serviço e especificamos o método de retorno de chamada através do @HyStrixCommand e chamamos esse método quando ocorrer um erro.
4. Modifique o controlador
/** *O RestTemplate não é mais chamado diretamente aqui, *, mas é implementado chamando o serviço * */ @RestControllerPublic Classe ConsumerController { @Autowired // RestTemplate RestTemplate; Serviço de Serviço de Consumidores; @RequestMapping ("/hello-consumer") public string helloconsumer () {// // ligue para o serviço Hello-Service, observe que o nome do serviço é usado aqui, não o IP+port // RestTemplate.Class.ClASS); Return Service.Consumer (); }}5. Teste, várias visitas e quando um erro é relatado, o seguinte conteúdo será exibido.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.