官网图例
步骤说明
- 创建Hystrix ommand (用在依赖的服务返回单个操作结果的时候)或HystrixObserableCommand (用在依赖的服务返回多个操作结果的时候)对象。
- 命令执行。中HystrixComand实现了下面前两种执行方式;而HystrixObservableCommand实现了后两种执行方式: execute0: 同步执行,从依赖的服务返回一个单-的结果对象,或是在发生错误的时候抛出异常。queue0: 异步执行,直接返回-个Future对象,其中包含了服务执行结束时要返回的单一结果对象。observe0: 返回Observable对象。它代表了操作的多个结果,它是一个Hot Obserable (不论“事件源”是否有“订阅者"。都会在创建后对事件进行发布,所以对于Hot Observable的每一个“订阅者"都有可能是从。事件源"的中途开始的,井可能只是看到了整个操作的局部过程) . toObservable0: 同样会返回 Observable对象,也代表了操作的多个结果,但它返回的是一个Cold Observable (没有“订阅者"的时候并不会发布事件,而是进行等待,直到有“订阅者"之后才发布事件,所以对于Cold Observable的订阅者,它可以保证从-开始看到整个操作的全部过程) 。
- 若当前命令的请求缓存功能是被启用的,并且该命令缓存命中。那么缓存的结果会立即以Observable对象的形式返回。
- 检查断路器是否为打开状态。如果断路器是打开的,那么Hystrix不会执行命令,而是转接到fllback处理逻辑(第8步) ;如果斷路器是关闭的,检查是否有可用资源来执行命令(第5步) 。
- 线程油/请求队列信号量是否占满,如果命令依赖服务的专有线程油和请求队列,或者信号量(不使用线程池的时候)已经被占满,那么 Hystrix也不会执行命令,而是转接到 fllbalk处理逻辑(第8步)。
- Hystrix会根据我们编写的方法来决定采取什么样的方式去请求依赖服务。HystrixCommand.run0: 返回-个单-的结果, 或者抛出异常。HystrixObservableCommand.construct0: 返回一 个Observable对象来发射多个结果,或通过onError发送错误通知。
- Hytrix会将“成功"、“失败”、“拒绝"、 “超时“等信息报告给断路器,而断路器会维护- 组计数器来统计这些教据, 断路器会使用这些统计数据来决定是否要将断路器打开,来对某个依赖服务的请求进行“熔断/短路"。
- 当命令执行失败的时候,Hystrix 会进入fllback尝试回退处理,我们通常也称该操作为 “服务降级"。而能够引起服务降级处理的情况有下面几种:第4步:当前命令处于 “熔断/短路“状态。断路器是打开的时候。第5步:当前命令的线程池、请求队列或 者信号量被占满的时候,第6步: HystrixObservableCommand.construct0 或HystrixCommand.run0抛出异常的时候。
- 当Hytrix命令执行成功之后,它会将处理结果直接返回或是L以observable 的形式返回。
tips:如果我们没有为命令实现降级逻辑或者在降级处理逻辑中抛出了异常,Hytrix 依然会返回一个Observable对象,但是它不会发射任何结果数据。 而是通过 onError方法通知命令立即中断请求,并通过onError0方法将引起命令失败的异常发送给调用者。