Apache HttpClient 4.5.x 学习总结九:HTTP连接管理

精简翻译:

2.1 连接持久化
核心价值:复用TCP连接减少握手开销(尤其对小报文)
实现方式

  • HTTP/1.1 默认支持连接复用
  • HTTP/1.0 通过Keep-Alive头显式声明

2.2 连接路由
🚦 三种路由类型

  1. 普通路由:直连目标或单代理
  2. 隧道路由:通过代理链连接目标(如Proxy1 → Proxy2 → Server
  3. 分层路由:在现有连接上叠加协议(如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 空闲连接清理
🧹 两种清理策略

  1. closeExpiredConnections():关闭过期连接
  2. 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 代理配置
🌐 三种代理设置方式

  1. 固定代理
    DefaultProxyRoutePlanner planner = new DefaultProxyRoutePlanner(new HttpHost("proxy", 8080));
    
  2. 系统默认代理
    SystemDefaultRoutePlanner planner = new SystemDefaultRoutePlanner(ProxySelector.getDefault());
    
  3. 完全自定义路由
    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(关闭验证)
代理配置 支持固定代理、系统代理、完全自定义路由三种模式

通俗解释:

场景类比:物流公司运营

  1. 连接复用 = 货车往返带货

    • 首次送货需办手续(TCP握手)
    • 返程捎回新货物(复用连接)→ 省时增效
  2. 连接池 = 货车调度中心

    • 中心有200辆车(setMaxTotal(200)
    • 往上海方向最多发50辆(setMaxPerRoute("上海",50)
    • 无车可用时司机排队(阻塞),超时则报错(ConnectionPoolTimeoutException
  3. 空闲连接清理 = 车辆回收机制

    • 监控员定时检查:
      • 报废过期车辆(closeExpiredConnections()
      • 召回闲置30分钟车辆(closeIdleConnections(30, MINUTES)
  4. SSL定制化 = 特种运输车队

    • 定制防弹货车(SSLContext加载密钥库)
    • 每辆车配备验货员(HostnameVerifier检查目的地真实性)
  5. 代理配置 = 中转站规则

    • 固定中转站:所有货物经深圳口岸(固定代理)
    • 智能调度:根据货物类型选最优口岸(自定义路由)

终极目标

  • 高效:通过连接复用和池化提升吞吐
  • 稳定:多线程安全+空闲连接清理保障可靠性
  • 安全:SSL定制化防止数据泄露
  • 灵活:代理配置适应复杂网络环境
posted @ 2025-07-24 10:30  hqq的进阶日记  阅读(27)  评论(0)    收藏  举报