Hystrix
工作原理
步骤一:创建 command
步骤二:调用 command 执行方法
步骤三:检查是否开启缓存(不太常用)
步骤四:检查是否开启了断路器
步骤五:检查线程池/队列/信号量是否已满
步骤六:执行 command
步骤七:断路健康检查
步骤八:调用 fallback 降级机制
资源隔离
线程池:在需要调用接口的地方使用 command 来管理。设置线程池容量10,然后设置了队列为5。当线程池和队列都满了,直接进行拒绝策略,然后进行降级操作。
信号量:还有一种方式通过 信号量来控制。他主要是调用自己服务内部的数据。不用进行接口调用。
请求缓存
servletContext 参数一样,直接走上一次的缓存。
断路器执行原理
Closed
断路器关闭:调用下游的请求正常通过Open
断路器打开:阻断对下游服务的调用,直接走 Fallback 逻辑Half-Open
断路器处于半开状态:SleepWindowInMilliseconds
几个参数:
- 时间滑动窗口:比如说,要求在 10s 内经过断路器的流量必须达到 20 个,而实际经过断路器的请求有 19 个,即使这 19 个请求全都失败,也不会去判断要不要断路。
- 异常比例:表示异常比例达到多少,才会触发断路,默认值是 50(%)。
断路器状态由 Close 转换到 Open,在之后
SleepWindowInMilliseconds
时间内,所有经过该断路器的请求会被断路,不调用后端服务,直接走 Fallback 降级机制,默认值 5000(ms)。而在该参数时间过后,断路器会变为Half-Open
半开闭状态,尝试让一条请求经过断路器,看能不能正常调用。如果调用成功了,那么就自动恢复,断路器转为 Close 状态。降级
Hystrix 出现以下四种情况,都会去调用 fallback 降级机制:
短路:断路器处于打开的状态。
- reject:资源池已满(线程池+队列 / 信号量)。
- error:Hystrix 调用各种接口,或者访问外部依赖,比如 MySQL、Redis、Zookeeper、Kafka 等等,出现了任何异常的情况。
- timeout:访问外部依赖的时候,访问时间过长,报了 TimeoutException 异常。
- 重试次数达到阈值
我们通过返回默认值,或者直接返回null,或者返回友情提示。
fallback也是需要设置信号量,默认是10。