基础环境
- SpringBoot:2.3.4.RELEASE
- 使用基于WebFlux的相关组件
- Java11
问题简述
在使用WebClient调用一个http地址时,总会抛出如下异常
[reactor-http-nio-1] HttpClientConnect |-> [id: 0x10fd540b, L:0.0.0.0/0.0.0.0:58092] The connection observed an error reactor.netty.http.client.PrematureCloseException: Connection prematurely closed BEFORE response
基础代码
/**
* 关于WebClient使用代理时的配置方式。更多细节请查看:
* https://projectreactor.io/docs/netty/release/api/reactor/netty/http/client/HttpClient.html
*/
@Test
public void webClientProxyTest() {
//说明:WebClientUtils为内部封装的工具类。这里使用访问对方站点(因为必须要使用代理)
WebClient client = WebClientUtils.getWebClientBuilderWithSslTrustAndPolicy(Duration.ofSeconds(100), new ProxyDO("xxxxxxxxxx", 100000L), true)
.build();
//流测试
StepVerifier.create(
client.get()
.uri("http://xxx/xxx")
.exchange().flatMap(v -> v.bodyToMono(String.class)))
.expectNextMatches(v -> {
System.out.println(v);
return StringUtils.isNotEmpty(v);
}).expectComplete().verify();
}
结论
为了节省大家的时间,先贴出结论O(∩_∩)O哈哈~
可以具体参看Github中关于issue#1442的相关表述和Commits:
Fix connection prematurely closed error
相关Bug已经被修复,但到文章发布时,暂时没有新的版本发布出来。建议不着急的小伙伴可以等待reactor-netty组件2021年第一个版本发布后,单独引入并升级
排查手记
接下来是排查相关的部分。贡献一些排查思路,供有兴趣的小伙伴参考
自定义WebClientBuilder
最开始怀疑是由于默认属性与目标服务器之间存在匹配问题,故尝试自定义生成WebClient。其中自定义了包含TcpConfiguration等的细节内容,但最终结论是无效~(或者没有尝试出有效组合)
当然,也顺带为项目写了个Utils,用于快捷定义一些包含超时时间等的参数。这里贡献一下
WebClientUtils
package com.aaa.common.utils;
import com.aaa.model.ProxyDO

本文针对使用Spring Boot中的WebClient调用HTTP地址时出现的连接提前关闭异常进行了详细排查,并最终定位到reactor-netty组件的问题。作者通过自定义WebClientBuilder的方式尝试解决问题,并分享了一套工具类WebClientUtils。

3654

被折叠的 条评论
为什么被折叠?



