使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比
在项目中需要使用http调用接口,实现了两套发送http请求的方法,一个是使用apache的httpclient提供的http链接池来发送http请求,另一个是使用java原生的HttpURLConnection来发送http请求,并对两者性能进行了对比。
使用httpclient中的链接池发送http请求
使用最新的4.5.2版httpclient进行实现。在maven中引入
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
实现代码如下
package util;
import org.apache.http.*;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.ConnectionKeepAliveStrategy;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeaderElementIterator;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import java.io.IOException;
import java.util.Map;
/**
* Created by xugang on 16/7/11.
*/
public class HttpClientUtil {
private final static Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
private int maxTotal = 1;//默认最大连接数
private int defaultMaxPerRoute = 1;//默认每个主机的最大链接数
private int connectionRequestTimeout = 3000;//默认请求超时时间
private int connectTimeout = 3000;//默认链接超时时间
private int socketTimeout = 3000;//默认socket超时时间
private HttpRequestRetryHandler httpRequestRetryHandler = new DefaultHttpRequestRetryHandler();//默认不进行重试处理
private CloseableHttpClient httpClient;
public HttpClientUtil(){
init();
}
public String sendGet(String url, Map<String, Object> params) throws Exception {
StringBuffer sb = new StringBuffer(url);
if(!CollectionUtils.isEmpty(params)) {
for (Map.Entry<String, Object> entry : params.entrySet()) {
sb.append(entry.getKey())
.append("=")
.append(entry.getValue())
.append("&");
}
}
// no matter for the last '&' character
HttpGet httpget = new HttpGet(sb.toString());
config(httpget);
CloseableHttpResponse response = null;