前言
Http连接需要的三次握手开销很大, 传统的HttpURLConnection并不支持连接池, HTTP1.1以上默认开启keepalive, 对于现在springcloud横行的社会, feign可以配置好http连接池, 不过总会有某些个别的接口不在服务中, 还有一些非springboot的老旧项目也要加入cloud大家族中, 对于内部频繁访问的url地址, 这就需要一款量身定做的工具类了.
讲解
先来看看测试效果, 两种工具类的时间消耗对比.
这个是测试用的方法, 前后分别调用了某一接口100次, 进行时间统计, 系统页面按F12能看到平均握手速度大概是3ms
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
result = commonManager.getPolicyGoNew(inputStr);
}
long end = System.currentTimeMillis();
System.out.println(String.valueOf(end - start));
System.out.println("***********");
long start2 = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
result = commonManager.getPolicyGo(inputStr);
}
long end2 = System.currentTimeMillis();
System.out.println(String.valueOf(end2 - start2));
100次快了647ms, 平均一次6ms, 握三次手大概要这么久吧
9612
***********
10259
第二次我调换了顺序, 500.for, 500次快了2341ms, 平均一次4.6ms, 更接近3ms了
50906
***********
48565
52327
***********
47021
错误的请求数据, 可以立马返回数据, 更能说明是否节省了握手时间
9625
***********
8868
9251
***********
8718
不过我之前都是调用的生产环境的接口, 效率还是比较高的, 下面我在uat环境测试一下
正常查询详情数据消耗时间
500次快了4900ms, 平均一次10ms
72712
***********
67839
错误的请求数据, 可以立马返回数据, 更能说明是否节省了握手时间
500次快了2400ms, 平均一次4.8ms
6439
***********
4063
代码
原httputil, 看实现部分就好
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.HttpClientUtils;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import java.util.Map;
public class HttpUtils {
public interface ResponseCallback {
void onResponse(CloseableHttpResponse response) throws Exception;
void onError(int resultCode, String resultStr