hystrix学习
概述:
字面意思是豪猪。作用是保护你的应用。Netflix会有服务实时调用,hystrix提供服务降级。
目标是将依赖独立化,防止拖垮整个服务。(属于降级服务。)
作用:
第三方接口超时或失败时,保护服务。
防止系统链式雪崩。
快速失败与恢复,优雅降级。
提供近实时监控,报警。
工作原理:
将外部依赖封装到HystrixCommand或HystrixObervableCommand中。工作时需要继承此类。
每个依赖有独立线程池,线程池满则拒绝请求。
调用失败时指定fallback方式。
服务熔断机制。
指定独立的超时(建议高于tp99.5)。
可视化结果。
降级与熔断:
大致上说,降级是指单次访问,失败会做降级。
熔断是一段时间的状况,需要足够大的访问量去激活。
使用方式:
调用服务方继承HystrixCommand类,需要实现fallback后执行的函数getfallback。fallback逻辑中,禁止进行网络调用,一般返回默认值。
效果展示:
大量超时(熔断)时,大部分请求将不再尝试被依赖方,返回默认值,会有一两个请求被放过去试图访问,有问题就继续熔断,一两个请求没问题则会逐步恢复正常服务。
大量异常(熔断)时,与上述情况类似。
在Hystrix配置(如超时熔断的时间上限)更改后,需要重启服务进程。(不支持热修改)
整体流程:
流程说明: 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:返回执行成功结果
状态图
断路器HystrixCircuitBreaker有三个状态,
CLOSED关闭状态:允许流量通过。
OPEN打开状态:不允许流量通过,即处于降级状态,走降级逻辑。
HALF_OPEN半开状态:允许某些流量通过,并关注这些流量的结果,如果出现超时、异常等情况,将进入OPEN状态,如果成功,那么将进入CLOSED状态。
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
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