Spring中RestTemplate进行Http调用
Spring中的RestTemplate类源自spring-web,http调用中设置超时时间、设置连接池管理等非常重要,保证了系统的可用性,避免了长时间连接不上或者等待数据返回,拖垮系统。
现贴出工作上关于RestTemplate的标准配置,设置了超时时间、连接池等,开箱即用。
package com.pab.bloan.charge.app.common.config; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.SocketConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.client.RestTemplate; import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit; @Configuration
public class RestTemplateConfig { private static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 100; private static final int DEFAULT_MAX_CONNECTIONS_PER_ROUTE = 10; private static final int DEFAULT_MAX_TIME_OUT = 3000; @Value("${rest-template.timeout:3000}")
private int defaultTimeOut; @Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate(httpRequestFactory());
List<HttpMessageConverter<?>> converters = new ArrayList<>();
FastJsonHttpMessageConverter jacksonMessageConverter = new FastJsonHttpMessageConverter();
converters.add(jacksonMessageConverter);
restTemplate.setMessageConverters(converters);
return restTemplate;
} @Bean
public ClientHttpRequestFactory httpRequestFactory() {
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
RequestConfig requestConfig = RequestConfig.custom()
// 连接超时
.setConnectTimeout(defaultTimeOut)
// 排队超时
.setConnectionRequestTimeout(defaultTimeOut)
// 数据读取超时
.setSocketTimeout(defaultTimeOut)
.build();
requestFactory.setConnectTimeout(defaultTimeOut);
requestFactory.setReadTimeout(defaultTimeOut);
SocketConfig socketConfig = SocketConfig
.custom()
.setSoKeepAlive(false)
.setTcpNoDelay(true)
.build();
PoolingHttpClientConnectionManager pm = new PoolingHttpClientConnectionManager();
pm.setDefaultSocketConfig(socketConfig);
pm.closeIdleConnections(DEFAULT_MAX_TIME_OUT, TimeUnit.MICROSECONDS);
pm.setMaxTotal(DEFAULT_MAX_TOTAL_CONNECTIONS);
pm.setDefaultMaxPerRoute(DEFAULT_MAX_CONNECTIONS_PER_ROUTE);
CloseableHttpClient httpClient = HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(pm)
.build();
requestFactory.setHttpClient(httpClient);
return requestFactory;
}
}
使用示例(代码中将相关的请求url、请求参数、响应参数,替换掉即可):
/**
* 调用渠道查询客户经理名单接口
* @param saleManagerRequest
* @return
*/
private SaleManagerResponse requestQDSaleManagerApi(SaleManagerRequest saleManagerRequest) {
// 调用外联额度变更接口
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
ResponseEntity<SaleManagerResponse> responseEntity =
restTemplate.postForEntity(accessGatewayService.getAccessGatewayRequestUrl(qdSaleManagerSearchUrl),
new HttpEntity<>(saleManagerRequest, headers), SaleManagerResponse.class); if (responseEntity.getStatusCode() == HttpStatus.OK) {
SaleManagerResponse saleManagerResponse = responseEntity.getBody();
if (saleManagerResponse != null
&& Response.SUCCESS.equals(saleManagerResponse.getResponseCode())) {
return saleManagerResponse;
} else {
log.error("request destination error:[requestUrl:{}; request:{}; response:{}]",
new Object[]{qdSaleManagerSearchUrl, saleManagerRequest, saleManagerResponse});
throw new BusinessException("调用渠道查询客户经理名单接口异常");
}
} else {
throw new BusinessException("调用渠道查询客户经理名单接口网络不可达");
}
}
标准化代码,用起来美滋滋。
Spring中RestTemplate进行Http调用的更多相关文章
- 不使用SpringBoot如何将原生Feign集成到Spring中来简化http调用
在微服务架构中,如果使用得是SpringCloud,那么只需要集成SpringFeign就可以了,SpringFeign可以很友好的帮我们进行服务请求,对象解析等工作. 然而SpingCloud是依赖 ...
- Spring中RestTemplate的使用方法
一.REST 在互联网中,我们会通过请求url来对网络上的资源做增删改查等动作,这里的请求包含两部分:动词,主要包括增.删.改.查:名词,就是网络中的各种资源.传统的非REST风格的请求方式是把动词和 ...
- 使用Spring的RestTemplate进行接口调用
引自:http://www.zimug.com/ 1.常见的http服务的通信方式 经常使用的方式有HttpClient.OkHttp.RestTemplate.其中RestTemplate是一种更优 ...
- Spring中利用applicationContext.xml文件实例化对象和调用方法
Spring中实例化对象和调用方法入门 1.jar包和xml的准备 已上传至百度云盘,链接: https://pan.baidu.com/s/1CY0xQq3GLK06iX7tVLnp3Q 提取码: ...
- c3p0在spring中的配置
在大家的开发和学习其中应该经经常使用到数据库的连接和使用,只是连接 的方式就有非常多种方式了,例如说用最最简单的JDBC 也好,还实用比 较复杂一点的就是数据库连接池.当然还有使用DBCP的连接的,各 ...
- 【Spring】Spring中的Bean - 4、Bean的生命周期
Bean的生命周期 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 了解Spring中Bean的生命周期有何意义? 了解Sp ...
- JAVA微服务应用(1)--SpringBoot中的REST API调用(学习笔记)
好长时间没有写学习小结了,最近宁正好看了小马哥的微服务系列之<Spring Boot>系列,颇有收获,并且公司也布置一个课题就是关于Spring中的REST API调用.于是乎回归本行,再 ...
- spring boot2X整合Consul一使用RestTemplate实现服务调用
Consul可以用于实现分布式系统的服务发现与配置 服务调用有两种方式: A.使用RestTemplate 进行服务调用 负载均衡——通过Ribbon注解RestTemplate B.使用Feign ...
- 分析spring事务@Transactional注解在同一个类中的方法之间调用不生效的原因及解决方案
问题: 在Spring管理的项目中,方法A使用了Transactional注解,试图实现事务性.但当同一个class中的方法B调用方法A时,会发现方法A中的异常不再导致回滚,也即事务失效了. 当这个方 ...
随机推荐
- 使用Ansible自动配置Nginx服务
1.首先安装好Ansible环境,具体步骤请见Ansible安装 2.先创建hosts文件(为后面编写脚本安装JDK做铺垫) [root@localhost /]# vi hosts [jdktest ...
- 【Python数据挖掘】回归模型与应用
线性回归 ( Linear Regression ) 线性回归中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归称为一元线性回归. 如果回归分析中包括两个或两个以上的自变量, ...
- node.js使用require给flume提交请求
node.js使用require给flume提交请求 - 简书 https://www.jianshu.com/p/02c20e2d011a 玄月府的小妖在debug 关注 2017.04 ...
- windows accounts
Some built-in groups are used for management purposes. You control which > users belong to these ...
- 用linux c求最大公约数
我写了两中函数,一个是辗转相除法一个是更相减损法,主要代码如下: /*辗转相除法*/int gcd(int a, int b) { ) { return b; } else { return gcd( ...
- 随笔 javascript-抽象工厂模式
随笔 javascript-抽象工厂模式 抽象工厂模式笔记 1.抽象工厂模式创建多个抽象类,创建出的结果是一个类簇(这里是抽象类的集合) 2.抽象工厂中传入的父类是否是抽象工厂方法创建的抽 ...
- php格式化输出数组
写网页的时候经常需要在页面中打印数组,但格式特别难看,看看一个html神器吧<pre>标签,能非常标准的显示数组格式 使用的时候只需要这样打印你的数组就OK了,太好用了,神器! echo ...
- 漫谈JS 的继承方式
一.原型链原型链的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.每一个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的指针.如果:我们让 ...
- linux下的KSM内存共享机制分析
2017-04-26 KSM是内核中的一种内存共享机制,在2.6.36版本的内核中开始引入,简单来说就是其会 合并某些相同的页面以减少页面冗余.在内核中有一个KSM守护进程 ksmd,它定期扫描用户向 ...
- python常见模块之os模块
os模块是python系统与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前 ...