在SpringBoot中使用RestTemplate详解

 更新时间:2025年12月08日 09:46:40   作者:wsdhla  
文章介绍了配置文件、配置类和工具类的使用,并对比了RestTemplate与HttpClient/OkHttp在性能上的差异,后者由于使用了连接池,性能优于前者

SpringBoot中使用RestTemplate

1、配置文件

# 最大连接数
http.maxTotal=100

# 并发数
http.defaultMaxPerRoute=20

# 客户端创建连接超时时间
http.connectTimeout=10000

# 从连接池中获取到连接的最长时间
http.connectionRequestTimeout=500

# 服务端响应超时时间
http.socketTimeout=30000

# 提交请求前测试连接是否可用
http.staleConnectionCheckEnabled=true

# 可用空闲连接过期时间,重用空闲连接时会先检查是否空闲时间超过这个时间,如果超过,释放socket重新建立
http.validateAfterInactivity=3000000

2、配置类

import org.apache.http.Header;
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.HttpClientConnectionManager;
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.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeader;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;


@Configuration
@ComponentScan("com.xxx")
@PropertySource(value = {"classpath:/xxx.properties", "classpath:/yyy.properties"}, encoding = "utf-8")
public class XxxConfiguration {
    @Value("${http.maxTotal}")
    private Integer maxTotal;

    @Value("${http.defaultMaxPerRoute}")
    private Integer defaultMaxPerRoute;

    @Value("${http.connectTimeout}")
    private Integer connectTimeout;

    @Value("${http.connectionRequestTimeout}")
    private Integer connectionRequestTimeout;

    @Value("${http.socketTimeout}")
    private Integer socketTimeout;

    @Value("${http.staleConnectionCheckEnabled}")
    private boolean staleConnectionCheckEnabled;

    @Value("${http.validateAfterInactivity}")
    private Integer validateAfterInactivity;

    /**
     * @description: Rest模板
     * @return: org.springframework.web.client.RestTemplate
     * @author: wsdhla
     * @date: 2022/06/27 16:34
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate(httpRequestFactory());
    }

    /**
     * @description: 请求连接池配置
     * @return: org.springframework.http.client.ClientHttpRequestFactory
     * @author: wsdhla
     * @date: 2022/06/27 16:35
     */
    @Bean
    public ClientHttpRequestFactory httpRequestFactory() {
        return new HttpComponentsClientHttpRequestFactory(httpClient());
    }

    /**
     * @description: HttpClient
     * @return: org.apache.http.client.HttpClient
     * @author: wsdhla
     * @date: 2022/06/27 16:42
     */
    @Bean
    public HttpClient httpClient() {
        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(socketTimeout)
                .setConnectTimeout(connectTimeout)
                .setStaleConnectionCheckEnabled(staleConnectionCheckEnabled)
                .setConnectionRequestTimeout(connectionRequestTimeout)
                .build();


        List<Header> headers = new ArrayList<>();
        headers.add(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"));
        headers.add(new BasicHeader("Accept-Encoding", "gzip,deflate"));
        headers.add(new BasicHeader("Accept-Language", "zh-CN"));
        headers.add(new BasicHeader("Connection", "Keep-Alive"));
        headers.add(new BasicHeader("Content-type", "application/json;charset=UTF-8"));

        return HttpClientBuilder.create()
                .setDefaultRequestConfig(requestConfig)
                .setConnectionManager(poolingHttpClientConnectionManager())
                .setDefaultHeaders(headers)
                .setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy())
                .setRetryHandler(new DefaultHttpRequestRetryHandler(2, true))
                .build();
    }

    /**
     * @description: Http连接管理器
     * @return: org.apache.http.conn.HttpClientConnectionManager
     * @author: wsdhla
     * @date: 2022/06/27 16:41
     */
    @Bean
    public HttpClientConnectionManager poolingHttpClientConnectionManager() {
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();

        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
        connectionManager.setMaxTotal(maxTotal);
        connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute);
        connectionManager.setValidateAfterInactivity(validateAfterInactivity);

        return connectionManager;
    }
}

3、工具类

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

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


@Component
public class RestTemplateUtils {

    private static RestTemplate restTemplate;

    /**
     * POST请求调用方式
     * @param url          请求URL
     * @param requestBody  请求参数体
     * @param responseType 返回对象类型
     * @return ResponseEntity 响应对象封装类
     */
    public static <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType)
            throws RestClientException {
        return restTemplate.postForEntity(url, requestBody, responseType);
    }

    @Resource
    public void setRestTemplate(RestTemplate restTemplate) {
        RestTemplateUtils.restTemplate = restTemplate;
    }
}

4、具体使用

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("acc-key", acc-key);

JSONObject requestParam = new JSONObject();
requestParam.put("code", code);
requestParam.put("message", message);

HttpEntity<String> requestBody = new HttpEntity<String>(JSON.toJSONString(requestParam), headers);

ResponseEntity<实体类> resp = RestTemplateUtils.post(url, requestBody, 实体类.class);

RestTemplate默认使用Java自带的HttpURLConnection,没有池化,会有性能问题,可以使用HttpClient或者OkHttp

HttpClient示例:

@Configuration
public class HttpClientExtConfig {

    @ConditionalOnMissingBean(RestTemplate.class)
    @Bean
    public RestTemplate restTemplate() {
        CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionManager(new PoolingHttpClientConnectionManager())
                .build();

        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setHttpClient(httpClient);

        return new RestTemplate();
    }
}
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java遍历Json中的key和value问题

    Java遍历Json中的key和value问题

    这篇文章主要介绍了Java遍历Json中的key和value问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java异常处理操作实例小结

    Java异常处理操作实例小结

    这篇文章主要介绍了Java异常处理操作,结合实例形式总结分析了java异常处理常见操作情况与相关处理技巧,需要的朋友可以参考下
    2019-07-07
  • springboot项目中使用docker进行远程部署的实现

    springboot项目中使用docker进行远程部署的实现

    本文主要介绍了在Spring Boot项目中使用Docker进行远程部署,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • 关于Jsoup将相对路径转为绝对路径的方法

    关于Jsoup将相对路径转为绝对路径的方法

    这篇文章主要介绍了关于Jsoup将相对路径转为绝对路径的方法,jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容,需要的朋友可以参考下
    2023-04-04
  • java多线程JUC常用辅助类详解

    java多线程JUC常用辅助类详解

    这篇文章主要为大家介绍了java多线程及并发编程中JUC常用辅助类,文中附含详细示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09
  • Nacos服务注册与发现原理解读

    Nacos服务注册与发现原理解读

    Nacos是阿里巴巴开源的微服务组件,支持服务注册、发现及配置管理,采用客户端心跳维护、服务端推送与长轮询同步,结合健康检查机制,实现高效可靠的微服务治理
    2025-08-08
  • Java  Thread多线程详解及用法解析

    Java Thread多线程详解及用法解析

    本文主要介绍Java 多线程详解及用法,这里整理了详细资料及简单实现代码,有需要的小伙伴可以参考下
    2016-09-09
  • WebSocket整合SSM(Spring,Struts2,Maven)的实现示例

    WebSocket整合SSM(Spring,Struts2,Maven)的实现示例

    这篇文章主要介绍了WebSocket整合SSM(Spring,Struts2,Maven)的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • 基于logback 实现springboot超级详细的日志配置

    基于logback 实现springboot超级详细的日志配置

    java web 下有好几种日志框架,比如:logback,log4j,log4j2(slj4f 并不是一种日志框架,它相当于定义了规范,实现了这个规范的日志框架就能够用 slj4f 调用)。这篇文章主要介绍了基于logback springboot超级详细的日志配置,需要的朋友可以参考下
    2019-06-06
  • Java实现的时间戳与date对象相互转换功能示例

    Java实现的时间戳与date对象相互转换功能示例

    这篇文章主要介绍了Java实现的时间戳与date对象相互转换功能,结合具体实例形式分析了java日期与时间戳类型的表示与转换相关操作技巧,需要的朋友可以参考下
    2017-06-06

最新评论