1: O que é Hystrix
Em um ambiente distribuído, algumas das muitas dependências de serviço falharão inevitavelmente. A Hystrix é uma biblioteca que ajuda a controlar a interação entre esses serviços distribuídos, adicionando tolerância à latência e lógica de tolerância a falhas. A Hystrix melhora a resiliência geral do sistema, isolando pontos de acesso entre os serviços, interrompendo as falhas em cascata e fornecendo opções de fallback.
Hystrix foi projetado para fazer o seguinte
1: Forneça latência e falhas de proteção e controle para dependências acessadas através de bibliotecas de clientes de terceiros (geralmente sobre a rede).
2: Isole falhas em cascata em sistemas distribuídos complexos.
3: detecte rapidamente a falha e recupere o mais rápido possível.
4: Reunir e downgrade o mais graciosamente possível.
5: Habilite o monitoramento, alertas e controles operacionais em tempo real.
2: Por que você precisa de Hystrix?
Em um grande sistema distribuído, um cliente ou serviço depende de serviços externos. Se um serviço estiver inativo, definimos o tempo de tempo limite do sistema de chamadas de serviço, o que inevitavelmente afetará o tempo correspondente. No caso de alta concorrência, o pool de threads da maioria dos servidores será bloqueado (bloco), afetando a estabilidade de todo o serviço on -line.
(Fotos oficiais da foto)
Quando tudo está saudável, o pedido pode parecer assim
Quando um dos muitos sistemas de serviço de back -end diminui, todo o usuário solicita:
Se vários clientes chamam o mesmo serviço de exceção, a situação ocorre:
3: Que problemas o Hystrix resolve?
As aplicações em arquiteturas distribuídas têm dezenas de dependências, e cada dependência inevitavelmente terá uma exceção em algum momento. Se o aplicativo não estiver isolado dessas falhas externas, poderá ocorrer bloqueio de pool de threads, causando avalanche do sistema.
Por exemplo, para aplicativos que dependem de 30 serviços, cada serviço tem tempo de atividade de 99,99%, você pode:
99,99% da potência de 30 = 99,7% de tempo de atividade
0,3% de 1 bilhão de solicitações = 3.000.000 de falhas
Mais de 2 horas de tempo de inatividade/mês, mesmo com todas as dependências de tempo de atividade.
Ao usar a Hystrix para quebra de circuito, cada dependência é isolada uma da outra, limitando o bloqueio quando ocorre o atraso.
Quatro: Hystrix combinada com Feign
Crie um projeto eureka_feign_hystrix_client
Conteúdo do arquivo pom.xml
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <PuerpId> org.springframework.boot </frugiD> <TRARFACTID> Spring-Boot-Starter-Web </ArtifactId> </Dependency> <pendency> <puperid> org.springframework.boot </frupid> <stifactid> Spring-boot-starter-actuator </artiftid <PuerpId> org.springframework.boot </groupiD> <TRATIFACTID> Spring-boot-Starter-test </ArtifactId> <cope> teste </schope> </dependency> </dependencies> <pendencyManagement> </dependências> <pendency> <purgid> org.springFameDwork.clouging </grouping> art " <versão> brixton.sr5 </sipers> <pype> pom </pype> <cope> importar </cope> </pendence-> </dependências> </dependencyManagement>
Crie um arquivo de inicialização
FeignHystrixApplication
@SpringboOTApplication@Enablediscoveryclient@EnableFeignClientsPublic Classe FeignHystrixApplication {public static void main (string [] args) {springapplication.run (FeignHystrixApplication.class, args); }}Classe UserClient
@FeignClient (Value = "Biz-Service-0", Fallback = UserClientHystrix.Class) Interface pública UserClient {@ReQuestMapping (Method = requestMethod.get, value = "/getUser") Usuário público getUserinfo (); @RequestMapping (Method = requestMethod.get, value = "/getUser") public string getUserinfostr (); @RequestMapping (Method = requestMethod.get, value = "/info") public string info ();}Crie uma classe de flash rutas UserClientHystrix
@ServicePublic Classe UserClientHySTrix implementa UserClient {@Override User Public Usuário getUserinfo () {lança novo NullPointerException ("Usuário getUserinfo () não está disponível .."); } @Override Public String getUserinfostr () {return "userClientHySTrix getUserinfostr () é um serviço de fallback não está disponível .."; } @Override public string info () {return "userClientHyStrix info () é o serviço de fallback não está disponível .."; }}Quando uma exceção ocorre na rede, ela pode pular diretamente para a classe de implementação aqui
Crie uma aula de ação
UserController
@Autowired UserClient UserClient; @RequestMapping (value = "/getUserinfo", método = requestMethod.get) usuário público getUserinfo () {return userClient.getUserinfo (); } @ReQuestMapp (value = "/getUserinfostr", métod = requestMethod.get) public string getUserinfostr () {return userClient.getUserinfostr (); } @ReQuestMapping (value = "/info", método = requestMethod.get) public string info () {return userClient.info (); }Inicie o: Eureka_register_service (Centro de Registro)
Em seguida, execute a famosa famosa que escrevemos
No momento, obviamente descobrimos que o serviço de serviço-0 não estava em execução, então abrimos http://127.0.0.1:8005/getuserinfostr
Aparecer
UserClientHystrix getUserInfostr () está fallback O serviço não está disponível. .
Este é o nosso resultado de retorno de circuito personalizado
Se você não precisar quebrar a página, isso aparecerá
Whitelabel Error Pagethis O aplicativo não possui mapeamento explícito para /erro, então você está vendo isso como um fallback.WED 22 de março 14:32:21 CST 2017 Houve um erro inesperado (tipo = erro interno do servidor, status = 500) .getUserinfo falhou e falha no outono.
Endereço de código: https://github.com/zhp8341/springclouddemo
Eu também li alguns princípios relacionados à Hystrix. Desde que não terminei de ler todos, ainda não os escrevi. Este artigo é baseado no uso e na aprendizagem de Feign.
Se você estiver interessado, pode conferir os detalhes oficiais da Hystrix, mas parece um pouco difícil.
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.