Hystrix的主要功能包括:服务降级(fallback)、服务熔断(break)、服务限流(flow limit)
【Git相关地址】
项目地址:https://github.com/Netflix/Hystrix
如何工作参考地址:https://github.com/Netflix/Hystrix/wiki/How-it-Works#flow4 如何使用参考地址: https://github.com/Netflix/Hystrix/wiki/How-To-Use
【服务降级场景】
# 程序代码抛异常
# 服务调用超时
# 服务被熔断
# 线程池满了,没有足够线程去处理请求时
【服务端降级方法:】
step1:Application启动类添加 @EnableCircuitBreaker 注解
step2:被调用的服务方法上添加@HystrixCommand注解,如下:
@HystrixCommand(fallbackMethod = "productInfoTimeoutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "5000")
})
step3:添加fallback处理逻辑方法:productInfoTimeoutHandler
【客户端降级方法:】
step1:application.yml中添加配置
feign:
hystrix:
enabled: true
step2:主启动类上添加 @EnableHystrix 注解
step3:业务类方法上添加:
@HystrixCommand(fallbackMethod = "paymentInfoTimeoutFallbackMethod",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
})
step4:编写paymentInfoTimeoutFallbackMethod处理方法
注:以上方案是1对1的,即在每个方法上配置fallback方法,并编写fallbackMethod,显然会造成代码膨胀,而且耦合度大。所以需要把全局fallback与定制fallback区分对待!优化方案如下:使用注解 -> @DefaultProperties
【定制全局统一fallback:】
step1:在Controller上添加注解:@DefaultProperties(defaultFallback = "GlobalFallbackMethod")
step2:在业务方法上添加@HystrixCommand注解
step3:编写全局降级响应方法:GlobalFallbackMethod
注:该方法只是作用范围仅仅是在一个类里面。
@DefaultProperties 可以在一个类里面将通用的fallback与需要单独特别处理的fallback进行分开处理。
【最佳方案】
在@FeignClient()注解中配置fallback属性值,指定处理类,该值指向@FeignClient()标识的接口的一个实现类,
该实现类中的方法就是对应的接口中每个方法的fallback方法。
举例:
# 接口
@Component
@FeignClient(value = "CLOUD-PRODUCT-SERVICE", fallback = ProductFallbackService.class)
public interface ProductHystrixService {
@GetMapping("/product/ok/{id}")
public String getProductInfo(@PathVariable("id") Integer id);
}
#fallback实现类
@Component
public class ProductFallbackService implements ProductHystrixService {
@Override
public String getProductInfo(Integer id) {
return "Product Service fall back - 商品服务暂时不可用,请稍后再试!";
}
// 方法...
}