通过上面两节我们了解了Hystrix的基本使用,下面我们将通过Hystrix官方的工作流程(如图所示)来解析Hystrix是怎样实现服务熔断】
图中执行的步骤如下: ① 创建一个HystrixCommand或者HystrixObservableCommand对象。 先通过调用HystrixCommand或HystrixObservableCommand类的构造方法,将依赖项的参数传递进去并创建HystrixCommand或HystrixObservableCommand对象,其内部使用了“命令模式”对外部依赖访问逻辑进行了封装。这两个对象的区别在于当依赖服务返回的结果是单个结果就用HystrixCommand,而HystrixObservableCommand返回的是多个结果。 ② 执行命令。 创建对象之后,会调用封装命令的方法执行命令。从图13-6中可以看到总共有4种命令方法。其中HystrixCommand类中封装了两种命令方法。 execute():采用同步阻塞的方式从依赖请求中获取单一的结果对象,出错时将抛出异常 queue():返回一个包含获取单一结果对象的Future对象。 HystrixObservableCommand类中封装了另外两种命令方法,并且使用了观察者-订阅者模式实现 observe():订阅一个从依赖请求中返回的代表响应的Observable对象 toObservable():同样返回一个Observable对象,只有当订阅它的时候才会执行Hystrix命令并返回结果。
③ 检查返回结果是否被缓存。 如果命令的请求缓存已经开启,并且当前请求的结果已经存在于缓存中,那么会立即返回一个包含缓存响应的Observable对象。
④ 检查断路器是否被打开。 当命令的请求结果没有缓存的时候,Hystrix会检查断路器是否被打开。如果断路器已被打开,那么Hystrix命令就不会执行,而是跳转到图13-6中的第8步获取fallback方法并执行fallback逻辑进行服务降级;如果断路器没有被打开,将跳转到图13-6中的第5步,检查是否有可用资源来执行命令。
⑤ 检查线程池、信号量、队列是否已满。 如果检查到与当前命令相关的线程池、信号量或队列已经满了,那么Hystrix命令就不会执行,而是跳转到图13-6中的第8步获取fallback方法并执行fallback逻辑进行服务降级。
⑥ 检查执行construct()或者run()方法。
Hystrix通过我们写方法的逻辑来决定请求依赖服务的时候使用哪个类的方法,如果我们请求返回的是单一结果,就执行run()方法,如果出错则抛出异常;如果我们请求返回的是多个结果,就执行construct()方法,并将返回的结果存放到Observable对象中或者调用onError()方法发送错误通知。
如果run()或者construct()方法的执行时间大于命令所设置的超时时间,那么该线程将会抛出TimeoutException异常,这种情况下,Hystrix将会跳转到图13-6中的第8步,进行fallback服务降级处理。
同时,如果run()或者construct()方法没有被取消或者中断,则会忽略run()或者construct()方法的返回结果。
如果命令没有抛出异常并返回了结果,那么Hystrix在返回结果后会执行一些日志和指标的上报。
如果调用run()方法,那么Hystrix会返回一个Observable对象,该Observable对象会发射单个结果并且会调用onCompleted方法来通知请求结束;如果调用construct()方法,那么Hystrix会将请求响应的结果放到Observable对象中并返回。
⑦ 计算断路器的健康指标。
Hystrix会报告“成功”“失败”“拒绝”“超时”等信息给断路器,断路器包含一系列的滑动窗口数据,并通过该数据进行统计。
Hystrix会根据这些统计的数据进行分析来决定是否需要进行熔断,如果需要熔断,那么在一段时间内将不再进行请求;如果熔断时间段已过但是根据统计数据发现还是未达到健康指标,那么再次进行熔断处理。
⑧ 进行fallback服务降级处理。 如果命令最终执行失败,Hystrix就会尝试执行自定义的fallback服务降级逻辑处理。以下情况可以导致fallback服务降级处理。
第4步中,当断路器打开而命令执行处于熔断状态的时候。
第5步中,当执行命令的线程池、信号量或队列已满的时候。
第6步中,当执行run()或者construct()方法的时候抛出了异常。 当命令执行超时的时候。
在进行fallback服务降级处理的时候,需要我们自己写一个通用的返回结果,并且该返回结果只能是一些静态的或者从缓存中获取的结果。
如果我们自己没有实现fallback方法处理,那么当命令抛出异常时,Hystrix仍然会返回一个Observable对象,但是这个对象没有任何返回结果,并且Hystrix会立即终止并调用onError方法发送错误通知,通过onError方法发送的通知可以将造成该命令抛出异常的原因返回给服务调用者。
⑨ 返回成功的响应。 当Hystrix命令执行成功后,它将以Observable对象返回结果给服务调用者,根据在第2步的调用方式的不同,在返回Observable对象之前可能会做一些转换。
如图所示。我们来解释一下图中的几个命令处理。
execute():通过queue()方法来获取一个Future对象,然后调用get()方法来获取Future对象中包含的值。
queue():将toObservable()方法返回的Observable对象通过toBlocking()方法转换成BlockingObservable对象,并通过toFuture()方法返回对应的Future对象。
observe():在toObservable()方法产生原始的Observable对象后立即订阅它,然后让命令马上开始进行异步执行并返回一个新的Observable对象,当调用该对象的subscribe()方法时将重新产生结果并通过订阅模式通知订阅者。
toObservable():返回一个没有改变的Observable对象,必须订阅它,它才能够开始执行命令的逻辑。
标签:分析,返回,Hystrix,Observable,对象,命令,原理,方法 From: https://www.cnblogs.com/cnetsa/p/16982392.html