问题描述
我们注意到在使用 SpringBoot 和 WebClient(通过 Reactor Netty)时建立的连接数量非常多。我们希望连接被重用,但似乎并不是这样(连接和通道被关闭,新的一直被创建)。
尽管我们正在调查以检查某些网络层是否没有准确处理 keep-alive
内容,但我们仍希望确保我们对 WebClient 的使用是正确的。
它们是这样创建的(并且只创建一次):
final HttpClient httpClient =
HttpClient.create(ConnectionProvider.builder(connexionPoolName)
.maxConnections(maxConnections)
.maxIdleTime(maxIdleTime)
.maxLifeTime(maxLifeTime)
.pendingAcquireTimeout(pendingAcquireTimeout)
.metrics(enableMetrics)
.build())
.secure()
.keepAlive(soKeepAlive) // true
.tcpConfiguration(tcpClient -> tcpClient
.doOnConnected(connection -> connection
.addHandlerLast(
new ReadTimeoutHandler((int) this.readTimeout.toMillis(),TimeUnit.MILLISECONDS))
)
.doOnConnected(connection -> connection
.addHandlerLast(
new WriteTimeoutHandler((int) this.socketTimeout.toMillis(),TimeUnit.MILLISECONDS))
)
.option(ChannelOption.so_KEEPALIVE,this.soKeepAlive) // true
.option(ChannelOption.TCP_NODELAY,this.tcpNoDelay) // true
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS,(int) this.connectTimeout.toMillis())
);
return builder.clientConnector(new ReactorClientHttpConnector(httpClient))
.baseUrl(this.baseUrl)
.build();
注意:以前稍微轻一点,但我们尝试在客户端和渠道选项方面强制执行,而没有看到任何变化。
从网络客户端的使用来看,这没什么神奇的。大多数时候是这样的:
return webClient.get()
.uri("/my_uri/{}/{}",vars)
.retrieve()
.bodyToMono(MyClass.class);
我们希望在客户端创建中是否有明显的东西可以阻止它重用连接。
版本:JDK 8、spring boot 2.2.8.RELEASE、Reactor Netty 0.9.5.RELEASE。
(是的,它需要升级,我们正在处理中^^)。
谢谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)