构建HystrixCommand或者HystrixObservableCommand对象
使用Hystrix的第一步是创建一个HystrixCommand
或者HystrixObservableCommand
对象来表示你需要发给依赖服务的请求。你可以向构造器传递任意参数。
若只期望服务每次返回单一的回应,按如下方式构造一个HystrixCommand
即可:
1 | HystrixCommand command = new HystrixCommand(arg1, arg2); |
若期望依赖服务返回一个Observable
,并应用Observable
模式监听依赖服务的回应,可按如下方式构造一个HystrixObservableCommand
:
1 | HystrixObservableCommand command = new HystrixObservableCommand(arg1, arg2); |
命令执行方式
Hystrix命令在抽象类HystrixCommand
中,有四种调用方式
toObservable
未做订阅,返回Observable
对象。只有在订阅该对象时,才会发出请求,然后再依赖服务响应时,通过注册的Subscriber
得到返回结果
observe
调用toObservable
方法的基础上,向Observable
注册rx.subjects.ReplaySubject
发起订阅。ReplaySubject
会发射所有来自原始Observable
的数据给观察者,无论它们是何时订阅的。
1 | public Observable<R> observe() { |
queue
调用toObservable()
方法的基础上,调用:
Observable.toBlocking
方法:将Observable
转换成阻塞的rx.observables.BlockingObservable
BlockingObservable.toFuture
方法:返回可获得run()
抽象方法执行结果的Future
。run()
方法由子类实现,执行正常的业务逻辑。
1 | toObservable().toBlocking().toFuture(); |
execute
在调用queue()
方法的基础上,调用Future.get()
方法,同步返回run()
执行结果
1 | public R execute() { |
toObservable
1 | public Observable<R> toObservable() { |
toObservable
通过defer
操作符声明一个Observable
。Observable
的执行流程如下:
- 调用
isRequestCachingEnabled()
方法判断请求结果缓存这个特性是否被启用。如果缓存特性被启用并且缓存命中,则缓存的回应会立即通过一个Observable
对象的形式返回。 - 创建执行命令的
Observable
:hystrixObservable
。 当缓存特性开启,并且缓存未命中时,创建订阅了执行命令的Observable:
HystrixCommandResponseFromCache
- 创建存储到缓存的
Observable
:toCache
。 将
toCache
添加到缓存中,返回获取缓存的Observable
:fromCache
- 如果添加失败,调用
toCache.unsubscribe()
方法,取消HystrixCachedObservable
的订阅 - 否则调用
toCache.toObservable()
方法,获得缓存Observable
- 如果添加失败,调用
当缓存特性未开启,使用执行命令
Observable
- 创建存储到缓存的
http://youdang.github.io/2016/02/05/translate-hystrix-wiki-how-it-works/
https://github.com/YunaiV/Blog/blob/master/Hystrix/2018_10_08_Hystrix%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%20%E2%80%94%E2%80%94%20%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4%E6%96%B9%E5%BC%8F.md