推荐HttpClient工具类
依赖
<!-- Apache HttpClient 核心依赖 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version> <!-- 或更高版本 -->
</dependency>
<!-- SSL/TLS 支持 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient-cache</artifactId>
<version>4.5.13</version>
</dependency>
<!-- 日志实现(按需选其一) -->
<!-- 方案1:Logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<!-- 方案2:Log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.17.2</version>
</dependency>
关键依赖说明:
- httpclient:提供核心HTTP客户端功能
- httpclient-cache:包含SSL/TLS支持所需类(如
SSLConnectionSocketFactory
) - 日志依赖:必须添加日志实现才能看到连接池的DEBUG日志
验证依赖是否齐全的小技巧:
mvn dependency:tree | grep 'httpclient'
# 应该看到:
# org.apache.httpcomponents:httpclient:jar:4.5.13
# org.apache.httpcomponents:httpcore:jar:4.4.15
# org.apache.httpcomponents:httpclient-cache:jar:4.5.13
工具类
import org.apache.http.*;
import org.apache.http.client.config.*;
import org.apache.http.conn.ssl.*;
import org.apache.http.impl.client.*;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import javax.net.ssl.*;
import java.security.cert.X509Certificate;
public class HttpsDiagnosisClient {
private static volatile CloseableHttpClient httpClient;
private static final int MAX_TOTAL = 1000;
private static final int MAX_PER_ROUTE = 200;
private static final int CONN_REQUEST_TIMEOUT = 1000; // 连接池获取超时
private static final int CONNECT_TIMEOUT = 250; // 连接建立超时
private static final int SOCKET_TIMEOUT = 1000; // 数据传输超时
// 双重检查锁单例模式
public static CloseableHttpClient getInstance() {
if (httpClient == null) {
synchronized (HttpsDiagnosisClient.class) {
if (httpClient == null) {
httpClient = createHttpsClient();
}
}
}
return httpClient;
}
private static CloseableHttpClient createHttpsClient() {
try {
// 1. 创建信任所有证书的SSL上下文(生产环境建议使用正式证书)
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(null, (X509Certificate[] chain, String authType) -> true)
.build();
// 2. 配置连接池(关键!开启诊断)
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
connManager.setMaxTotal(MAX_TOTAL);
connManager.setDefaultMaxPerRoute(MAX_PER_ROUTE);
// 3. 创建带诊断的HttpClient
return HttpClients.custom()
.setConnectionManager(connManager)
.setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext,
new String[]{"TLSv1.2", "TLSv1.3"}, // 指定TLS版本
null,
NoopHostnameVerifier.INSTANCE))
.setDefaultRequestConfig(RequestConfig.custom()
.setConnectionRequestTimeout(CONN_REQUEST_TIMEOUT)
.setConnectTimeout(CONNECT_TIMEOUT)
.setSocketTimeout(SOCKET_TIMEOUT)
.build())
// 添加耗时拦截器
.addInterceptorLast(new TimingInterceptor())
.build();
} catch (Exception e) {
throw new RuntimeException("创建HTTPS客户端失败", e);
}
}
// 耗时统计拦截器
private static class TimingInterceptor implements HttpResponseInterceptor {
@Override
public void process(HttpResponse response, HttpContext context) {
HttpClientContext clientContext = HttpClientContext.adapt(context);
TimingInfo timing = clientContext.getAttribute("timing", TimingInfo.class);
if (timing != null) {
long totalTime = System.currentTimeMillis() - timing.startTime;
System.out.printf("""
[HTTP Timing Diagnostics]
|-- 连接池等待: %dms
|-- DNS解析: %dms
|-- TCP握手: %dms
|-- SSL握手: %dms
|-- 请求发送: %dms
|-- 响应接收: %dms
|-- 总耗时: %dms
""",
timing.connectionPoolTime,
timing.dnsTime,
timing.tcpHandshakeTime,
timing.sslHandshakeTime,
timing.requestSendTime,
timing.responseReceiveTime,
totalTime);
}
}
}
// 计时信息载体
private static class TimingInfo {
long startTime;
long connectionPoolTime;
long dnsTime;
long tcpHandshakeTime;
long sslHandshakeTime;
long requestSendTime;
long responseReceiveTime;
}
}
需要配合以下日志配置(logback.xml示例):
<!-- 连接池状态监控 -->
<logger name="org.apache.http.impl.conn.PoolingHttpClientConnectionManager" level="DEBUG"/>
<!-- 各阶段耗时日志 -->
<logger name="org.apache.http.impl.execchain" level="TRACE"/>
<logger name="org.apache.http.client.protocol" level="DEBUG"/>
工具类特点:
- HTTPS优化:
- 指定TLSv1.2+协议