当前位置: 代码迷 >> 综合 >> 3.Hystrix
  详细解决方案

3.Hystrix

热度:97   发布时间:2023-12-05 18:21:22.0

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能保证在一个服务出问题的情况下不会导致整体服务失败,避免级联故障,提高分布式系统的弹性。

服务降级(FallBack)

Hystrix可以实现服务降级和熔断。“断路器”相当于一个开关,当某个服务发生故障后,会像调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要的占用,从而避免了故障在分布式系统中的蔓延乃至雪崩。

一般都在客户端处理降级,当然服务端也可以处理但是通常在客户端
1.feign开启降级

feign:hystrix:enabled: true

2.启动类添加注解
@EnableHystrix

3.在调用服务端接口的controller方法上添加降级注解

// fallbackMethod 是服务降级的方法,当发生降级就会调用该方法,注意该方法的参数需和本方法的参数一致
// 以下注解不只是超时会触发服务降级,当本方法发生运行时异常也会触发服务降级,如果想发生异常进行全局异常处理可以添加 ignoreExceptions = {
    Exception.class} 属性进行排除
@HystrixCommand(fallbackMethod = "timeOut_handler",commandProperties = {
    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1000")})

以上name的值需要手写,也可以使用以下这个类

@HystrixCommand(fallbackMethod = "timeOut_handler",commandProperties = {
    @HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS,value = "1000")}

4.在第3步只是针对一个方法做了服务降级,以下是全局降级

  • 4.1在controller上添加注解

    @DefaultProperties(defaultFallback = "default_hystrix",commandProperties = {
          @HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS,value = "1500")})
    
  • 4.2在具体方法上添加注解
    @HystrixCommand,如果此时注解上加入了fallbackMethod属性,那么以该注解为优先全局注解次之,如果没加表示该方法要走服务降级 使用的是全局的降级

5.业务逻辑和服务降级进行解耦。当在调用过程中服务方突然宕机,如果是使用的fegin可以使用@FeignClient中的fallback进行降级

  • 5.1添加fallback要指定的降级类,实现调用接口类,重写要调用的方法,然后@FeignClient 添加 fallback

    
    /**
    * 调用第三方的接口类
    */
    @Component
    @FeignClient(value = "cloud-payment-hystrix-service",fallback = PaymentHystrixService.class)
    public interface PaymentHystrixService {
          @GetMapping("payment/hystrix/ok/{id}")public String ok(@PathVariable("id") Integer id);@GetMapping("payment/hystrix/timeOut/{id}")public String timeOut(@PathVariable("id") Integer id);
    }/**
    * 调用第三方的接口类的降级类
    */
    @Component
    public class PaymentFallbackService implements PaymentHystrixService{
          @Overridepublic String ok(Integer id) {
          return "调用方宕机";}@Overridepublic String timeOut(Integer id) {
          return "调用方宕机";}
    }
    

服务熔断(break)

相当于生活中的保险丝,当访问量达到最大量后,将拒绝访问,然后调用服务降级的方法返回友好提示。
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出的链路的某个微服务出错不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到节点微服务调用响应正常后,恢复调用链路

@HystrixCommand(fallbackMethod = "breaker_handler",commandProperties = {
    @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"),@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "10"),@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "10000"),@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "60")})

1.断路器开关
2.请求总数
3.时间范围
4.错误百分比

在规定时间内请求总数达到峰值且达到错误百分比就会打开断路器。如果达不到峰值哪怕请求全部发生异常也不会打开断路器。当打开断路器后,就会进入fallbackMethod 指定的方法,断路器是打开状态所有请求都不会进行正常转发。一段时间之后(默认是5秒),这个时候断路器进入半开状态,会让一个请求进行转发,如果这个请求转发成功,会关闭断路器,之后恢复正常。

  相关解决方案