工作流程
Step1:构建命令
创建HystrixCommand或者HystrixObservableCommand对象:
HystrixCommand command = new HystrixCommand(arg1, arg2);
HystrixObservableCommand command = new HystrixObservableCommand(arg1, arg2);
Step2:执行命令
K value = command.execute(); //同步,针对HystrixCommand
Future<K> fValue = command.queue(); //异步,针对HystrixCommand
Observable<K> ohValue = command.observe(); //异步,全部
Observable<K> ocValue = command.toObservable(); //异步,全部
Step3:判断响应是否已缓存
如果请求对应的响应已经在缓存中,直接返回响应;
Step4:判断熔断器是否打开
如果熔断器没打开,继续执行下一步;否则,命令不再执行,直接跳到步骤8,执行降级。
Step5:判断线程池、任务队列、信号量是否已满
如果没满,继续执行下一步;否则,命令不再执行,直接跳到步骤8,执行降级。
Step6:调用依赖的服务
调用依赖的外部服务,即执行HystrixObservableCommand.construct() or HystrixCommand.run()。如果命令执行超时,则会抛出TimeoutException,直接跳到步骤8,执行降级。如果命令执行成功,则回调onCompleted()方法。
Step7:监控信息收集
熔断器定时采集命令执行过程中各种信息,包括成功、失败、超时和拒绝等,用于计算判断熔断器是否需要断开/开启等。
Step8:执行降级
执行HystrixCommand.getFallback()或者HystrixObservableCommand.resumeWithFallback(),如果降级逻辑出错,则回调onError()方法。