隔离
将请求封装在HystrixCommand中,然后这些请求在一个独立的线程中执行,每个依赖服务维护一个小的线程池(信号量),在调用失败或超时的情况下可以断开依赖调用或者返回指定逻辑。
熔断
当HystrixCommand请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open). 这时所有请求会直接失败而不会发送到后端服务,断路器保持在开路状态一段时间后(默认5秒),自动切换到半开路状态(HALF-OPEN),这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED),否则重新切换到开路状态(OPEN)。
降级
服务降级是指当请求后端服务出现异常的时候, 可以使用fallback方法返回的值 。
1. 容错模式
主动超时
Http请求主动设置一个超时时间,超时就直接返回,不会造成服务堆积。
限流
限制最大并发数。
熔断
当错误数超过阈值时快速失败,不调用后端服务,同时隔一定时间放几个请求去重试后端服务是否能正常调用,如果成功则关闭熔断状态,失败则继续快速失败,直接返回。(此处有个重试,重试就是弹性恢复的能力)。
隔离
把每个依赖或调用的服务都隔离开来,防止级联失败引起整体服务不可用。
降级
服务失败或异常后,返回指定的默认信息。
2. 容错流程
- 每个请求都会封装到 HystrixCommand 中。
- 请求会以同步或异步的方式进行调用。
- 判断熔断器是否打开,如果打开,它会直接跳转到 8 ,进行降级。
- 判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤8。
- 如果前面没有错误,就调用 run 方法,运行依赖逻辑。
5a. 运行方法可能会超时,超时后从 5a 到 8,进行降级。
- Success
6a. 运行正常会进入 6a,正常返回回去,同时把错误或正常调用结果告诉 7 (Calculate Circuit Health)。
6b. 运行过程中如果发生异常,6b. 会从6b到8,进行降级。
- Calculate Circuit Health它是 Hystrix 的大脑,是否进行熔断是它通过错误和成功调用次数计算出来的。
- 降级方法。
8a. 没有实现降级方法,直接返回异常信息回去。
8b. 实现降级方法,且降级方法运行成功,则返回降级后的默认信息回去。
8c. 实现降级方法,但是降级也可能出现异常,则返回异常信息回去 。
3. 容错理念
- 依赖都可能会失败。
- 资源都有限制(CPU、内存、线程池)。
- 网络并不靠谱。
- 延迟是应用稳定性最大杀手。