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, 其可以发送多条数据。





