https://github.com/Netflix/Hystrix/wiki/How-it-Works
目录
1. 整体流程
简单概述: 将请求信息封装为对象 , 进行后续一步一步判断(是否开启拒绝,是否线程池满等等),否则就 执行fallback应急计划等,一下为详细讲解
2. 流程详细讲解
2.1 封装request为command
通过构造(将request参数通过构造器传入) HystrixCommand , HystrixObservealbeCommand 进行对request的封装
例子:
HystrixCommand hystrixCommand = new HystrixCommand(args1,args2);
返回单一响应
HystrixObservableCommand command = new HystrixObservableCommand (args1,args2);
返回一个观察者命令对象, 通过此对象返回响应
2.2 执行command (方法介绍)
可以使用四个方法
K value = command.execute();
Future<K> fValue = command.queue();
Observable<K> ohValue = command.observe(); //hot observable
Observable<K> ocValue = command.toObservable(); //cold observable
2.3 是否有缓存
判断是否 请求和响应都进行了缓存,是的话,就直接返回Observalbe结果
2.4 链路是否打开
是否可以正产接收请求, 如果 circuit -breaker打开 则,直接返回 fallback处理
,关闭则进行下一步
2.5 判断线程池 队列 信号量是否有空间
如果空间已经满, 就直接返回fallback处理, 不会进入队列排队
2.6 HystrixObservableCommand.construct() or HystrixCommand.run()
执行两种方法, 如果方法超时, 抛出timeoutexception 并 则直接走fallback方法, 并中断此线程.
需要注意的是, 由于jvm无法强行中断线程, 所以需要通过 InterceptionExceptions来进行中断处理,否则可能会出现, 排除超时异常,但是此线程还是再线程池中继续运行.
2.7 检查链路健康
会向 circuit breaker 报告 成功 失败 拒绝 超时等信息
根据这些信息,会判断何时进行熔断控制, 并恢复到指定值之后 ,再次开启
2.8 Get fallback 提供失败统一处理
当之前的步骤中出现 种种异常时(链路没打开,超时,执行异常), 可以通过定义fallback来统一对发生异常情况进行 后续操作.
需要注意的是,如果在fallback中再次 有调用其他依赖,则需要再次封装hystrix.
当不实现fallback方法的时候,也会有onError 通知机制, 分别在command的四个方法有不同的获取异常方式.