Appearance
电商产品详情接口并发编排提升性能
在现代软件开发中,很多时候我们需要在一个接口中调用多个服务来汇总结果,这种情况下使用并发编排可以显著提升接口性能。CompletableFuture 是 Java 中一个非常强大的工具,用于处理异步编程和并发流。通过它,我们可以在后台执行任务,并在任务完成后合并其结果。
项目背景
假设我们正在开发一个电子商务系统的产品详情接口,该接口需要从多个服务获取数据,例如:
- 产品基本信息服务
- 产品库存服务
- 产品定价服务
- 用户评论服务
每个服务都是独立的,如果串行调用会影响性能。因此,我们将使用CompletableFuture并发地调度这些服务提升响应性能。
项目结构
- Controller层负责接收请求和返回结果。
- Service层设定每个服务的调用逻辑。
- 使用
CompletableFuture进行并发编排。
核心代码实现
1. 产品详情实体类
java
public class ProductDetails {
private String basicInfo;
private Integer stock;
private Double price;
private List<String> reviews;
// Getters and setters
}2. Controller层
java
@RestController
@RequestMapping("/api/products")
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping("/{productId}/details")
public CompletableFuture<ResponseEntity<ProductDetails>> getProductDetails(@PathVariable Long productId) {
return productService.getProductDetails(productId)
.thenApply(ResponseEntity::ok);
}
}3. Service层
java
@Service
public class ProductService {
@Autowired
private BasicInfoService basicInfoService;
@Autowired
private StockService stockService;
@Autowired
private PricingService pricingService;
@Autowired
private ReviewsService reviewsService;
public CompletableFuture<ProductDetails> getProductDetails(Long productId) {
CompletableFuture<String> basicInfoFuture = CompletableFuture.supplyAsync(() -> basicInfoService.getBasicInfo(productId));
CompletableFuture<Integer> stockFuture = CompletableFuture.supplyAsync(() -> stockService.getStock(productId));
CompletableFuture<Double> priceFuture = CompletableFuture.supplyAsync(() -> pricingService.getPrice(productId));
CompletableFuture<List<String>> reviewsFuture = CompletableFuture.supplyAsync(() -> reviewsService.getReviews(productId));
return CompletableFuture.allOf(basicInfoFuture, stockFuture, priceFuture, reviewsFuture)
.thenApply(voided -> {
try {
ProductDetails details = new ProductDetails();
details.setBasicInfo(basicInfoFuture.get());
details.setStock(stockFuture.get());
details.setPrice(priceFuture.get());
details.setReviews(reviewsFuture.get());
return details;
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}
}4. 各个服务类(示例)
下面是其中一个示例服务类,其余服务类可以类似实现:
java
@Service
public class BasicInfoService {
public String getBasicInfo(Long productId) {
// 模拟调用远程服务或数据库查询以获取基本信息
return "Product basic information for productId: " + productId;
}
}代码说明
- 产品详情实体类:
ProductDetails类用来封装从不同服务获取的所有产品数据。
- Controller层:
ProductController提供了一个接口来获取产品详情。它调用ProductService#getProductDetails方法,该方法返回一个CompletableFuture对象,以异步的方式响应请求。
- Service层:
ProductService中的getProductDetails方法使用CompletableFuture.supplyAsync方法并发调用各个子服务。CompletableFuture.allOf方法用于等待所有的服务请求完成,然后从各个CompletableFuture中获取结果。thenApply是一个转换器方法,用于将异步操作的结果转换为最终的ProductDetails对象。
- 各个服务类:
- 每个服务类(如
BasicInfoService、StockService等)代表一个子任务。这些任务被CompletableFuture并发调用以提高性能。
- 每个服务类(如
项目亮点
- 提升性能:
CompletableFuture提供了一种简单的方式来并发多个异步任务,从而减少总的接口响应时间。
- 易于维护和扩展:
- 各个服务之间是解耦的,增加新服务只需扩展
CompletableFuture的组合逻辑,而无需重构现有代码。
- 各个服务之间是解耦的,增加新服务只需扩展
- 非阻塞的异步设计:
- 使用
CompletableFuture的非阻塞特性,并发调用远程服务或数据库查询,有效地利用系统资源。
- 使用
- 异常处理简便:
CompletableFuture可以通过exceptionally方法进行异常处理,确保系统的稳定性。
这个示例展示了如何利用CompletableFuture进行服务调用并发编排,从而使接口响应更快,提升系统整体性能。在实际应用中,可以根据需要进一步调整并发和处理策略。
更新: 2024-08-20 21:22:27
原文: https://www.yuque.com/tulingzhouyu/db22bv/cplcclxcob1sg07b