RestTemplate 连接池配置

本文介绍了如何使用RestTemplateBuilder创建RestTemplate,并着重讲解了连接池配置及HttpComponentsClientHttpRequestFactory的角色。同时,详细阐述了连接超时参数,包括ConnectionRequestTimeout、ReadTimeout和ConnectTimeout的作用及它们在请求总时长中的影响。未设置ConnectionRequestTimeout可能导致请求阻塞,影响性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过 RestTemplateBuilder 的方式生成 RestTemplate

    @Bean(name = "template")
    RestTemplate template(RestTemplateBuilder restTemplateBuilder) {
        return restTemplateBuilder
                //单位s, 设置连接时间,避免线程过多被阻塞挂起
                .setConnectTimeout(Duration.ofSeconds(1))
                .setReadTimeout(Duration.ofSeconds(1))
                .additionalMessageConverters(new MyMappingJackson2HttpMessageConverter())
                .requestFactory(() -> {
                    HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
                    // 连接池
                    HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
                    //设置HTTP连接管理器
                    PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
                    poolingConnectionManager.setMaxTotal(500); // 连接池最大连接数
                    poolingConnectionManager.setDefaultMaxPerRoute(200); // 每个主机的并发
                    httpClientBuilder.setConnectionManager(poolingConnectionManager);
                    // 设置 RequestConfig 连接池请求全局配置
                    // 连接池超时时间 3500ms
                     RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(3500).build();
                     httpClientBuilder.setDefaultRequestConfig(requestConfig);
                    // 设置连接池
                    clientHttpRequestFactory.setHttpClient(httpClientBuilder.build());
                    return clientHttpRequestFactory;
                })
                .build();
    }

restTemplate的连接由 RequestFactory 创建
HttpComponentsClientHttpRequestFactory 是 RequestFactory 实现类,连接池化,有 httpClient 引用

RestTemplateBuilder 用于生成 restTeamplte
configure 方法初始化了 RequestFactory 对象通过 buildRequestFactory

    public ClientHttpRequestFactory buildRequestFactory() {
        ClientHttpRequestFactory requestFactory = null;
        if (this.requestFactory != null) {
            requestFactory = (ClientHttpRequestFactory)this.requestFactory.get();
        } else if (this.detectRequestFactory) {
            // 默认连接池工厂
            requestFactory = (new ClientHttpRequestFactorySupplier()).get();
        }

        if (requestFactory != null && this.requestFactoryCustomizer != null) {
            this.requestFactoryCustomizer.accept(requestFactory);
        }

        return requestFactory;
    }

超时参数说明:

  1. ConnectionRequestTimeout: 从连接池获取到连接的超时时间,常用于PoolingHttpClientConnectionManager(4.5),(4.3前MultiThreadedHttpConnectionManager)
  2. ReadTimeout:客户端与服务器已经建立连接后等待响应时间
  3. ConnectTimeout:建立连接(TCP)的超时时间

理论上请求的最长时间=以上三个参数的和,时间上请求的最长时间大部分在ReadTimeout+ConnectionRequestTimeout

若不配置ConnectionRequestTimeout可能会导致请求阻塞,该值默认-1,因为MaxPerRoute默认2,MaxTotal默认20,吞吐量上不去接口超时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值