CompletableFuture的API很丰富,本案例以提交订单为例:
在微服务架构下,划分为很多的模块
- 订单模块
- 购物车模块
- 商品模块
1、spu模块
2、sku模块 - 积分模块
- 优惠券模块
- 用户模块
- 附件模块
- 消息模块等等
在下订单时如何提高这些模块间的执行效率?
该串行话为并行,CompletableFuture 很好解决了我们的问题,下面我以伪代码的方式进行讲述
传统模式下:
@RestController
@RefreshScope
public class OrderControler {
@Autowired
private SkuService skuService;
@Autowired
private SpuService spuService;
@Autowired
private PointService pointService;
@Autowired
private UserInfoService userService;
@Autowired
private MessageService messageService;
@RequestMapping("/sync/order/sava")
public String savaOrder(){
System.out.println("创建订单开始");
long start = System.currentTimeMillis();
skuService.querySkuInfo();
userService.queryUserInfo();
spuService.querySpuInfo();
pointService.queryPointInfo();
messageService.queryMsgInfo();
long end = System.currentTimeMillis();
System.out.println("创建订单结束,共花费:"+(end-start));
return "下单花费时间为:"+(end-start);
}
}
使用CompletableFuture之后:
@RestController
@RefreshScope
public class OrderControler {
@Autowired
private SkuService skuService;
@Autowired
private SpuService spuService;
@Autowired
private PointService pointService;
@Autowired
private UserInfoService userService;
@Autowired
private MessageService messageService;
@RequestMapping("/async/order/sava")
public String savaOrderAsnc(){
System.out.println("异步创建订单开始");
long start = System.currentTimeMillis();
CompletableFuture<Void> skuServiceFuture = CompletableFuture.runAsync(() -> {
skuService.querySkuInfo();
});
CompletableFuture<Void> userServiceFuture = CompletableFuture.runAsync(() -> {
userService.queryUserInfo();
});
CompletableFuture<Void> spuServiceFuture = CompletableFuture.runAsync(() -> {
spuService.querySpuInfo();
});
CompletableFuture<Void> pointServiceFuture = CompletableFuture.runAsync(() -> {
pointService.queryPointInfo();
});
CompletableFuture<Void> messageServiceFuture = CompletableFuture.runAsync(() -> {
messageService.queryMsgInfo();
});
CompletableFuture.allOf(
skuServiceFuture,
userServiceFuture,
spuServiceFuture,
pointServiceFuture,
messageServiceFuture).join();
long end = System.currentTimeMillis();
System.out.println("异步创建订单结束,共花费:"+(end-start));
return "下单花费时间为:"+(end-start);
}
}
可见性能提升很明显,也进一步说明了木桶短板原理,提升性能就是解决短板问题。