You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WebClient调用降级至Java 8的SpringBoot API时阻塞超时,但RestTemplate可正常调用的问题排查求助

WebClient调用降级至Java 8的SpringBoot API时阻塞超时,但RestTemplate可正常调用的问题排查求助

大家好,我遇到一个奇怪的问题,想请各位帮忙排查一下:

问题背景

原本我们有一套基于Java 21 + SpringBoot的API服务,运行正常且Java 21的消费者调用无问题。后来因为消费者限制必须用Java 8,我们把API降级到了Java 8 + SpringBoot 2.3.12版本。现在消费者用WebClient调用该API时,执行block()方法会一直挂起,添加超时配置后触发了TimeoutException,但用RestTemplate调用同一个接口却能正常拿到响应,API端的Controller和Repository日志也显示请求已正常处理完成并返回。

环境与依赖配置

  • 消费者与API服务的Java版本:8
  • API服务SpringBoot版本:2.3.12
  • 消费者端Spring WebFlux依赖:
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webflux</artifactId>
    <version>5.3.39</version>
</dependency>
  • WebClient初始化代码:
WebClient.builder().baseUrl("http://172.22.35.203:8081").build();

完整WebClient调用代码

我添加了超时和错误监听后的调用代码如下:

webClient .get()
    .uri(uri)
    .headers(httpHeaders -> setHeaders(httpHeaders, headers))
    .retrieve()
    .onStatus( status -> !status.is2xxSuccessful(), clientResponse -> clientResponse
        .bodyToMono(ErrorResponse.class)
        .flatMap( response -> Mono.error(
            new CustomServiceException(
                clientResponse.statusCode(), response))))
    .bodyToMono(responseType)
    .timeout(Duration.ofMillis(30000))
    .doOnError(error -> System.out.println("Error signal detected: " + error))
    .block();

触发的错误信息

超时后抛出的异常如下:

Exception thrown from webclient: java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 30000ms in 'flatMap' (and no fallback has been configured)
reactor.core.Exceptions$ReactiveException: java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 30000ms in 'flatMap' (and no fallback has been configured)

已完成的排查动作

  1. 用Postman调用该API接口,能快速拿到正常响应
  2. 用RestTemplate调用相同接口,可正常获取响应,代码示例:
restTemplate.getForEntity("http://172.22.35.203:8081/v1/customer/search?firstName=MVYHFPQDNH&lastName=BSGWUDKCOUVE&alwaysWildcardAccountNumber=false", String.class).getBody()
  1. 检查API服务端日志,Controller和Repository层均无异常,确认请求已处理完成并返回响应
  2. 原API在Java 21环境时,用相同的WebClient调用逻辑完全正常

求助问题

想请教各位:

  • 可能导致Java 8环境下WebClient调用block()超时,但RestTemplate正常的原因有哪些?
  • 有哪些有效的调试手段可以进一步定位具体的阻塞点?

内容来源于stack exchange

火山引擎 最新活动