说明:在调用淘宝的公共平台接口时候,响应较慢,我们需要60ms能够获取到响应,但是却经常是200ms甚至更长时间,别人的接口只能够优化网络响应时间来提升接口响应
由于接口并发量发,QPS高,接口每一次连接都需要创建http连接,所以打算从这部分照收进行优化。通过使用连接池来减少连接的重复创建次数,使连接能够复用
@Bean("poolRestTemplate")
public RestTemplate poolRestTemplate() {
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(100); // 最大连接数
connectionManager.setDefaultMaxPerRoute(20); // 每个路由最大连接数
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
requestFactory.setConnectTimeout(5000); // 连接超时时间
requestFactory.setReadTimeout(5000); // 读取超时时间
return new RestTemplate(requestFactory);
}
在使用时候自动注入进行调用
@Resource(name = "poolRestTemplate")
private RestTemplate poolRestTemplate;
@Override
public TaoBaoVo askTaoBao(Map<String, String> map) {
String logBy = this.getClass().getName() + ".askTaoBao:{}";
try {
// 省略业务逻辑处理
return poolRestTemplate.getForObject(realUrl, TaoBaoVo.class);
} catch (Exception exception) {
log.error(exception.getMessage());
throw new ServiceCustomerException(ErrorCode.SERVICE_EXCEPTION);
}
}
如何验证是否使用了线程池?
在服务启动后打印连接状态,发现这个一直在变动,说明连接池生效
// 查看连接池状态
System.out.println("Leased: " + connectionManager.getTotalStats().getLeased());
System.out.println("Available: " + connectionManager.getTotalStats().getAvailable());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)