(1) 构建HystrixCommand command对象
每一个依赖调用的HystrixCommand 对象将通过必要的参数进行构造,然后对服务进行调用。
如:
HystrixCommand command = new HystrixCommand(arg1, arg2)
(2)同步或异步执行
command的执行可以是同步的也可以使异步的。
//同步执行
K value = command.execute()
//异步执行
Future
除非command被指定为不在一个线程里执行,同步方法通过执行execute()并激活queue().get() 实现
(3) 是否开路?
一旦command执行之后,它首先通过熔断器进行检查,“是否开路” 假如时开路,command将不在执行,直接路由到(8)HystrixCommand.getFallback().
假如是闭路。command将执行(4)核查是否有有效的容量执行command
(4)线程池/队列/信号是否超额 如果和command关联的线程池,队列,信号(假如不在同一个线程中)超额,执行将被拒绝,并立即通过(8)HystrixCommand.getFallback().路由
(5) HystrixCommand.run() run() 方法的具体实现被执行
(5a)command执行超时
假如command被配置在同一个线程中运行,并且run()方法超过了commnad的超时的值,则该线程江抛出一个TimeoutException例外。在这种情况下,响应将路由到(8)HystrixCommand.getFallback()并且run()方法的返回值讲被丢弃(假如它没有被取消或中断)
不在同一个线程中运行的command,该逻辑不适应。
(6) command运行是否成功 应用的流程基于(5) HystrixCommand.run()方法的执行被路由。
(6a)成功响应
假如没有例外被抛出并且返回一个响应,经过一些日记和metrics报告后,command返回响应。
(6b) 响应失败 当响应抛出一个例外,Hystrix将其标示为“失败‘ --这将潜在的触发熔断机制- 将被路由到(8) HystrixCommand.getFallback().
(7) 计算电路的健康
成功,失败,拒绝和超时都被报告给断路器,并保持一组滚动的计数器集用于统计数据
这些统计数据用于决定电路是否”熔断“,达到某一点后,此后的请求都是短路的,直到恢复期过去,直到健康检查成功后,电路被再次”闭合“。
(8) HystrixCommand.getFallback() 当一个命令执行失败时,执行回退——当例外被(5)HystrixCommand.run()抛出时,当由于电路处于打开状态下,(3)命令处于短路状态,或(4)命令的线程池 队列或信号的超过其处理能力。
回退的目的是从内存缓存或者通过静态逻辑提供一个通用的响应,不需要任何网络依赖。
如果想要在回退中需要一个网络调用,则应当调用另一个HystrixCommand。
(8a) 回退没有实现
假如HystrixCommand.getFallback()没有完成,将抛出一个例外,调用者将负责处理它。
(8b) 回退成功
假如回退成功,将返回一个响应,并返回给调用者。
(8c) 回退失败
假如HystrixCommand.getFallback()调用失败,将抛出例外,调用者负责处理它
有回退实现,但是调用失败,这不是最佳实践。一个回退的实现最好是不实现任何导致再次失败的逻辑。
(9) 返回成功的响应
假如(6a)成功响应被接收打到,它将返回给调用者。