Spring WebClient无法创建连接

问题描述

我在Spring Boot项目中使用Spring Webclient调用远程API

我观察到Webclient的异常行为。每当远程API超时增加时,Webclient就会进入活动连接很少的状态(少于5,即使在配置中将maxConnections设置为3200),并且所有传入的连接都会添加到“待处理的队列”中,一会儿,几乎所有请求都被 PoolAcquirePendingLimitException 例外拒绝。

预期的行为是Web客户端应创建新连接(最大3200个)以处理传入流量

Webclient的配置如下:

    @Bean
    public WebClient webClient(WebClient.Builder builder)
    {
        TcpClient tcpClient = TcpClient.create(getConnectionProvider())
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS,10000)
                .wiretap(true)
                .doOnConnected(connection ->
                        connection.addHandlerLast(new ReadTimeoutHandler(10000,TimeUnit.MILLISECONDS)));
        ClientHttpConnector connector = new ReactorClientHttpConnector(HttpClient.from(tcpClient));
        return builder.uriBuilderFactory(initUriTemplateHandler())
                .clientConnector(connector)
                .build();
    }

    private ConnectionProvider getConnectionProvider()
    {
        return ConnectionProvider.builder("fixed")
                .maxConnections(3200)
                .pendingAcquireTimeout(Duration.ofMillis(10000))
                .pendingAcquireMaxCount(10000)
                .maxIdleTime(Duration.ofMinutes(10))
                .metrics(true)
                .build();
    }

    private DefaultUriBuilderFactory initUriTemplateHandler()
    {
        DefaultUriBuilderFactory uriFactory = new DefaultUriBuilderFactory();
        uriFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);
        return uriFactory;
    }

这就是我进行API调用的方式

T response = webClient.get()
                    .uri(url)
                    .retrieve()
                    .bodyToMono(responseClass)
                    .timeout(Duration.ofMillis(requestTimeout)) // varies between 15-20ms
                    .block();

enter image description here

以下是指标的屏幕截图[![在此处输入图片描述] [2]] [2]

这是一个非常繁忙的应用程序,因此实际上感觉好像“待处理队列”停留在10000

依赖版本:

  1. spring-boot-starter-webflux:2.2.4。发布
  2. 反应堆净含量:0.9.5。发布

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)