微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与 SpringBoot WebClient 建立的连接过多

如何解决与 SpringBoot WebClient 建立的连接过多

我们注意到在使用 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 举报,一经查实,本站将立刻删除。