You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:15:07