首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hystrix:HystrixCollapser请求合并

Hystrix:HystrixCollapser请求合并

作者头像
冷冷
发布2018-02-08 14:32:30
1.2K0
发布2018-02-08 14:32:30
举报
文章被收录于专栏:冷冷冷冷

偶尔在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
image
  • 如图两次调用Service.test()被合并成一次服务调用。
如果我请求两次接口也就是会调用四次Service.test(),那么会合并成几次服务调用呢?
image
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
image

总结

  1. 这里单个请求的service 返回的 Future 包装的对象,如果使用原对象,则是同步请求,不会合并。
  2. HystrixRequestContext 接口访问需要开启上下文对象,其实就是使用TheardLoacl 初始化一个上下文对象。
  3. 暂时还不支持 feign 整合
  4. @HystrixCollapser Scope.REQUEST Scope.GLOBAL 合并作用域的区别
  5. 源码可以参考:https://gitee.com/log4j/pig
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码
    • 合并请求服务实现
      • 对外请求接口定义:
        • 效果如下:
          • 如果我请求两次接口也就是会调用四次Service.test(),那么会合并成几次服务调用呢?
          • 怎么实现两次请求,合并成一次服务调用?
        • 改造后代码:
          • 改造后效果:
          • 总结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档