Hystrix底层执行时流程
这是我参与更文挑战的第7天,活动详情查看: 更文挑战
Hystrix执行时经过8个步骤如下:
- 创建Command
一个HystrixCommand或HystrixObservableCommand对象,代表了对某个依赖服务发起的一次请求或者调用,创建时在构造函数中传入任何需要的参数
- HystrixCommand主要用于仅返回一个结果的调用
- HystrixObservableCommand主要用于会返回多个结果的调用
HystrixCommand hystrixCommand = new HystrixCommand(arg0,arg1);
HystrixObservableCommmand hystrixCommand = new HystrixObservableCommand(arg0,arg1);
复制代码
- 调用command执行方法
执行command,发起一次对依赖服务的调用
要执行command,可在4个方法选择其中之一:execute()、queue()、observe()、toObservable();
其中execute()和queue()方法仅仅对HystrixCommand适用
- execute():调用后直接block住,属于同步调用,直到依赖服务返回单条结果,或者抛出异常
- queue():返回一个Future,属于异常调用,通过Future获取单条结果
- observe():订阅一个Observable对象,Observable代表的是依赖服务返回的结果,获取代表结果的Observable对象的拷贝对象
- toObservable():返回一个Observable对象,订阅该对象,就会执行command并且获取返回结果
T value = HystrixCommand.execute();
Future<T> fValue=HystrixCommand.queue();
Observable<T> oValue = HystrixObservableCommand.observe();
Observable<T> toValue=HystirxObservableCommand.toObservable();
复制代码
查看Hystrix的execute()源码,发现execute()会调佣queue().get()方法
public R execute() {
try {
return this.queue().get();
} catch (Exception var2) {
throw Exceptions.sneakyThrow(this.decomposeException(var2));
}
}
复制代码
而在queue()方法中,调用this.toObservable().toBlocking().toFuture()
final Future<R> delegate = this.toObservable().toBlocking().toFuture();
复制代码
- 检查是否开启缓存
如果command开启了请求缓存Request Cache,而且调用结果在缓存中存在,那直接从缓存中返回结果。
- 检查是否开启了断路器
检查command对应的依赖服务是否开启了断路器。如果断路器被打开后,Hystrix不会执行这个command,而直接去执行fallback降级机制,返回降级结果。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END