概述:

字面意思是豪猪。作用是保护你的应用。Netflix会有服务实时调用,hystrix提供服务降级。

目标是将依赖独立化,防止拖垮整个服务。(属于降级服务。)

作用:

第三方接口超时或失败时,保护服务。

防止系统链式雪崩。

快速失败与恢复,优雅降级。

提供近实时监控,报警。

工作原理:

将外部依赖封装到HystrixCommand或HystrixObervableCommand中。工作时需要继承此类。

每个依赖有独立线程池,线程池满则拒绝请求。

调用失败时指定fallback方式。

服务熔断机制。

指定独立的超时(建议高于tp99.5)。

可视化结果。

降级与熔断:

大致上说,降级是指单次访问,失败会做降级。

熔断是一段时间的状况,需要足够大的访问量去激活。

使用方式:

调用服务方继承HystrixCommand类,需要实现fallback后执行的函数getfallback。fallback逻辑中,禁止进行网络调用,一般返回默认值。

效果展示:

大量超时(熔断)时,大部分请求将不再尝试被依赖方,返回默认值,会有一两个请求被放过去试图访问,有问题就继续熔断,一两个请求没问题则会逐步恢复正常服务。

大量异常(熔断)时,与上述情况类似。

在Hystrix配置(如超时熔断的时间上限)更改后,需要重启服务进程。(不支持热修改)

整体流程:

hystrix学习-LMLPHP

流程说明:
1:每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中.
2:执行execute()/queue做同步或异步调用.
3:判断熔断器(circuit-breaker)是否打开,如果打开跳到步骤8,进行降级策略,如果关闭进入步骤.
4:判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤8,否则继续后续步骤.
5:调用HystrixCommand的run方法.运行依赖逻辑
5a:依赖逻辑调用超时,进入步骤8.
6:判断逻辑是否调用成功
6a:返回成功调用结果
6b:调用出错,进入步骤8.
7:计算熔断器状态,所有的运行状态(成功, 失败, 拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态.
8:getFallback()降级逻辑.
以下四种情况将触发getFallback调用:
(1):run()方法抛出非HystrixBadRequestException异常。
(2):run()方法调用超时
(3):熔断器开启拦截调用
(4):线程池/队列/信号量是否跑满
8a:没有实现getFallback的Command将直接抛出异常
8b:fallback降级逻辑调用成功直接返回
8c:降级逻辑调用失败抛出异常
9:返回执行成功结果

状态图

hystrix学习-LMLPHP

断路器HystrixCircuitBreaker有三个状态,
CLOSED关闭状态:允许流量通过。
OPEN打开状态:不允许流量通过,即处于降级状态,走降级逻辑。
HALF_OPEN半开状态:允许某些流量通过,并关注这些流量的结果,如果出现超时、异常等情况,将进入OPEN状态,如果成功,那么将进入CLOSED状态。

hystrix学习-LMLPHP

hystrix学习-LMLPHP

ref:

https://github.com/Netflix/Hystrix

https://github.com/Netflix/Hystrix/wiki/How-To-Use

https://github.com/Netflix/Hystrix/wiki/How-it-Works

https://www.jianshu.com/p/b9af028efebb

https://segmentfault.com/a/1190000005988895

hystrix学习-LMLPHP

https://www.cnblogs.com/yepei/p/7169127.html

https://blog.csdn.net/manzhizhen/article/details/80296655

https://www.javazhiyin.com/25962.html

https://segmentfault.com/a/1190000005988895

https://github.com/hehuilei/advanced-java/blob/master/docs/high-availability/hystrix-introduction.md

05-08 15:03