为什么80%的码农都做不了架构师?>>>
偶尔在spring4all,看到DiDi关于hystrix请求合并的一篇文章 Spring Cloud Hystrix的请求合并,查阅资料又整理了一下。
具体业务概念,什么是请求合并?请求合并优缺点?可以参考DiDi的文章,然后我把我使用过程中的问题及解决方法写出来
代码
合并请求服务实现
复制代码
1
2
3
4
5
6
7
8
9
10
11
12@HystrixCollapser(batchMethod = "testAll", collapserProperties = { @HystrixProperty(name = "timerDelayInMilliseconds", value = "3000") }) public Future<Demo> test(String param) { return null; } @HystrixCommand public List<Demo> testAll(List<String> params) { logger.info("合并操作线程 --> {} --> params --> {}", Thread.currentThread().getName(), params); return restTemplate.getForObject("http://DEMO-SERVICE/demo?params={1}", List.class, StringUtils.join(params, ","));; }
对外请求接口定义:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13@RequestMapping("/test") public SysDict test() throws ExecutionException, InterruptedException { //开启上下文TheardLocal HystrixRequestContext context = HystrixRequestContext.initializeContext(); Future<Demo> demo1 = testService.test(RandomUtil.randomNumbers(5)); Future<Demo> demo2 = testService.test(RandomUtil.randomNumbers(5)); System.out.println(demo1.get()); System.out.println(demo2.get()); context.close(); return null; }
效果如下:
- 如图两次调用Service.test()被合并成一次服务调用。
如果我请求两次接口也就是会调用四次Service.test(),那么会合并成几次服务调用呢?
- 如图,两次请求还是被合并成了两次服务调用。
怎么实现两次请求,合并成一次服务调用?
复制代码
1
2
3
4
5
6@HystrixCollapser scope属性 //所有线程的请求中的多次服务请求进行合并。 Scope.GLOBAL; //默认,对一次请求的多次服务调用合并 Scope.REQUEST;
改造后代码:
复制代码
1
2
3
4
5
6
7@HystrixCollapser(batchMethod = "testAll", scope = Scope.GLOBAL, collapserProperties = { @HystrixProperty(name = "timerDelayInMilliseconds", value = "3000") }) public Future<Demo> test(String param) { return null; }
改造后效果:
总结
- 这里单个请求的service 返回的 Future 包装的对象,如果使用原对象,则是同步请求,不会合并。
- HystrixRequestContext 接口访问需要开启上下文对象,其实就是使用TheardLoacl 初始化一个上下文对象。
- 暂时还不支持 feign 整合
- @HystrixCollapser Scope.REQUEST Scope.GLOBAL 合并作用域的区别
- 源码可以参考:https://gitee.com/log4j/pig
转载于:https://my.oschina.net/giegie/blog/1582474
最后
以上就是称心花卷最近收集整理的关于Hystrix:HystrixCollapser请求合并的全部内容,更多相关Hystrix内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复