Spring Cloud Hystrix 流程分析

Spring Cloud Hystrix 流程分析

在这里插入图片描述

1.创建了HystrixCommand或HystrixObservableCommand对象

首先,构建一个HystrixCommand或是HystrixObservableCommand对象,用来表示对依赖服务的操作请求,同时传递所有需要的参数。
它采用了“命令模式”来实现对服务调用操作的封装。
这两个Command对象针对的应用场景:

  • HystrixCommand:用在依赖的服务返回单个操作结果的时候
  • HystrixObservableCommand:用在依赖的服务返回多个操作结果的时候

2. 命令执行

一共存在4种命令的执行方式,而Hystrix在执行时会根据创建的Command对象以及具体的情况来选择一个执行。

  • HystrixCommand实现了下面的执行方式:
    • execute():同步执行,从依赖的服务返回一个单一的结果对象,或是在发生错误的时候抛出异常。
    • queue():异步执行,直接返回一个Future对象,其中包含了服务执行结果时要返回的单一结果对象。
  • HystrixObservableCommand实现了以下的执行方式:
    • observe():返回observable对象,代表了操作的多个结果,它是一个Hot Observable。
    • toObservable():返回observable对象,也代表了操作的多个结果,但它返回的是一个Cold Observable。
  • 在Hystrix的底层实现中大量地使用了RxJava
    • Observable:“事件源”或“被观察者";Subscriber: ”订阅者“或”观察者“;
    • Hot Observable,不论“事件源” 是否有“订阅者”,都会在创建后对事件进行发布,所以对于Hot Observable的每一个“订阅者”都有可能是从“事件源”的中途开始的,并可能只是看到了整个操作的局部过程。
    • Cold Observable,在没有“订阅者”的时候并不会发布事件,而是进行等待,直到有“订阅者”之后才发布事件,所以对于Cold Observable的订阅者,可以保证从一开始看到整个操作的全部过程。

3. 结果是否被缓存

若当前命令的请求缓存功能是被启用的,并且该命令缓存命中,那么缓存的结果会即以Observable对象的形式返回。

4. 断路器是否打开

在命令结果没有缓存命中的时候,Hystrix在执行命令前需要检查断路器是否为打开状态:
* 如果断路器是打开的,那么Hystrix不会执行命令,而是转接到fallback处理逻辑(第8步)。
* 如果断路器是关闭的,那么Hystrix跳到第5步,检查是否有可用资源来执行命令。

5. 线程池/请求队列/信号量是否占满

如果与命令相关的线程池和请求队列,或者信号量(不使用线程池的时候)已经被占满,那么Hystrix也不会执行命令,而是转接到fallback处理逻辑(第8步)。
注意:Hystrix所判断的线程池并非容器的线程池,而是每个依赖服务的专有线程池。
Hystrix为了保证不会因为某个依赖服务的问题影响到其他依赖服务而采用了”舱壁模式(Bulkhead Pattern)“来隔离每个依赖的服务。

6. HystrixObservableCommand.construct()或HystrixCommand.run()

  • Hystrix会根据编写的方法来决定采取什么样的方式去请求依赖服务。
    • HystrixCommand.run():返回一个单一的结果,或者抛出异常。
    • HystrixObservableCommand.construct():返回一个obserevable对象来发射多个结果,或通过onError发送错误通知。
  • 如果run()或construct()方法的执行事件超过了命令设置的超时阀值,当前的线程将会抛出一个TimeoutException(如果该命令不在其自身的线程中执行,则会通过单独的计时线程来抛出)。在这种情况下,Hystrix会转接到fallback处理逻辑(第8步)。
  • 如果当前命令没有被取消或中断,那么它最终会忽略run()或者construct()方法的返回。

7. 计算断路器的健康度

Hystrix会将”成功“,”失败“,”拒绝“,”超时“等信息报告给断路器,而断路器会维护一组计数器来统计这些数据。
断路器会使用这些统计数据来决定是否要将断路器打开,对某个依赖服务的请求进行“熔断/短路”,直到恢复期结束。若在恢复期结束后,根据统计数据判断如果还是未达到健康指标,就再次“熔断/短路”。

8. fallback处理

“服务降级”:当命令执行失败,Hystrix会进入fallback尝试回退处理。
引起服务降级处理的情况:

  • 第4步,当前命令处于"熔断/短路"状态,断路器是打开的时候。
  • 第5步,当前命令的线程池、请求队列或信号量被占满的时候。
  • 第6步,HystrixObservableCommand.contruct()或HystrixCommand.run()抛出异常的时候。

9. 返回成功的响应

参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值