构建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.BlockingObservableBlockingObservable.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