Hystrix 服务降级
服务提供方-服务降级
- 首先导入 Hystrix Maven 依赖
<!--新增hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 在可能会超时或出现异常的方法上加
@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 ";
}
- 在主启动类上添加
@EnableCircuitBreaker
方法
服务消费方-服务降级
- 添加 Hystrix Maven 依赖
<!--新增hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 添加 yml 配置
feign:
hystrix:
enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样。
- 添加
@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秒后再试。或自己运行出错,请检查自己。";
}
- 在主启动类
@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秒后再试。这是通用的回调函数。";
}
服务降级的接口处理方法
- 导入相关依赖
<!--新增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>
- 新增服务实现类,继承 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 , (┬_┬)";
}
}
- 在 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);
}
- 在 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 #如果处理自身的容错就开启。开启方式与生产端不一样。