Apache HttpClient 4.5.x 学习总结九:HTTP连接管理
精简翻译:
2.1 连接持久化
✅ 核心价值:复用TCP连接减少握手开销(尤其对小报文)
✅ 实现方式:
- HTTP/1.1 默认支持连接复用
- HTTP/1.0 通过
Keep-Alive头显式声明
2.2 连接路由
🚦 三种路由类型:
- 普通路由:直连目标或单代理
- 隧道路由:通过代理链连接目标(如
Proxy1 → Proxy2 → Server) - 分层路由:在现有连接上叠加协议(如HTTP over SSL)
2.3 连接管理器
🔒 核心作用:线程安全地管理连接生命周期
| 管理器类型 | 特点 |
|---|---|
BasicHttpClientConnectionManager |
单连接,仅限单线程使用(适合EJB容器) |
PoolingHttpClientConnectionManager |
连接池,支持多线程(默认推荐) |
连接池配置示例:
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(200); // 全局最大连接数
cm.setDefaultMaxPerRoute(20); // 单路由默认连接数
cm.setMaxPerRoute(new HttpRoute(localhost), 50); // 特定路由连接数
2.4 多线程执行
⚠️ 关键约束:
- 连接请求阻塞时,通过
http.conn-manager.timeout设置超时 - 每个线程应使用独立
HttpContext
2.5 空闲连接清理
🧹 两种清理策略:
closeExpiredConnections():关闭过期连接closeIdleConnections(30, SECONDS):关闭空闲超30秒连接
👉 实现方式:专用监控线程定期执行清理
2.6 保活策略
⏱️ 自定义Keep-Alive:
ConnectionKeepAliveStrategy myStrategy = (response, context) -> {
if ("naughty-server.com".equals(targetHost))
return 5 * 1000; // 问题服务器仅保活5秒
else
return 30 * 1000; // 默认保活30秒
};
2.7 SSL定制化
🔐 安全套接字工厂:
// 创建自定义SSL工厂
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(myTrustStore).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
// 注册协议
Registry<ConnectionSocketFactory> reg = RegistryBuilder.<ConnectionSocketFactory>create()
.register("https", sslsf).build();
// 应用至连接池
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(reg);
2.8 代理配置
🌐 三种代理设置方式:
- 固定代理:
DefaultProxyRoutePlanner planner = new DefaultProxyRoutePlanner(new HttpHost("proxy", 8080)); - 系统默认代理:
SystemDefaultRoutePlanner planner = new SystemDefaultRoutePlanner(ProxySelector.getDefault()); - 完全自定义路由:
HttpRoutePlanner planner = (target, request, context) -> new HttpRoute(target, null, new HttpHost("proxy", 8080), true);
核心知识点提炼:
| 主题 | 技术要点 |
|---|---|
| 连接复用 | 减少TCP握手开销,提升吞吐量(尤其高频小请求场景) |
| 路由分层 | 普通路由/隧道路由/分层路由满足不同代理场景 |
| 连接池管理 | 线程池化实现高并发,需设置MaxTotal(全局)和MaxPerRoute(单路由)连接数上限 |
| 多线程安全 | 每个线程使用独立HttpContext,连接请求需设超时避免永久阻塞 |
| 空闲连接清理 | 监控线程定期清理过期/空闲连接,防止"僵尸连接" |
| SSL定制化 | 通过SSLContext加载密钥库,SSLConnectionSocketFactory实现协议层安全定制 |
| 主机名验证 | DefaultHostnameVerifier(RFC合规) vs NoopHostnameVerifier(关闭验证) |
| 代理配置 | 支持固定代理、系统代理、完全自定义路由三种模式 |
通俗解释:
场景类比:物流公司运营
-
连接复用 = 货车往返带货
- 首次送货需办手续(TCP握手)
- 返程捎回新货物(复用连接)→ 省时增效
-
连接池 = 货车调度中心
- 中心有200辆车(
setMaxTotal(200)) - 往上海方向最多发50辆(
setMaxPerRoute("上海",50)) - 无车可用时司机排队(阻塞),超时则报错(
ConnectionPoolTimeoutException)
- 中心有200辆车(
-
空闲连接清理 = 车辆回收机制
- 监控员定时检查:
- 报废过期车辆(
closeExpiredConnections()) - 召回闲置30分钟车辆(
closeIdleConnections(30, MINUTES))
- 报废过期车辆(
- 监控员定时检查:
-
SSL定制化 = 特种运输车队
- 定制防弹货车(
SSLContext加载密钥库) - 每辆车配备验货员(
HostnameVerifier检查目的地真实性)
- 定制防弹货车(
-
代理配置 = 中转站规则
- 固定中转站:所有货物经深圳口岸(固定代理)
- 智能调度:根据货物类型选最优口岸(自定义路由)
终极目标:
- 高效:通过连接复用和池化提升吞吐
- 稳定:多线程安全+空闲连接清理保障可靠性
- 安全:SSL定制化防止数据泄露
- 灵活:代理配置适应复杂网络环境
浙公网安备 33010602011771号