【Hystrix系列】二、RxJava的调用栈分析
来源:互联网 发布:淘宝游戏店铺转让 编辑:程序博客网 时间:2024/06/06 03:29
Netflix开源了Hystrix作为熔断限流的利器,在IT圈备受赞誉,也是Spring Cloud的标准组件。在Hystrix中使用的重点是Java的并发包concurrent和Rxjava。其中RxJava是响应式程序设计的一种实现,以观察者模式为蓝本。在响应式程序设计中,当数据到达的时候,消费者做出响应。响应式编程可以将事件传递给注册了的 observer。
在网上的绝大多数案例要么是对Hystrix的wiki的翻译(Netflix的文档写的确实经典,图文并茂),要么是简单的代码实现。如果你打开源代码,就会发现Hystrix中使用了大量的RxJava,想要正常的跟踪单步调试,完全找不到北。
下一步我们要看一下执行最简单的Hystrix的Command的堆栈情况和调用的时序图。创建一个最简单的HelloCommand,因为需要调试,因此我选择使用信号量隔离机制,同时设置一个超时时间,以便我能抓取一个调用栈的截屏。
package com.travel.hystrix;import com.netflix.hystrix.HystrixCommand;import com.netflix.hystrix.HystrixCommandGroupKey;import com.netflix.hystrix.HystrixCommandProperties;public class HelloCommand extends HystrixCommand<Boolean>{protected HelloCommand() {super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("HelloCommand")).andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE) //设置使用信号量隔离策略 .withExecutionTimeoutInMilliseconds(100000000) ));}@Overrideprotected Boolean run() throws Exception {Thread.sleep(1000);System.out.println("HelloCommand finished.");return true;}}
然后就是调用的JUnit代码
package com.travel.hystrix;import org.junit.Test;public class HelloCommandTest {@Testpublic void test(){System.out.println("HelloCommand test begin.");HelloCommand cmd = new HelloCommand();try{cmd.execute();}catch(Exception ex){ex.printStackTrace();}finally{System.out.println("HelloCommand test byebye.");}}}
然后就是调试代码,在run方法上设置一个断点。没有看错,我一共截了三屏。
为了更加形象地描述调用关系,咱们上个时序图。
总结一下,为啥Hystrix搞得调用层次这么深,因为它是框架要控制超时,另外需要处理异常响应。不过这么多深的层次,你需要慎重使用Hystrix,尤其是高并发、重负载的场景上。
阅读全文
0 0
- 【Hystrix系列】二、RxJava的调用栈分析
- Hystrix系列-4-Hystrix的动态配置
- RxJava系列二
- 【Hystrix权威指南四】Hystrix隔离策略源码分析二
- 【Hystrix系列】一、配置加载过程分析
- RxJava源码分析(二)
- Hystrix系列-3-Hystrix的配置-通过代码构造配置
- Hystrix系列-5-Hystrix的资源隔离策略
- RxJava系列之二:RxJava简介
- RxJava操作符系列二
- RxJava理解系列(二)
- rxjava系列(二)-- 强大的操作符
- Hystrix系列-2-HystrixObservableCommand的使用
- Hystrix系列之组件间的关系
- rxJava的使用--Observable的创建及源码分析(二)
- RxJava的源码分析
- RxJava入门系列二,操作符篇
- 【Android】Rxjava操作符系列(二)
- 安卓应用市场分类排名算法一般是怎样的?
- 周中训练笔记5
- Hibernate4配置log4j日志环境
- 设备描述表数进行以及保存设备描述表
- Java-零散总结(内部类、超类)
- 【Hystrix系列】二、RxJava的调用栈分析
- 【MBA】企业战略管理
- MySQL对数据表的基本操作语句
- poj3842之暴力
- hdu 2167 Pebbles[状压dp]
- HDU OJ 2013 蟠桃记
- 【数据结构 总论】---概述
- BP神经网络-感知器
- STM8单片机中断优先级问题