深入Hystrix底层执行流程
这是我参与更文挑战的第8天,活动详情查看: 更文挑战
接着上一篇文章 【SpringCloud系列】 深入Hystrix底层执行流程(1)
5. 检查线程池/队列/信号量是否已满
如果command线程池和队列已满,或者semaphore信号量已满,不会执行command,而直接去调用fallback降级机制,同时发送reject信息给断路器统计.
6.执行command
调用HystrixCommand的run()方法或HystrixObservableCommand对象的construct()方法来实际执行command
7.断路健康检查
Hystrix把每一个依赖服务的调用成功、失败、Reject、Timeout等事件发送给circuit breaker器,断路器就会对这些事件的次数进行统计,根据异常事件发生的比例*(5s异常次数20次开启断路器)来决定是否要进行断路(熔断),如果打开了断路器,那么在一段时间内会直接断路,返回降级结果。
8.调用fallback降级机制
HystrixCommand中,实现getFallback()方法,可提供降级机制 HystrixObservableCommand中,实现resumeWithFallback()方法,返回一个Observable对象,可提供降级结果。 如果没有实现fallback,或者fallback抛出了异常,Hystrix会返回一个Observable,但是不会返回任何数据。
在以下几种场景,Hystrix会调用fallback降级机制
- 断路器处于打开状态
- 线程池/队列/semaphore满了
- command执行超时
- run()或者construct()抛出异常 在降级机制中,建议返回默认的结果,比如静态代码逻辑,或者从内存的缓存中提取数据,尽量不进行网络请求。
不同的command执行方式,其fallback为空或者异常时的返回结果不同
- 对于execute(),直接抛出异常
- 对于queue(),返回一个Future,调用get()时抛出异常
- 对于observe(),返回一个Observable对象,但是调用subscribe()方法订阅它时,立即抛出调用者的onError()方法。
- 对于toObservable(),返回一个Observable对象,但是调用subscribe()方法订阅它时,立即抛出调用者的onError()方法。
不同的执行方式
- execute():获取一个Future.get(),拿到单个结果
- queue():返回一个Future
- observe():立即订阅Observable,然后启动8大执行步骤,返回一个拷贝的Observable,订阅时立即回调返回结果。
- toObservable():返回一个原始的Observable,必须手动订阅去执行8大步骤。