Spring Boot Project Reactor实现多无依赖API并行调用逐次返回方案
解决方法
核心思路是将多个独立的Mono实例合并为Flux,利用响应流按完成顺序发射元素的特性实现结果逐次返回,无需等待所有请求完成。
具体实现步骤
1. 基础合并实现
使用Flux.merge方法合并所有API调用对应的Mono,该方法会自动并行订阅所有传入的Mono,哪个接口先返回结果就先向下游发射该结果:
// 定义多个无依赖的API调用Mono Mono<Result> apiCall1 = webClient.get().uri("/api/service1").retrieve().bodyToMono(Result.class); Mono<Result> apiCall2 = webClient.get().uri("/api/service2").retrieve().bodyToMono(Result.class); Mono<Result> apiCall3 = webClient.get().uri("/api/service3").retrieve().bodyToMono(Result.class); // 合并为Flux,按完成顺序返回结果 Flux<Result> resultStream = Flux.merge(apiCall1, apiCall2, apiCall3);
2. 接口结果标识(可选)
如果需要区分返回结果来自哪个接口,可以在合并前对每个Mono做一层映射:
Flux<Map.Entry<String, Result>> resultStream = Flux.merge( apiCall1.map(res -> Map.entry("service1", res)), apiCall2.map(res -> Map.entry("service2", res)), apiCall3.map(res -> Map.entry("service3", res)) );
3. 对外暴露为流式接口
如果是Spring WebFlux项目,可直接将Flux作为接口返回值,通过SSE(服务器推送事件)将结果逐次返回给前端:
@GetMapping(value = "/batch-call", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<Result> batchApiCall() { Mono<Result> apiCall1 = // 接口1调用逻辑 Mono<Result> apiCall2 = // 接口2调用逻辑 Mono<Result> apiCall3 = // 接口3调用逻辑 return Flux.merge(apiCall1, apiCall2, apiCall3); }
注意事项
- 控制并发度:如果需要限制同时发起的请求数,可使用
Flux.merge(int parallelism, Publisher<? extends T>... publishers)重载方法传入最大并行数,避免下游服务压力过大。 - 错误兼容:如果不需要单个接口失败终止整个流式返回,可以给每个
Mono添加错误兜底逻辑:
Mono<Result> apiCall1 = webClient.get().uri("/api/service1") .retrieve() .bodyToMono(Result.class) .onErrorResume(e -> Mono.just(new Result(500, "service1调用失败")));
内容的提问来源于stack exchange,提问作者Arefin Islam
相关产品推荐
相关产品推荐

