Spring Boot 2.0.0.RELEASE中WebClient执行阻塞致应用挂起问题咨询
从Spring Boot 2.0.0.RC2到正式版,核心依赖的Reactor系列(尤其是Reactor Netty)有版本升级,这大概率是导致WebClient挂起的核心原因,下面是几个常见的问题点和排查思路:
Reactor Netty事件循环线程模型的变更
2.0.0.RELEASE对应的Reactor Netty版本调整了默认事件循环线程的配置逻辑。如果你的WebClient代码在事件循环线程中调用了阻塞操作(比如Thread.sleep()、同步IO、JDBC调用等),会直接占满事件循环线程池,导致后续请求无法被处理,最终引发应用挂起。RC2版本的线程模型对这类情况的容忍度更高,或者默认线程数配置不同,所以没有触发问题。WebClient连接池默认参数的调整
正式版优化了WebClient连接池的默认参数(比如最大连接数、空闲超时、等待队列大小等)。如果你的业务请求量较大,或者目标服务响应缓慢,可能会出现连接池耗尽、新请求无法获取连接而挂起的情况。可以尝试显式配置连接池参数来验证:HttpClient httpClient = HttpClient.create() .poolResources(PoolResources.fixed("custom-webclient-pool", 50)); WebClient webClient = WebClient.builder() .clientConnector(new ReactorClientHttpConnector(httpClient)) .build();响应式流订阅规范的严格执行
正式版对响应式流规范的执行更严格。如果你的代码存在订阅不完整的情况(比如定义了Mono/Flux但未正确订阅,或者在事件循环线程中调用block()等阻塞方法),RC2版本可能没有触发挂起,但正式版会因为线程阻塞或订阅链中断导致请求卡住。要确保所有响应式流都被正确订阅,避免在非阻塞线程中使用阻塞式调用。SSL/TLS配置的兼容性问题
正式版升级了Netty的SSL依赖版本,可能导致之前的自定义SSL配置(比如自定义信任证书、指定协议版本)出现兼容性问题,请求卡在SSL握手阶段。可以临时禁用SSL验证(仅用于测试排查)来确认:HttpClient httpClient = HttpClient.create() .secure(sslSpec -> sslSpec.sslContext(SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE))); WebClient webClient = WebClient.builder() .clientConnector(new ReactorClientHttpConnector(httpClient)) .build();
另外,建议开启Reactor和Netty的调试日志,通过日志跟踪请求的生命周期(连接建立、请求发送、响应接收等阶段),快速定位挂起的具体环节:
logging.level.reactor.netty=DEBUG logging.level.io.netty=DEBUG
内容的提问来源于stack exchange,提问作者Pavlo Kostohrys

