Apache HttpClient 4.5.x 學習總結九:HTTP連接管理
精簡翻譯:
2.1 連接持久化
? 核心價值:復用TCP連接減少握手開銷(尤其對小報文)
? 實現(xiàn)方式:
- HTTP/1.1 默認支持連接復用
- HTTP/1.0 通過
Keep-Alive頭顯式聲明
2.2 連接路由
?? 三種路由類型:
- 普通路由:直連目標或單代理
- 隧道路由:通過代理鏈連接目標(如
Proxy1 → Proxy2 → Server) - 分層路由:在現(xiàn)有連接上疊加協(xié)議(如HTTP over SSL)
2.3 連接管理器
?? 核心作用:線程安全地管理連接生命周期
| 管理器類型 | 特點 |
|---|---|
BasicHttpClientConnectionManager |
單連接,僅限單線程使用(適合EJB容器) |
PoolingHttpClientConnectionManager |
連接池,支持多線程(默認推薦) |
連接池配置示例:
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(200); // 全局最大連接數(shù)
cm.setDefaultMaxPerRoute(20); // 單路由默認連接數(shù)
cm.setMaxPerRoute(new HttpRoute(localhost), 50); // 特定路由連接數(shù)
2.4 多線程執(zhí)行
?? 關鍵約束:
- 連接請求阻塞時,通過
http.conn-manager.timeout設置超時 - 每個線程應使用獨立
HttpContext
2.5 空閑連接清理
?? 兩種清理策略:
closeExpiredConnections():關閉過期連接closeIdleConnections(30, SECONDS):關閉空閑超30秒連接
?? 實現(xiàn)方式:專用監(jiān)控線程定期執(zhí)行清理
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定制化
?? 安全套接字工廠:
// 創(chuàng)建自定義SSL工廠
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(myTrustStore).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
// 注冊協(xié)議
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)); - 系統(tǒng)默認代理:
SystemDefaultRoutePlanner planner = new SystemDefaultRoutePlanner(ProxySelector.getDefault()); - 完全自定義路由:
HttpRoutePlanner planner = (target, request, context) -> new HttpRoute(target, null, new HttpHost("proxy", 8080), true);
核心知識點提煉:
| 主題 | 技術要點 |
|---|---|
| 連接復用 | 減少TCP握手開銷,提升吞吐量(尤其高頻小請求場景) |
| 路由分層 | 普通路由/隧道路由/分層路由滿足不同代理場景 |
| 連接池管理 | 線程池化實現(xiàn)高并發(fā),需設置MaxTotal(全局)和MaxPerRoute(單路由)連接數(shù)上限 |
| 多線程安全 | 每個線程使用獨立HttpContext,連接請求需設超時避免永久阻塞 |
| 空閑連接清理 | 監(jiān)控線程定期清理過期/空閑連接,防止"僵尸連接" |
| SSL定制化 | 通過SSLContext加載密鑰庫,SSLConnectionSocketFactory實現(xiàn)協(xié)議層安全定制 |
| 主機名驗證 | DefaultHostnameVerifier(RFC合規(guī)) vs NoopHostnameVerifier(關閉驗證) |
| 代理配置 | 支持固定代理、系統(tǒng)代理、完全自定義路由三種模式 |
通俗解釋:
場景類比:物流公司運營
-
連接復用 = 貨車往返帶貨
- 首次送貨需辦手續(xù)(TCP握手)
- 返程捎回新貨物(復用連接)→ 省時增效
-
連接池 = 貨車調(diào)度中心
- 中心有200輛車(
setMaxTotal(200)) - 往上海方向最多發(fā)50輛(
setMaxPerRoute("上海",50)) - 無車可用時司機排隊(阻塞),超時則報錯(
ConnectionPoolTimeoutException)
- 中心有200輛車(
-
空閑連接清理 = 車輛回收機制
- 監(jiān)控員定時檢查:
- 報廢過期車輛(
closeExpiredConnections()) - 召回閑置30分鐘車輛(
closeIdleConnections(30, MINUTES))
- 報廢過期車輛(
- 監(jiān)控員定時檢查:
-
SSL定制化 = 特種運輸車隊
- 定制防彈貨車(
SSLContext加載密鑰庫) - 每輛車配備驗貨員(
HostnameVerifier檢查目的地真實性)
- 定制防彈貨車(
-
代理配置 = 中轉(zhuǎn)站規(guī)則
- 固定中轉(zhuǎn)站:所有貨物經(jīng)深圳口岸(固定代理)
- 智能調(diào)度:根據(jù)貨物類型選最優(yōu)口岸(自定義路由)
終極目標:
- 高效:通過連接復用和池化提升吞吐
- 穩(wěn)定:多線程安全+空閑連接清理保障可靠性
- 安全:SSL定制化防止數(shù)據(jù)泄露
- 靈活:代理配置適應復雜網(wǎng)絡環(huán)境
浙公網(wǎng)安備 33010602011771號