新闻资讯

新闻资讯 行业动态

SpringCloud的限流、降级和熔断——Hystrix处理流程

编辑:008     时间:2020-03-05

(一)Hystrix 整个工作流程如下:

1、构造一个 HystrixCommand或HystrixObservableCommand对象, 用于封装请求,并在构造方法配置请求被执行需要的参数;

2、执行命令, Hystrix 提供了4种执行命令的方法,后面详述;

3、判断是否使用缓存响应请求,若启用了缓存,且缓存可用,直接使用缓存响应请求。 Hystrix 支持请求缓存,但需要用户自定义启动;

4、判断熔断器是否打开,如果打开,调到第8步;

5、判断线程池、队列、信号量是否已满,已满则调到第8步;

6、执行 HystrixObservableCommand.construct()或HystrixCommand.run(), 如果执行失败或者超时,跳到第8步;否者,跳到第9步;

7、统计熔断器监控指标;

8、走Fallback降级方法;

9、返回请求响应。

从流程图上可知道,第5步线程池、队列、信号量已满时,还会执行第7步逻辑,更新熔断器统计信息,而第6步无论成功与否,都会更新熔断器统计信息。

(二)执行命令的几种方法:

Hystrix提供了4种执行命令的方法,execute()和queue()适用于 HystrixCommand 对象,而observer()和toObservable()适用于 HystrixObservableCommand对象。

1、execute()

以同步阻塞方法执行run(),只支持接收一个值对象。 Hystrix会从线程池中取一个线程来执行run(),并等待返回值。

2、queue()

以异步非阻塞方法执行run(),只支持接收一个值对象。调用queue()就直接返回一个Future对象。可通过Future.get()拿到run()的返回结果,但 Future.get() 是阻塞执行的。若执行成功, Future.get() 返回单个返回值。当执行失败时,如果没有重写fallback, Future.get() 抛出异常。

3、observe()

事件注册前执行run()/construct(),支持接收多个值对象,取决于发射源。调用observe()会返回一个hot Observable,也就是说,调用 observe()自动触发执行run()/construct(),无论是否存在订阅者。

如果继承的是HystrixCommand,hystrix会从线程池中取一个线程以非阻塞方式执行run();如果继承的是HystrixObservableCommand,将以调用线程阻塞执行construct()。

observe()使用方法:

(1)调用 observe()会返回一个Observable对象

(2)调用这个 Observable对象的subscribe()方法完成事件注册,从而获取结果

4、toObservable()

事件注册后执行run()/construct(),支持接收多个值对象,取决于发射源。调用 toObservable() 会返回一个cold  Observable,也就是说,调用 toObservable() 不会立即触发执行run()/construct(),必须有订阅者订阅 Observable 时才会执行。

如果继承的是 HystrixComman,hystrix会从线程池中取一个线程以非阻塞方式执行run(),调用线程不必等待run();如果继承的是 HystrixObservableCommand ,将以调用线程堵塞执行construct(),调用线程需等待construct()执行完才能继续往下走。

toObservable()使用方法:

(1)调用observe()会返回一个Observable对象

(2)调用这个 Observable对象的subscribe()方法完成事件注册,从而获取结果

需注意的是, HystrixCommand也支持 toObservable()和observe(), 但是即使将 HystrixCommand 转换成Observable,它也只能发射一个值对象。只有 HystrixObservableCommand才支持发射多个值对象。

(三)几种方法的关系

  • execute()实际是调用了queue().get()
  • queue()实际调用了toObservable().toBlocking().toFuture()
  • observe()实际调用toObservable()获得一个cold Observable,再创建一个ReplaySubject对象订阅Observable,将源Observable转化为hot Observable。因此调用observe()会自动触发执行run()/construct()。

  Hystrix 总是以Observable的形式作为相应返回,不同执行命令的方法只是进行了相应的转换。


原文链接:https://my.oschina.net/u/4006148/blog/3176044

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐