Hystrix 服务降级

服务提供方-服务降级

  1. 首先导入 Hystrix Maven 依赖
<!--新增hystrix-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. 在可能会超时或出现异常的方法上加 @HystrixCommand 注解,并添加回调方法
//超时降级演示
@HystrixCommand(fallbackMethod = "payment_TimeoutHandler", commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000") //5秒钟以内就是正常的业务逻辑
})
@GetMapping("/hystrix/timeout/{id}")
public String paymentInfo_Timeout(@PathVariable("id") Integer id) {
    String result = paymentService.payment_Timeout(id);
    log.info("*******result:" + result);
    return result;
}

// 方法名与 @HystrixCommand 声明的方法名一致
public String payment_TimeoutHandler(Integer id) {
        return "线程池:" + Thread.currentThread().getName() + " payment_TimeoutHandler,系统繁忙,请稍后再试\t o(╥﹏╥)o ";
    }
  1. 在主启动类上添加 @EnableCircuitBreaker 方法

服务消费方-服务降级

  1. 添加 Hystrix Maven 依赖
<!--新增hystrix-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. 添加 yml 配置
feign:
  hystrix:
    enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样。
  1. 添加 @HystrixCommand 注解配置,并添加
@HystrixCommand(fallbackMethod = "payment_TimeoutHandler", commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500") //5秒钟以内就是正常的业务逻辑
})
@GetMapping("/payment/hystrix/timeout/{id}")
public String paymentInfo_TimeOut(@PathVariable("id") Integer id){
    String result = paymentHystrixService.paymentInfo_Timeout(id);
    log.info("*******result:"+result);
    return result;
}

public String payment_TimeoutHandler(Integer id) {
    return "我是消费者80,对方支付系统繁忙请10秒后再试。或自己运行出错,请检查自己。";
}
  1. 在主启动类 @EnableHystrix 注解

服务降级-统一通用处理

每个业务方法对应一个兜底的方法,就会出现代码膨胀,代码耦合。
我们可以将统一通用处理和自定义独立处理的分开。

在不需要特殊处理的业务类上添加统一的注解

// 在 controller 类上添加默认的属性配置
@DefaultProperties(defaultFallback = "payment_global_fallback_method", commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500") // 1.5秒钟以内就是正常的业务逻辑
})
public class OrderHystrixController {
    ...

    // 如果没有添加相应的属性就是用默认的配置
    @HystrixCommand
    @GetMapping("/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id){
        int i = 10 / 0;
        String result = paymentHystrixService.paymentInfo_OK(id);
        log.info("*******result:"+result);
        return result;
    }
    
    // 如果是添加了相应的配置,那么就是用独立的处理方法
    @HystrixCommand(fallbackMethod = "payment_TimeoutHandler", commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500") //5秒钟以内就是正常的业务逻辑
    })
    @GetMapping("/payment/hystrix/timeout/{id}")
    public String paymentInfo_TimeOut(@PathVariable("id") Integer id){
        String result = paymentHystrixService.paymentInfo_Timeout(id);
        log.info("*******result:"+result);
        return result;
    }

    public String payment_TimeoutHandler(Integer id) {
        return "我是消费者80,对方支付系统繁忙请10秒后再试。或自己运行出错,请检查自己。";
    }

    public String payment_global_fallback_method(){
        return "我是消费者80,对方支付系统繁忙请10秒后再试。这是通用的回调函数。";
    }

服务降级的接口处理方法

  1. 导入相关依赖
<!--新增hystrix-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  1. 新增服务实现类,继承 FeignClient 接口
@Component
public class PaymentFallbackServiceImpl implements PaymentHystrixService {

    @Override
    public String paymentInfo_OK(Integer id) {
        return "-----PaymentFallbackService fall back-paymentInfo_OK , (┬_┬)";
    }

    @Override
    public String paymentInfo_Timeout(Integer id) {
        return "-----PaymentFallbackService fall back-paymentInfo_TimeOut , (┬_┬)";
    }
}
  1. 在 FeignClient 接口类中引用该实现类做为回调方法类
@Component
@FeignClient(value = "CLOUD-HYSTRIX-PAYMENT-SERVICE", fallback = PaymentFallbackServiceImpl.class)
public interface PaymentHystrixService {

    @GetMapping("/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id);

    @GetMapping("/payment/hystrix/timeout/{id}")
    public String paymentInfo_Timeout(@PathVariable("id") Integer id);
}
  1. 在 yml 配置文件中配置超时时间,同时开启处理自身容错
#设置Feign客户端超时时间(openfeign默认支持ribbon)
ribbon:
  ReadTimeout:  5000
  ConnectTimeout: 5000
  MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
  MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用
  OkToRetryOnAllOperations: false  #是否所有操作都重试
#hystrix的超时时间
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 6000
feign:
  hystrix:
    enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样。
posted @ 2022-05-17 09:40  ayi8  阅读(53)  评论(0编辑  收藏  举报