文档章节

Hystrix:HystrixCollapser请求合并

冷冷gg
 冷冷gg
发布于 2017/11/30 21:40
字数 524
阅读 988
收藏 0

偶尔在spring4all,看到DiDi关于hystrix请求合并的一篇文章 Spring Cloud Hystrix的请求合并,查阅资料又整理了一下。

具体业务概念,什么是请求合并?请求合并优缺点?可以参考DiDi的文章,然后我把我使用过程中的问题及解决方法写出来

代码

合并请求服务实现

 @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, ","));;
}

对外请求接口定义:


@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;
}

效果如下:

image

  • 如图两次调用Service.test()被合并成一次服务调用。

如果我请求两次接口也就是会调用四次Service.test(),那么会合并成几次服务调用呢?

image

  • 如图,两次请求还是被合并成了两次服务调用。

怎么实现两次请求,合并成一次服务调用?

@HystrixCollapser scope属性
//所有线程的请求中的多次服务请求进行合并。
Scope.GLOBAL;
//默认,对一次请求的多次服务调用合并
Scope.REQUEST; 

改造后代码:

 @HystrixCollapser(batchMethod = "testAll", scope = Scope.GLOBAL, collapserProperties = {
    @HystrixProperty(name = "timerDelayInMilliseconds", value = "3000")
})
public Future<Demo> test(String param) {
    return null;
}

改造后效果:

image

总结

  1. 这里单个请求的service 返回的 Future 包装的对象,如果使用原对象,则是同步请求,不会合并。
  2. HystrixRequestContext 接口访问需要开启上下文对象,其实就是使用TheardLoacl 初始化一个上下文对象。
  3. 暂时还不支持 feign 整合
  4. @HystrixCollapser Scope.REQUEST Scope.GLOBAL 合并作用域的区别
  5. 源码可以参考:https://gitee.com/log4j/pig

© 著作权归作者所有

冷冷gg

冷冷gg

粉丝 835
博文 158
码字总数 87640
作品 1
潍坊
UI设计师
私信 提问
加载中

评论(2)

冷冷gg
冷冷gg 博主

引用来自“如梦技术”的评论

跟冷冷大神涨姿势,第一段代码return return
😬 没看到。 没看到
如梦技术
如梦技术
跟冷冷大神涨姿势,第一段代码return return
Spring Cloud Hystrix的请求合并

通常微服务架构中的依赖通过远程调用实现,而远程调用中最常见的问题就是通信消耗与连接数占用。在高并发的情况之下,因通信次数的增加,总的通信时间消耗将会变的不那么理想。同时,因为对依...

翟永超
2017/11/28
0
0
SpringCloud实战4-Hystrix线程隔离&请求缓存&请求合并

接着上一篇的Hystrix进行进一步了解。 当系统用户不断增长时,每个微服务需要承受的并发压力也越来越大,在分布式环境中,通常压力来自对依赖服务的调用,因为亲戚依赖服务的资源需要通过通信...

狂小白
2018/05/16
0
0
Hystrix 配置信息

在Hystrix中我们一般是用的默认配置,有些时候需要调整一些参数来获取更好的处理性能 配置官方文档:https://github.com/Netflix/Hystrix/wiki/Configuration Execution相关的属性的配置: ...

尹吉欢
2017/12/17
0
0
熔断器 Hystrix 源码解析 —— 调试环境搭建

摘要: 原创出处 www.iocoder.cn/Hystrix/bui… 「芋道源码」欢迎转载,保留摘要,谢谢! 本文主要基于 Hystrix 1.5.X 版本 1. 依赖工具 2. 源码拉取 3. 运行示例 4. 彩蛋 🙂🙂🙂关注微...

芋道源码掘金Java群217878901
2017/11/11
0
0
聊聊HystrixMetricsPublisher

序 本文主要研究一下HystrixMetricsPublisher HystrixMetricsPublisher hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/strategy/metrics/HystrixMetricsPublisher.java getMetrics......

go4it
2018/07/01
149
0

没有更多内容

加载失败,请刷新页面

加载更多

郑州哪哪里可以开工程款发票-郑州_新闻网

【电薇同步;1.3.8 - 2.7.4.1 - 5.2.9.7.】张生、诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridge,是Android手机通用...

yyqqvip
44分钟前
30
0
Nginx 反向代理访问

在Nginx 配置 server { listen 80; server_name www.xiaocx.org www.xiaocx.org www.xiaocx.org; root /Users/maison/work/xiaocx/dist; index i......

韩庚庚
48分钟前
33
0
python笔记:环境变量已设置CMD中一直报错"python"不是内部命令,也不是可运行的程序或批处理文件

这些天虽然也写了几个小工具,但是打包都是在anaconda prompt中完成的,因为CMD中一直报错"python"不是内部命令,也不是可运行的程序或批处理文件,各种查度,千篇一律的是环境变量配置的问题...

小玲_001
50分钟前
13
0
AI+BI服务模式

术语与缩写解释 缩写、术语 解 释 BI 商业智能(Business Intelligence,简称:BI),又称商业智慧或商务智能,指用现代数据仓库技术、线上分析处理技术、数据挖掘和数据展现技术进行数据分析...

zoegu228
51分钟前
20
0
leetcode1227(面试题 17.09. 第 k 个数)--C语言实现

求: 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。 示例 1:...

拓拔北海
今天
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部