Java虚拟机:SpringCloud的限流、降级和熔断——Hystrix( 二 )
本文插图
四、Hystrix处理流程
本文插图
(一)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才支持发射多个值对象 。
推荐阅读
- 『』一文详解以太坊虚拟机(EVM)的数据存储机制
- 『JavaScript』种草 ES2020 八大新功能
- [函数式]JavaScript面试问题:函数式编程
- @参加Java培训班能达到什么水平以及当前应该注重哪个技术的学习
- ##B站上被下载达5166万次的Python+Java编程视频教程,全套免费领取
- #虚拟机#七层网络到大二层网络的深层原因—数据中心的网络变革
- ##微软推出基于AMD霄龙+Radeon Instinct的Azure NVv4虚拟机
- 『CentOS』CentOS 8.1 Linux系统虚拟机封装-Linux系统运维实战系列二
- 『』你写的Java对象究竟占多少内存?
- 『文档』JAVA开发5类应该知道的网站,你都用过吗?