springboot超好用的http连接池配置

httpTemplate:

package com.dfhr.antifraud.config.http;

import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.*;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Nonnull;
import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;


public class HttpTemplate extends RestTemplate {

    private final HttpTemplateBuilder builder;

    public HttpTemplate(HttpTemplateBuilder builder) {
        this.builder = builder;
    }

    /**
     * APPLICATION/JSON 请求(有请求头)
     *
     * @param url           请求url
     * @param request       请求体
     * @param responseClass 响应类型
     * @return 结果
     */
    public <T> T postForJson(String url, Object request, Class<T> responseClass, @Nonnull HttpHeaders headers) {
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<Object> entity = new HttpEntity<>(request, headers);
        return postForObject(url, entity, responseClass);
    }

    /**
     * APPLICATION/JSON 请求(无请求头)
     *
     * @param url           请求url
     * @param request       请求体
     * @param responseClass 响应类型
     * @return 结果
     */
    public <T> T postForJson(String url, Object request, Class<T> responseClass) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<Object> entity = new HttpEntity<>(request, headers);
        return postForObject(url, entity, responseClass);
    }

    /**
     * APPLICATION/JSON 请求(无请求头)
     *
     * @param url                        请求url
     * @param request                    请求体
     * @param parameterizedTypeReference 响应类型
     * @return 结果
     */
    public <T> T postForJson(String url, Object request, ParameterizedTypeReference<T> parameterizedTypeReference) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<Object> entity = new HttpEntity<>(request, headers);
        return exchange(url, HttpMethod.POST, entity, parameterizedTypeReference).getBody();
    }

    public <T> T get(String url, ParameterizedTypeReference<T> parameterizedTypeReference) {
        return exchange(url, HttpMethod.GET, null, parameterizedTypeReference).getBody();
    }


    /**
     * APPLICATION_FORM_URLENCODED 表单请求
     *
     * @param url           请求url
     * @param request       请求体
     * @param responseClass 响应类型
     * @return 结果
     */
    public <T> ResponseEntity<T> postForm(String url, MultiValueMap<Object, Object> request, Class<T> responseClass) {
        MultiValueMap<Object, Object> jsonParams = new LinkedMultiValueMap<>();
        jsonParams.addAll(request);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        HttpEntity<MultiValueMap<Object, Object>> params = new HttpEntity<>(jsonParams, headers);
        return postForEntity(url, params, responseClass);
    }


    /**
     * 初始化
     */
    @PostConstruct
    private void init() {
        this.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        this.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient()));
    }

    /**
     * 内部httpClient
     *
     * @return httpClient
     */
    private HttpClient httpClient() {
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
        connectionManager.setMaxTotal(builder.getMaxTotal());
        connectionManager.setDefaultMaxPerRoute(builder.getMaxPerRoute());
        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(builder.getSocketTimeout())
                .setConnectTimeout(builder.getConnectTimeout())
                .setConnectionRequestTimeout(1000)
                .build();
        return HttpClientBuilder.create()
                .setDefaultRequestConfig(requestConfig)
                .setConnectionManager(connectionManager)
                .build();
    }

    public static HttpTemplateBuilder newBuilder() {
        return new HttpTemplateBuilder();
    }

    public static class HttpTemplateBuilder {

        /**
         * 连接池的总连接限制
         */
        private Integer maxTotal;

        /**
         * 每个HTTP路由的连接限制
         */
        private Integer maxPerRoute;

        /**
         * 读超时
         */
        private Integer socketTimeout;

        /**
         * 连接超时
         */
        private Integer connectTimeout;

        public HttpTemplateBuilder maxTotal(Integer maxTotal) {
            this.maxTotal = maxTotal;
            return this;
        }

        public HttpTemplateBuilder maxPerRoute(Integer maxPerRoute) {
            this.maxPerRoute = maxPerRoute;
            return this;
        }

        public HttpTemplateBuilder socketTimeout(Integer socketTimeout) {
            this.socketTimeout = socketTimeout;
            return this;
        }

        public HttpTemplateBuilder connectTimeout(Integer connectTimeout) {
            this.connectTimeout = connectTimeout;
            return this;
        }

        public Integer getMaxTotal() {
            return maxTotal;
        }

        public Integer getMaxPerRoute() {
            return maxPerRoute;
        }

        public Integer getSocketTimeout() {
            return socketTimeout;
        }

        public Integer getConnectTimeout() {
            return connectTimeout;
        }
    }

}
HttpConfigure:
package com.dfhr.antifraud.config.http;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import javax.annotation.Resource;
import java.util.List;


@SuppressWarnings("SpringJavaAutowiringInspection")
@Configuration
public class HttpConfigure {

    //也可使用fastJson替换 
    @Resource
    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;

    @Bean
    @Primary
    public HttpTemplate httpTemplate() {
        HttpTemplate httpTemplate = new HttpTemplate(templateBuilder());
        List<HttpMessageConverter<?>> messageConverters = httpTemplate.getMessageConverters();
        if (messageConverters.removeIf(converter -> converter instanceof GsonHttpMessageConverter)) {
            messageConverters.add(mappingJackson2HttpMessageConverter);
        }
        return httpTemplate;
    }

    public HttpTemplate.HttpTemplateBuilder templateBuilder(){
        return HttpTemplate.newBuilder()
                .maxTotal(400).maxPerRoute(100).connectTimeout(10000).socketTimeout(10000);
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 引入依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.14.9</version> </dependency> ``` 2. 配置连接池Spring Boot配置文件中添加以下配置: ``` okhttp: connectionPool: maxIdleConnections: 5 keepAliveDuration: 300 ``` 这里我们配置连接池最大空闲连接数为5,每个连接的最大空闲时间为300秒。 3. 创建 OkHttpClient 在Spring Boot应用中创建OkHttpClient时,使用以下代码: ``` @Configuration public class OkHttpClientConfiguration { @Autowired private Environment environment; @Bean public OkHttpClient okHttpClient() { OkHttpClient.Builder builder = new OkHttpClient.Builder(); int maxIdleConnections = environment.getProperty("okhttp.connectionPool.maxIdleConnections", Integer.class); int keepAliveDuration = environment.getProperty("okhttp.connectionPool.keepAliveDuration", Integer.class); ConnectionPool connectionPool = new ConnectionPool(maxIdleConnections, keepAliveDuration, TimeUnit.SECONDS); builder.connectionPool(connectionPool); return builder.build(); } } ``` 这里我们使用Spring的@Autowired注解自动注入配置文件中的OkHttpClient配置,然后创建一个OkHttpClient.Builder对象,并设置连接池。最后构建OkHttpClient对象并返回。 4. 使用 OkHttpClient 在需要使用OkHttpClient的地方,注入OkHttpClient对象,然后使用它发起HTTP请求。例如: ``` @Service public class MyService { @Autowired private OkHttpClient okHttpClient; public void doRequest() throws IOException { Request request = new Request.Builder() .url("https://www.example.com") .build(); Response response = okHttpClient.newCall(request).execute(); String body = response.body().string(); // process response body } } ``` 这里我们注入了创建好的OkHttpClient对象,并使用它构建一个HTTP请求。发送请求后,我们从响应中获取响应体,并进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值