文章目录
在日常开发中,随着业务复杂度的增加,代码的性能优化变得越来越重要。今天,我想和大家分享一个真实的案例,通过将同步调用改为异步多线程来显著提升系统性能。我们将通过对比两段代码来逐个展示这种优化的效果。
原始代码与改进代码的逐点对比
1. 获取订单信息
在原始代码中,我们通过同步调用orderInfoFeignClient.getOrderInfo
方法获取订单信息,并且立即进行司机身份的校验。这种同步调用在等待外部服务响应时会阻塞线程,增加了整体的执行时间。
原始代码:
OrderInfo orderInfo = orderInfoFeignClient.getOrderInfo(orderFeeForm.getOrderId()).getData();
if (orderInfo.getDriverId() != orderFeeForm.getDriverId()) {
throw new GuiguException(ResultCodeEnum.ILLEGAL_REQUEST);
}
改进后的代码:
CompletableFuture<OrderInfo> orderInfoCompletableFuture = CompletableFuture.supplyAsync(() -> {
OrderInfo orderInfo = orderInfoFeignClient.getOrderInfo(orderFeeForm.getOrderId()).getData();
if (orderInfo.getDriverId() != orderFeeForm.getDriverId()) {
throw new GuiguException(ResultCodeEnum.ILLEGAL_REQUEST);
}
return orderInfo;
});
在改进后的代码中,我们使用了CompletableFuture.supplyAsync
进行异步调用,使获取订单信息的操作不再阻塞主线程。这可以显著减少等待时间,并允许其他任务并行执行。
2. 防止刷单逻辑
在原始代码中,我们在获取订单信息之后,再通过同步调用locationFeignClient.getOrderServiceLastLocation
来获取订单的最后位置。这种串行处理会导致整个流程被这两个同步调用的总耗时所拖慢。
原始代码:
OrderServiceLastLocationVo orderServiceLastLocationVo = locationFeignClient
.getOrderServiceLastLocation(orderFeeForm.getOrderId()).getData();
double distance = LocationUtil.getDistance(
orderInfo.getEndPointLatitude().doubleValue(),
orderInfo.getEndPointLongitude().doubleValue(),
orderServiceLastLocationVo.getLatitude().doubleValue(),
orderServiceLastLocationVo.getLongitude().doubleValue()
);
if (distance > SystemConstant.DRIVER_END_LOCATION_DISTION) {
throw new GuiguException(ResultCodeEnum.DRIVER_END_LOCATION_DISTION_ERROR);
}
改进后的代码:
CompletableFuture<OrderServiceLastLocationVo> orderServiceLastLocationVoCompletableFuture =
CompletableFuture.supplyAsync(() -> {
OrderServiceLastLocationVo orderServiceLastLocationVo =
locationFeignClient.getOrderServiceLastLocation(orderFeeForm.getOrderId()).getData();
return orderServiceLastLocationVo;
});
CompletableFuture.allOf(orderInfoCompletableFuture, orderServiceLastLocationVoCompletableFuture).join();
OrderInfo orderInfo = orderInfoCompletableFuture.get();
OrderServiceLastLocationVo orderServiceLastLocationVo = orderServiceLastLocationVoCompletableFuture.get();
double distance = LocationUtil.getDistance(
orderInfo.getEndPointLatitude().doubleValue(),
orderInfo.getEndPointLongitude().doubleValue(),
orderServiceLastLocationVo.getLatitude().doubleValue(),
orderServiceLastLocationVo.getLongitude().doubleValue()
);
if (distance > SystemConstant.DRIVER_END_LOCATION_DISTION) {
throw new GuiguException(ResultCodeEnum.DRIVER_END_LOCATION_DISTION_ERROR);
}
改进后的代码使用了CompletableFuture.allOf
并行处理获取订单信息和订单最后位置的操作,大大缩短了这两个操作的总耗时。同时,通过join()
方法等待这两个操作完成后再继续执行后续逻辑。
3. 计算订单实际里程
在原始代码中,订单的实际里程是通过同步调用locationFeignClient.calculateOrderRealDistance
来获取的,这同样是一个阻塞的操作。
原始代码:
BigDecimal realDistance = locationFeignClient.calculateOrderRealDistance(orderFeeForm.getOrderId()).getData();
改进后的代码:
CompletableFuture<BigDecimal> realDistanceCompletableFuture = CompletableFuture.supplyAsync(() -> {
BigDecimal realDistance = locationFeignClient.calculateOrderRealDistance(orderFeeForm.getOrderId()).getData();
return realDistance;
});
改进后的代码将这一操作变为异步,允许它与其他操作并行执行,从而减少整体的处理时间。
4. 计算实际费用
计算订单的实际费用需要结合之前的里程计算结果。在原始代码中,这是同步调用。
原始代码:
FeeRuleRequestForm feeRuleRequestForm = new FeeRuleRequestForm();
feeRuleRequestForm.setDistance(realDistance);
feeRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
// 计算司机到达代驾开始时间
Integer waitMinute = Math.abs(
(int) ((orderInfo.getArriveTime().getTime() - orderInfo.getAcceptTime().getTime()) / (1000 * 60))
);
feeRuleRequestForm.setWaitMinute(waitMinute);
FeeRuleResponseVo feeRuleResponseVo = feeRuleFeignClient.calculateOrderFee(feeRuleRequestForm).getData();
BigDecimal totalAmount = feeRuleResponseVo.getTotalAmount()
.add(orderFeeForm.getTollFee())
.add(orderFeeForm.getParkingFee())
.add(orderFeeForm.getOtherFee())
.add(orderInfo.getFavourFee());
feeRuleResponseVo.setTotalAmount(totalAmount);
改进后的代码:
CompletableFuture<FeeRuleResponseVo> feeRuleResponseVoCompletableFuture =
realDistanceCompletableFuture.thenApplyAsync((realDistance) -> {
FeeRuleRequestForm feeRuleRequestForm = new FeeRuleRequestForm();
feeRuleRequestForm.setDistance(realDistance);
feeRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
Integer waitMinute = Math.abs(
(int) ((orderInfo.getArriveTime().getTime() - orderInfo.getAcceptTime().getTime()) / (1000 * 60))
);
feeRuleRequestForm.setWaitMinute(waitMinute);
FeeRuleResponseVo feeRuleResponseVo = feeRuleFeignClient.calculateOrderFee(feeRuleRequestForm).getData();
BigDecimal totalAmount = feeRuleResponseVo.getTotalAmount()
.add(orderFeeForm.getTollFee())
.add(orderFeeForm.getParkingFee())
.add(orderFeeForm.getOtherFee())
.add(orderInfo.getFavourFee());
feeRuleResponseVo.setTotalAmount(totalAmount);
return feeRuleResponseVo;
});
通过将实际费用的计算过程作为一个异步任务,并利用前面的realDistance
异步计算结果,改进后的代码使整体流程更加高效。
5. 计算系统奖励
同样,系统奖励的计算在原始代码中是同步操作,需要等待订单数的查询结果。
原始代码:
String startTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 00:00:00";
String endTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 24:00:00";
Long orderNum = orderInfoFeignClient.getOrderNumByTime(startTime, endTime).getData();
RewardRuleRequestForm rewardRuleRequestForm = new RewardRuleRequestForm();
rewardRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
rewardRuleRequestForm.setOrderNum(orderNum);
RewardRuleResponseVo rewardRuleResponseVo = rewardRuleFeignClient.calculateOrderRewardFee(rewardRuleRequestForm).getData();
改进后的代码:
CompletableFuture<Long> orderNumCompletableFuture = CompletableFuture.supplyAsync(() -> {
String startTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 00:00:00";
String endTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 24:00:00";
Long orderNum = orderInfoFeignClient.getOrderNumByTime(startTime, endTime).getData();
return orderNum;
});
CompletableFuture<RewardRuleResponseVo> rewardRuleResponseVoCompletableFuture =
orderNumCompletableFuture.thenApplyAsync((orderNum) -> {
RewardRuleRequestForm rewardRuleRequestForm = new RewardRuleRequestForm();
rewardRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
rewardRuleRequestForm.setOrderNum(orderNum);
RewardRuleResponseVo rewardRuleResponseVo = rewardRuleFeignClient.calculateOrderRewardFee(rewardRuleRequestForm).getData();
return rewardRuleResponseVo;
});
通过异步处理订单数量的查询和奖励的计算,改进后的代码在保持业务逻辑完整性的前提下,减少了同步调用带来的延迟。
6. 计算分账信息
分账信息的计算依赖于前面计算的实际费用和订单数量。在原始代码中,所有操作都是串行的,等待时间较长。
原始代码:
ProfitsharingRuleRequestForm profitsharingRuleRequestForm = new ProfitsharingRuleRequestForm();
profitsharingRuleRequestForm.setOrderAmount(feeRuleResponseVo.getTotalAmount());
profitsharingRuleRequestForm.setOrderNum(orderNum);
ProfitsharingRuleResponseVo profitsharingRuleResponseVo = profitsharingRuleFeignClient.calculateOrderProfitsharingFee(profitsharingRuleRequestForm).getData();
改进后的代码:
CompletableFuture<ProfitsharingRuleResponseVo> profitsharingRuleResponseVoCompletableFuture =
feeRuleResponseVoCompletableFuture.thenCombineAsync(orderNumCompletableFuture, (feeRuleResponseVo, orderNum) -> {
ProfitsharingRuleRequestForm profitsharingRuleRequestForm = new ProfitsharingRuleRequestForm();
profitsharingRuleRequestForm.setOrderAmount(feeRuleResponseVo.getTotalAmount());
profitsharingRuleRequestForm.setOrderNum(orderNum);
ProfitsharingRuleResponseVo profitsharingRuleResponseVo = profitsharingRuleFeignClient.calculateOrderProfitsharingFee(profitsharingRuleRequestForm).getData();
return profitsharingRuleResponseVo;
});
通过将分账计算与之前的异步任务结合,改进后的代码进一步缩短了总的执行时间。
7. 更新订单和生成账单
最后,在所有数据准备完毕后,更新订单并生成账单的逻辑在改进后的代码中并未发生变化。这是因为该操作需要等待所有前置操作完成后才能执行。
原始代码:
UpdateOrderBillForm updateOrderBillForm = new UpdateOrderBillForm();
updateOrderBillForm.setOrderId(orderFeeForm.getOrderId());
updateOrderBillForm.setDriverId(orderFeeForm.getDriverId());
updateOrderBillForm.setTollFee(orderFeeForm.getTollFee());
updateOrderBillForm.setParkingFee(orderFeeForm.getParkingFee());
updateOrderBillForm.setOtherFee(orderFeeForm.getOtherFee());
updateOrderBillForm.setFavourFee(orderInfo.getFavourFee());
updateOrderBillForm.setRealDistance(realDistance);
BeanUtils.copyProperties(rewardRuleResponseVo, updateOrderBillForm);
BeanUtils.copyProperties(feeRuleResponseVo, updateOrderBillForm);
BeanUtils.copyProperties(profitsharingRuleResponseVo, updateOrderBillForm);
updateOrderBillForm.setProfitsharingRuleId(profitsharingRuleResponseVo.getProfitsharingRuleId());
orderInfoFeignClient.endDrive(updateOrderBillForm);
return true;
改进后的代码:
UpdateOrderBillForm updateOrderBillForm = new UpdateOrderBillForm();
updateOrderBillForm.setOrderId(orderFeeForm.getOrderId());
updateOrderBillForm.setDriverId(orderFeeForm.getDriverId());
updateOrderBillForm.setTollFee(orderFeeForm.getTollFee());
updateOrderBillForm.setParkingFee(orderFeeForm.getParkingFee());
updateOrderBillForm.setOtherFee(orderFeeForm.getOtherFee());
updateOrderBillForm.setFavourFee(orderInfo.getFavourFee());
updateOrderBillForm.setRealDistance(realDistance);
BeanUtils.copyProperties(rewardRuleResponseVo, updateOrderBillForm);
BeanUtils.copyProperties(feeRuleResponseVo, updateOrderBillForm);
BeanUtils.copyProperties(profitsharingRuleResponseVo, updateOrderBillForm);
updateOrderBillForm.setProfitsharingRuleId(profitsharingRuleResponseVo.getProfitsharingRuleId());
orderInfoFeignClient.endDrive(updateOrderBillForm);
return true;
在这一步,改进后的代码也在逻辑上保持了与原始代码的一致性,但由于前面的异步优化,这一步的执行将更为高效。
完整代码展示
原始代码:
@Override
public Boolean endDrive(OrderFeeForm orderFeeForm) {
// 1.根据订单id获取订单信息,判断当前订单是否是司机接单
OrderInfo orderInfo = orderInfoFeignClient.getOrderInfo(orderFeeForm.getOrderId()).getData();
if (orderInfo.getDriverId() != orderFeeForm.getDriverId()) {
throw new GuiguException(ResultCodeEnum.ILLEGAL_REQUEST);
}
// 防止刷单
OrderServiceLastLocationVo orderServiceLastLocationVo = locationFeignClient
.getOrderServiceLastLocation(orderFeeForm.getOrderId()).getData();
double distance = LocationUtil.getDistance(
orderInfo.getEndPointLatitude().doubleValue(),
orderInfo.getEndPointLongitude().doubleValue(),
orderServiceLastLocationVo.getLatitude().doubleValue(),
orderServiceLastLocationVo.getLongitude().doubleValue()
);
if (distance > SystemConstant.DRIVER_END_LOCATION_DISTION) {
throw new GuiguException(ResultCodeEnum.DRIVER_END_LOCATION_DISTION_ERROR);
}
// 2.计算订单实际里程
BigDecimal realDistance = locationFeignClient.calculateOrderRealDistance(orderFeeForm.getOrderId()).getData();
// 3.计算实际费用
FeeRuleRequestForm feeRuleRequestForm = new FeeRuleRequestForm();
feeRuleRequestForm.setDistance(realDistance);
feeRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
// 计算司机到达代驾开始时间
Integer waitMinute = Math.abs(
(int) ((orderInfo.getArriveTime().getTime() - orderInfo.getAcceptTime().getTime()) / (1000 * 60))
);
feeRuleRequestForm.setWaitMinute(waitMinute);
FeeRuleResponseVo feeRuleResponseVo = feeRuleFeignClient.calculateOrderFee(feeRuleRequestForm).getData();
// 实际费用
BigDecimal totalAmount = feeRuleResponseVo.getTotalAmount()
.add(orderFeeForm.getTollFee())
.add(orderFeeForm.getParkingFee())
.add(orderFeeForm.getOtherFee())
.add(orderInfo.getFavourFee());
feeRuleResponseVo.setTotalAmount(totalAmount);
// 4.计算系统奖励
String startTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 00:00:00";
String endTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 24:00:00";
Long orderNum = orderInfoFeignClient.getOrderNumByTime(startTime, endTime).getData();
// 4.2 封装参数
RewardRuleRequestForm rewardRuleRequestForm = new RewardRuleRequestForm();
rewardRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
rewardRuleRequestForm.setOrderNum(orderNum);
RewardRuleResponseVo rewardRuleResponseVo = rewardRuleFeignClient
.calculateOrderRewardFee(rewardRuleRequestForm).getData();
// 5.计算分账信息
ProfitsharingRuleRequestForm profitsharingRuleRequestForm = new ProfitsharingRuleRequestForm();
profitsharingRuleRequestForm.setOrderAmount(feeRuleResponseVo.getTotalAmount());
profitsharingRuleRequestForm.setOrderNum(orderNum);
ProfitsharingRuleResponseVo profitsharingRuleResponseVo = profitsharingRuleFeignClient
.calculateOrderProfitsharingFee(profitsharingRuleRequestForm).getData();
// 6.封装实体类,结束代驾更新订单,添加账单和分账信息
UpdateOrderBillForm updateOrderBillForm = new UpdateOrderBillForm();
updateOrderBillForm.setOrderId(orderFeeForm.getOrderId());
updateOrderBillForm.setDriverId(orderFeeForm.getDriverId());
updateOrderBillForm.setTollFee(orderFeeForm.getTollFee());
updateOrderBillForm.setParkingFee(orderFeeForm.getParkingFee());
updateOrderBillForm.setOtherFee(orderFeeForm.getOtherFee());
updateOrderBillForm.setFavourFee(orderInfo.getFavourFee());
updateOrderBillForm.setRealDistance(realDistance);
// 订单奖励信息
BeanUtils.copyProperties(rewardRuleResponseVo, updateOrderBillForm);
// 代驾费用信息
BeanUtils.copyProperties(feeRuleResponseVo, updateOrderBillForm);
// 分账相关信息
BeanUtils.copyProperties(profitsharingRuleResponseVo, updateOrderBillForm);
updateOrderBillForm.setProfitsharingRuleId(profitsharingRuleResponseVo.getProfitsharingRuleId());
orderInfoFeignClient.endDrive(updateOrderBillForm);
return true;
}
改进后的代码:
// 使用多线程CompletableFuture优化
@SneakyThrows
public Boolean endDriveThread(OrderFeeForm orderFeeForm) {
// 1.根据订单id获取订单信息,判断当前订单是否是司机接单
CompletableFuture<OrderInfo> orderInfoCompletableFuture = CompletableFuture.supplyAsync(() -> {
OrderInfo orderInfo = orderInfoFeignClient.getOrderInfo(orderFeeForm.getOrderId()).getData();
if (orderInfo.getDriverId() != orderFeeForm.getDriverId()) {
throw new GuiguException(ResultCodeEnum.ILLEGAL_REQUEST);
}
return orderInfo;
});
// 防止刷单
CompletableFuture<OrderServiceLastLocationVo> orderServiceLastLocationVoCompletableFuture =
CompletableFuture.supplyAsync(
() -> {
OrderServiceLastLocationVo orderServiceLastLocationVo =
locationFeignClient.getOrderServiceLastLocation(
orderFeeForm.getOrderId()).getData();
return orderServiceLastLocationVo;
});
// 上面两个合并
CompletableFuture.allOf(orderInfoCompletableFuture, orderServiceLastLocationVoCompletableFuture).join();
// 获取两个线程执行结果
OrderInfo orderInfo = orderInfoCompletableFuture.get();
OrderServiceLastLocationVo orderServiceLastLocationVo = orderServiceLastLocationVoCompletableFuture.get();
// 司机当前位置,距离,结束代驾位置
double distance = LocationUtil.getDistance(orderInfo.getEndPointLatitude().doubleValue(),
orderInfo.getEndPointLongitude().doubleValue(),
orderServiceLastLocationVo.getLatitude().doubleValue(),
orderServiceLastLocationVo.getLongitude().doubleValue());
if (distance > SystemConstant.DRIVER_END_LOCATION_DISTION) {
throw new GuiguException(ResultCodeEnum.DRIVER_END_LOCATION_DISTION_ERROR);
}
// 2.计算订单实际里程
CompletableFuture<BigDecimal> realDistanceCompletableFuture = CompletableFuture.supplyAsync(() -> {
BigDecimal realDistance = locationFeignClient.calculateOrderRealDistance(orderFeeForm.getOrderId())
.getData();
return realDistance;
});
// 3.计算代实际费用
CompletableFuture<FeeRuleResponseVo> feeRuleResponseVoCompletableFuture =
realDistanceCompletableFuture.thenApplyAsync(
(realDistance) -> {
// 实际费用=代驾费用+其他费用
// 封装对象
FeeRuleRequestForm feeRuleRequestForm = new FeeRuleRequestForm();
feeRuleRequestForm.setDistance(realDistance);
feeRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
// 计算司机到达代驾开始时间
Integer waitMinute = Math.abs(
(int) ((orderInfo.getArriveTime().getTime() - orderInfo.getAcceptTime()
.getTime()) / (1000 * 60)));
feeRuleRequestForm.setWaitMinute(waitMinute);
FeeRuleResponseVo feeRuleResponseVo = feeRuleFeignClient.calculateOrderFee(
feeRuleRequestForm)
.getData();
// 实际费用
BigDecimal totalAmount = feeRuleResponseVo.getTotalAmount().add(orderFeeForm.getTollFee())
.add(orderFeeForm.getParkingFee())
.add(orderFeeForm.getOtherFee())
.add(orderInfo.getFavourFee());
feeRuleResponseVo.setTotalAmount(totalAmount);
return feeRuleResponseVo;
});
// 4.计算系统奖励
CompletableFuture<Long> orderNumCompletableFuture = CompletableFuture.supplyAsync(() -> {
String startTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 00:00:00";
String endTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 24:00:00";
Long orderNum = orderInfoFeignClient.getOrderNumByTime(startTime, endTime).getData();
return orderNum;
});
CompletableFuture<RewardRuleResponseVo> rewardRuleResponseVoCompletableFuture =
orderNumCompletableFuture.thenApplyAsync(
(orderNum) -> {
// 4.2.封装参数
RewardRuleRequestForm rewardRuleRequestForm = new RewardRuleRequestForm();
rewardRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
rewardRuleRequestForm.setOrderNum(orderNum);
RewardRuleResponseVo rewardRuleResponseVo = rewardRuleFeignClient.calculateOrderRewardFee(
rewardRuleRequestForm).getData();
return rewardRuleResponseVo;
});
// 5.计算分账信息
CompletableFuture<ProfitsharingRuleResponseVo> profitsharingRuleResponseVoCompletableFuture =
feeRuleResponseVoCompletableFuture.thenCombineAsync(
orderNumCompletableFuture, (feeRuleResponseVo, orderNum) -> {
ProfitsharingRuleRequestForm profitsharingRuleRequestForm =
new ProfitsharingRuleRequestForm();
profitsharingRuleRequestForm.setOrderAmount(feeRuleResponseVo.getTotalAmount());
profitsharingRuleRequestForm.setOrderNum(orderNum);
ProfitsharingRuleResponseVo profitsharingRuleResponseVo =
profitsharingRuleFeignClient.calculateOrderProfitsharingFee(
profitsharingRuleRequestForm).getData();
return profitsharingRuleResponseVo;
});
// 合并
CompletableFuture.allOf(orderInfoCompletableFuture, realDistanceCompletableFuture,
feeRuleResponseVoCompletableFuture, orderNumCompletableFuture,
rewardRuleResponseVoCompletableFuture, profitsharingRuleResponseVoCompletableFuture)
.join();
// 获取执行结果
BigDecimal realDistance = realDistanceCompletableFuture.get();
FeeRuleResponseVo feeRuleResponseVo = feeRuleResponseVoCompletableFuture.get();
RewardRuleResponseVo rewardRuleResponseVo = rewardRuleResponseVoCompletableFuture.get();
ProfitsharingRuleResponseVo profitsharingRuleResponseVo = profitsharingRuleResponseVoCompletableFuture.get();
// 6.封装实体类,结束代驾更新订单,添加账单和分账信息
UpdateOrderBillForm updateOrderBillForm = new UpdateOrderBillForm();
updateOrderBillForm.setOrderId(orderFeeForm.getOrderId());
updateOrderBillForm.setDriverId(orderFeeForm.getDriverId());
// 路桥费、停车费、其他费用
updateOrderBillForm.setTollFee(orderFeeForm.getTollFee());
updateOrderBillForm.setParkingFee(orderFeeForm.getParkingFee());
updateOrderBillForm.setOtherFee(orderFeeForm.getOtherFee());
// 乘客好处费
updateOrderBillForm.setFavourFee(orderInfo.getFavourFee());
// 实际里程
updateOrderBillForm.setRealDistance(realDistance);
// 订单奖励信息
BeanUtils.copyProperties(rewardRuleResponseVo, updateOrderBillForm);
// 代驾费用信息
BeanUtils.copyProperties(feeRuleResponseVo, updateOrderBillForm);
// 分账相关信息
BeanUtils.copyProperties(profitsharingRuleResponseVo, updateOrderBillForm);
updateOrderBillForm.setProfitsharingRuleId(profitsharingRuleResponseVo.getProfitsharingRuleId());
orderInfoFeignClient.endDrive(updateOrderBillForm);
return true;
}
总结
通过对比可以发现,改进后的代码在处理外部服务调用时,通过CompletableFuture
实现了异步并行执行,极大地提高了代码的执行效率。这种优化方式不仅减少了整体的等待时间,还能够更好地利用系统资源。
主要的改进点包括:
- 多线程并行处理:利用
CompletableFuture
实现异步调用,大幅减少顺序执行带来的延迟。 - 代码结构优化:通过异步编程,代码逻辑更加清晰,易于维护和扩展。
- 异常处理:在异步任务中也能够有效处理可能出现的异常,保证系统的稳定性。
总的来说,随着业务规模的扩展,性能优化是不可忽视的一个重要环节。而多线程与异步编程正是优化系统性能的一把利器,合理的使用能够显著提升系统的响应速度和用户体验。希望这篇博客对你在实际开发中的性能优化有所启发。