Hystrix使用
Hystrix的使用方式有两种:原生和注解
首先引入依赖Change Log:
1 | <dependency> |
Hystrix提供了非常便捷的封装 – 两个可继承的抽象类HystrixCommand
/HystrixObservableCommand
。只需继承它们,实现run()
/construct()
方法,在方法中实现对需要隔离的外部依赖和逻辑,即可享受Hystrix带来的诸多好处。HystrixCommand
有四种方法供不同场景需求:execute()
/queue()
/observe()
/toObservable()
,HystrixObservableCommand
提供observe()
/toObservable()
- 四种方法的功能:
- execute():以同步堵塞方式执行
run()
- queue():以异步非堵塞方式执行
run()
- observe():事件注册前执行
run()
/construct()
。HystrixCommand
会创建新线程非阻塞执行run()
,HystrixObservableCommand
则会在调用程序里执行construct()
。 - toObservable():事件注册后执行
run()
/construct()
。调用toObservable()
会直接返回一个就直接返回一个Observable<R>
对象,而不去执行。当执行subscribe时,才会去执行逻辑run()
方法中的逻辑或者HystrixObservableCommand
中constrcut()
返回的Observable中的逻辑。与上面一样,HystrixCommand
创建一个线程来执行逻辑,而HystrixObservableCommand
会直接使用调用线程执行。
- execute():以同步堵塞方式执行
首先,来简单看一看 Hystrix官方Wiki给出的例子(movie-ocs中的 xxx)
1 | public class CommandHelloWorld extends HystrixCommand<String> { |
刚说了还有一种继承 HystrixObservableCommand
,相对于HystrixCommand
它只提供了observe()
和toObservable()
方法。那么它存在的意义是啥?
来看看它们的差别:
表面的差别:除了名字不一样,前者的业务逻辑写在
run()
里,并直接返回结果;后者的命令逻辑写在construct()
返回Observable<R>
;前者默认是线程隔离,后者是信号量隔离,换种说法:前者在新的线程中执行,后者是调用线程中执行。
前者一个实例只能向调用程序发送单条结果数据;后者一个
Observable
, 其可以发送多条数据。