在学习Hystrix之前,首先引入一个问题场景,服务雪崩。如下图所示:
可以看到,三个入口服务A、B、C最终都会请求到服务T。当服务T的请求过载,打满CPU都无法匹配请求的频率时,同步调用的上级服务就会逐级发生阻塞,最终导致所有服务陷入瘫痪状态,这就是服务雪崩的一种场景。如何解决雪崩?常见的几种方式就是降级、隔离、熔断、请求缓存以及请求合并。那么Hystrix是如何实现这几个功能的呢?在开始代码实践前,有必要对原理进行一定程度的了解。
再通过一张流程图来加深对上方图中链路的理解:
1.构造一个 HystrixCommand或HystrixObservableCommand对象,用于封装请求,并在构造方法 配置请求被执行需要的参数;
2.执行命令,Hystrix提供了4种执行命令的方法,后面详述;
3.判断是否使用缓存响应请求,若启用了缓存,且缓存可用,直接使用缓存响应请求。Hystrix支持请求缓存,但需要用户自定义启动;
4.判断熔断器是否打开,如果打开,跳到第8步;
5.判断线程池/队列/信号量是否已满,已满则跳到第8步;
6.执行HystrixObservableCommand.construct()或HystrixCommand.run(),如果执行失败或者超时跳,到第8步;否则,跳到第9步;
7.统计熔断器监控指标;
8.走Fallback备用逻辑;
9.返回请求响应
参考资料:
https://www.cnblogs.com/yb-ken/p/15068392.html
http://www.uml.org.cn/wfw/201906063.asp?artid=22057