请求合并java_Hystrix:HystrixCollapser请求合并

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

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

## 代码

### 合并请求服务实现

@HystrixCollapser(batchMethod = "testAll", collapserProperties = {

@HystrixProperty(name = "timerDelayInMilliseconds", value = "3000")

})

public Future test(String param) {

return null;

}

@HystrixCommand

public List testAll(List params) {

logger.info("合并操作线程 --> {} --> params --> {}", Thread.currentThread().getName(), params);

return 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 demo1 = testService.test(RandomUtil.randomNumbers(5));

Future demo2 = testService.test(RandomUtil.randomNumbers(5));

System.out.println(demo1.get());

System.out.println(demo2.get());

context.close();

return null;

}

效果如下:

20171203124025_988.jpg

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

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

20171203124026_88.jpg

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

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

@HystrixCollapser scope属性

//所有线程的请求中的多次服务请求进行合并。

Scope.GLOBAL;

//默认,对一次请求的多次服务调用合并

Scope.REQUEST;

改造后代码:

@HystrixCollapser(batchMethod = "testAll", scope = Scope.GLOBAL, collapserProperties = {

@HystrixProperty(name = "timerDelayInMilliseconds", value = "3000")

})

public Future test(String param) {

return null;

}

改造后效果:

20171203124027_527.jpg

总结

这里单个请求的service 返回的 Future 包装的对象,如果使用原对象,则是同步请求,不会合并。

HystrixRequestContext 接口访问需要开启上下文对象,其实就是使用TheardLoacl 初始化一个上下文对象。

暂时还不支持 feign 整合

@HystrixCollapser Scope.REQUEST Scope.GLOBAL 合并作用域的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值