Disjuntor Hystrix para microsserviços que você deve conhecer

Os microsserviços tornaram-se a arquitetura de tecnologia dominante perseguida pelos principais fabricantes. A perspectiva de aprender microsserviços é muito promissora, e o SpringCloud se tornou a principal pilha de tecnologia de microsserviços. Esta série de artigos se concentrará na pilha de tecnologia SpringCloud e analisará e explicará de forma abrangente a aplicação real da pilha de tecnologia SpringCloud no cenário de microsserviços.

Spring Cloud Hystrix

Índice de Conhecimento

  • Efeito avalanche
  • Introdução ao Hystrix
  • Demonstração do caso
  • substituto global
  • Plataforma de monitoramento de painel Hystrix

1 efeito avalanche

Em um ambiente de sistema distribuído, dependências semelhantes entre serviços são muito comuns e uma chamada de negócios geralmente depende de vários serviços básicos. Conforme mostrado na figura abaixo, para chamadas síncronas, quando o serviço de estoque não está disponível, a thread de solicitação de serviço de mercadoria é bloqueada. o serviço externo não pode ser continuado. E essa indisponibilidade pode ser repassada pela cadeia de chamadas de solicitação, um fenômeno conhecido como efeito avalanche.

170502_7fqS_2663573

Portanto, se um aplicativo não puder isolar falhas de dependências, o próprio aplicativo corre o risco de ser arrastado. Portanto, para construir um sistema distribuído estável e confiável, nossos serviços devem ter recursos de autoproteção. Quando os serviços dependentes estão indisponíveis, o serviço atual inicia a função de autoproteção para evitar o efeito avalanche.

2 Introdução ao Hystrix

Hystrix, que significa porco-espinho em inglês, com espinhos por todo o corpo, por causa de seu dorso coberto de espinhos, ele tem a capacidade de se proteger. .

HystrixÉ um Netflixsistema tolerante a falhas de código aberto que também possui recursos de autoproteção.

HystrixUsado para isolar o acesso a serviços remotos, bibliotecas de terceiros e evitar falhas em cascata 雪崩效应.

HystrixPossui as seguintes características:

请求熔断:类似于电路中的保险丝,当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open). 这时所有请求会直接失败而不会发送到后端服务. 断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN).这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN). Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力。
服务降级:Fallback相当于是降级操作. 对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值. fallback方法的返回值一般是设置的默认值或者来自缓存.告知后面的请求服务不可用了,不要再来了。
依赖隔离(采用舱壁模式,Docker就是舱壁模式的一种):在Hystrix中, 主要通过线程池来实现资源隔离. 通常在使用的时候我们会根据调用的远程服务划分出多个线程池.比如说,服务A的两个不同的接口分别调用了服务B和服务C,假设服务B出现了阻塞,同时服务B在服务A中对应的接口被频繁调用,由于服务B的阻塞导致了资源在调用B时被耗尽,此时其他请求服务A中服务C对应的接口时也会出现阻塞,为了避免这种情况Hystrix允许针对不同的服务调用配置不同的线程池,用以进行依赖隔离,如服务A中针对服务B和服务C的调用都配置了50个线程的线程池。此时如果在调用服务A时发生了阻塞,那么不会耗尽所有资源,此时服务A中的调用服务B的接口依然可以对外提供服务。
请求缓存:比如一个请求过来请求我userId=1的数据,你后面的请求也过来请求同样的数据,这时我不会继续走原来的那条请求链路了,而是把第一次请求缓存过了,把第一次的请求结果返回给后面的请求。
请求合并:利用一个合并处理器,将对同一个服务发起的连续请求合并成一个请求进行处理(这些连续请求的时间窗默认为10ms),在这个过程中涉及到的一个核心类就是HystrixCollapser。

Spring Cloud Hystrixsim Hystrixo encapsulamento facilita o uso de recursos no Spring CloudsistemaHystrix

demonstração de 3 casos

A seguir, service-consumerdemonstramos Hystrixcomo usar

3.1 Apresentando dependências

Introduzido em service_consumer_pom.xml

<!--熔断Hystrix starter-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

3.2 Ligue o fusível

Ligue o fusível via @EnableCircuitBreakeranotação

/**
 * Copyright (c) 2022 itmentu.com, All rights reserved.
 *
 * @Author: yang
 */
@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
public class ServiceConsumerApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }

    @Bean
    @LoadBalanced//开启负载均衡
    public RestTemplate restTemplate(){
    
    
        return new RestTemplate();
    }
}

3.3 Habilitar downgrade de serviço

@HystrixCommandAnote a interface e o método de downgrade que permitem o processamento de downgrade .

@GetMapping("/hello-loadbanlance")
@HystrixCommand(fallbackMethod ="fallBackMethod")
public String hello2(){
    
    
    // 1.通过注册中心的服务名构建url
    String url = "http://service-provider/hello";
    // 2.发送请求
    return restTemplate.getForObject(url,String.class);
}

@GetMapping("/hello-feign")
@HystrixCommand(fallbackMethod ="fallBackMethod")
public String hello3(){
    
    
    return helloFeign.hello();
}

// 熔断方法
public String fallBackMethod(){
    
    
    return "fail";
}

Descrição do código:

1:@HystrixCommand注解用来标记一个可熔断的接口方法
2:fallbackMethod=““表示触发熔断后的快速响应结果
3:需注意熔断方法的返回值必须和@HystrixCommand标记的接口返回值相同

3.4 Configurar a política do disjuntor

# 配置熔断策略:
hystrix:
  command:
    default:
      circuitBreaker:
        forceOpen: false # 强制打开熔断器 默认false关闭的
        errorThresholdPercentage: 50 # 触发熔断错误比例阈值,默认值50%
        sleepWindowInMilliseconds: 5000  # 熔断后休眠时长,默认值5秒
        requestVolumeThreshold: 20  # 熔断触发最小请求次数,默认值是20
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 1000  # 熔断超时设置,默认为1秒

Descrição do código:

1:当Hystrix Command请求后端服务失败数量超过errorThresholdPercentage配置比例(默认50%),断路器会切换到开路状态(Open). 
2:这时所有请求会直接失败而不会发送到后端服务. 断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN).
3:这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN). 
4:Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力。

3.5 Teste

Inicie o serviço, ligue

http://localhost:8002/consumer/hello-loadbanlance
http://localhost:8002/consumer/hello-feign

Após o sucesso, pare a service-providerinstância e chame o disjuntor novamente

imagem-20220320170021670

imagem-20220320170043537

4 Substituição global

ConsumerControllerAdicione uma @DefaultPropertiesanotação nele e configure o método defaultFallbackpadrão porfallback

@RestController
@RequestMapping("/consumer")
@DefaultProperties(defaultFallback="defaultFallBack")
public class ConsumerController {
    
    
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;
    @Autowired
    private HelloFeign helloFeign;

    @GetMapping("/hello")
    public String hello(){
    
    
        //1、获取Eureka中注册的provider-service实例列表
        List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("service-provider");
        //2、获取实例
        ServiceInstance serviceInstance = serviceInstanceList.get(0);
        //3、根据实例的信息拼接的请求地址
        String url = serviceInstance.getUri()+ "/hello";
        //4、发送请求
        return restTemplate.getForObject(url,String.class);
    }

    @GetMapping("/hello-loadbanlance")
    @HystrixCommand
    public String hello2(){
    
    
        // 1.通过注册中心的服务名构建url
        String url = "http://service-provider/hello";
        // 2.发送请求
        return restTemplate.getForObject(url,String.class);
    }

    @GetMapping("/hello-feign")
    @HystrixCommand
    public String hello3(){
    
    
        return helloFeign.hello();
    }

    // 全局熔断方法
    public String defaultFallBack(){
    
    
        return "fail";
    }
}

Descrição do código:

1:@DefaultProperties表示默认配置
2:该配置只会对和全局熔断方法返回值相同的接口方法生效
3:当配置了defaultFallback,@HystrixCommand中无需配置即可快速失败,当然也可以自行配置

5 Plataforma de monitoramento de painel Hystrix

HystrixO funcionário fornece uma plataforma de monitoramento baseada em gráficos DashBoard(painel). HystrixOs painéis podem exibir @HystrixCommando status de cada disjuntor (método anotado).

5.1 dependências de pom

<!--监控坐标-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--仪表板坐标-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

5.2 Abra o Painel

/**
 * Copyright (c) 2022 itmentu.com, All rights reserved.
 *
 * @Author: yang
 */
@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrixDashboard
public class ServiceConsumerApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }

    @Bean
    @LoadBalanced//开启负载均衡
    public RestTemplate restTemplate(){
    
    
        return new RestTemplate();
    }
}

5.3 Arquivos de configuração

#暴露全部监控信息,可以只填写hystrix.stream,也可以暴露全部 * ,注意在yml文件中特殊符号需要加引号
management:
  endpoints:
    web:
      exposure:
        include: '*'

5.4 Consola

Visite http://localhost:8002/hystrix e adicione o serviço a ser monitorado http://localhost:8002/turbine/turbine.stream

imagem-20220320173308448

imagem-20220320173503787

Acho que você gosta

Origin blog.csdn.net/scmagic/article/details/123919191
Recomendado
Clasificación