【SpringCloud系列】 Hystrix底层执行时流程(1)

Hystrix底层执行时流程

这是我参与更文挑战的第7天,活动详情查看: 更文挑战

Hystrix执行时经过8个步骤如下:

  1. 创建Command

一个HystrixCommand或HystrixObservableCommand对象,代表了对某个依赖服务发起的一次请求或者调用,创建时在构造函数中传入任何需要的参数

  • HystrixCommand主要用于仅返回一个结果的调用
  • HystrixObservableCommand主要用于会返回多个结果的调用
HystrixCommand hystrixCommand = new HystrixCommand(arg0,arg1);
HystrixObservableCommmand hystrixCommand = new HystrixObservableCommand(arg0,arg1);
复制代码
  1. 调用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();
复制代码
  1. 检查是否开启缓存

如果command开启了请求缓存Request Cache,而且调用结果在缓存中存在,那直接从缓存中返回结果。

  1. 检查是否开启了断路器

检查command对应的依赖服务是否开启了断路器。如果断路器被打开后,Hystrix不会执行这个command,而直接去执行fallback降级机制,返回降级结果。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享