WebLogic Plugin (Apache/IIS/HttpClusterServlet) 的 DynamicServerList 參數控制代理端是否動態感知後端集群成員變化。本文從 HTTP Header 交互、Managed Server 端集群 Hash 變更通知、Plugin 端動態列表更新三個層面,完整還原其內部實現流程。
WebLogicCluster 列表,節點失效會嘗試連接死節點降低性能,新增節點需手動更新配置並重載。關鍵便利性:DynamicServerList=ON時,WebLogicCluster僅需配置**任意一個**集群節點地址即可,Plugin 會自動發現完整列表。
Plugin 轉發請求時,注入內部 Header:
// HttpClusterServlet.addRequestHeaders()
headerOut.print("X_WEBLOGIC_REQUEST_CLUSTERINFO: true");
告知後端:請求來自支持動態列表的 Plugin,請在響應中攜帶集群信息 (若有變更)。
Managed Server 處理完請求,檢查條件:
X_WEBLOGIC_REQUEST_CLUSTERINFO HeaderMembershipControllerImpl.getHash())滿足則在響應頭注入:
// ServletResponseImpl.writeHeaders()
if (currentHash != null && !currentHash.equals(oldHash)) {
String[] servers = MembershipControllerImpl.getInstance().getClusterList(channel);
headers.setHeader("X_WEBLOGIC_CLUSTER_HASH", currentHash);
headers.setHeader("X_WEBLOGIC_CLUSTER_LIST", servers.toString()); // 完整成員列表
}
MembershipControllerImpl 為單例,集群拓撲變更 (成員增減、狀態變化) 即更新 Hash。
Plugin 讀取響應頭,解析動態列表與 Hash:
// HttpClusterServlet.addResponseHeaders()
if (ri.needToUpdateDynamicList() && name.equals(X_WEBLOGIC_CLUSTER_LIST))
ri.setDynamicList(value);
if (ri.needToUpdateDynamicList() && name.equals(X_WEBLOGIC_CLUSTER_HASH))
ri.setDynamicHash(value);
RequestInfo (ri) 為請求級變量,**真正更新發生在請求結束的 finally 塊**:
finally {
String dynamicList = ri.getDynamicList();
if (dynamicList != null) { // 後端發送了新列表
ServerList servers = new ServerList(dynamicList, false);
if (useDynamicList) { // DynamicServerList=ON
servers.setHash(ri.getDynamicHash());
srvrList = servers; // 替換本地服務器列表
servers.addToKnownServersList(allKnownServers);
}
}
}
| 特性 | 實現細節 |
|---|---|
| 增量感知 | 僅當集群 Hash 變化時才下發完整列表,避免每請求傳輸開銷 |
| 請求級緩衝 | RequestInfo 暫存新列表,請求結束原子替換,避免並發競爭 |
| 已知服務器累積 | addToKnownServersList 維護歷史節點,防止臨時網絡抖動導致節點丟失 |
| 靜態回退 | DynamicServerList=OFF 時忽略動態列表,僅用靜態配置 |
極端情況:集群發生網絡分區,節點 A 僅能見到節點 B (C/D 仍運行但網絡不通)。
分區屬於故障狀態,**首要任務修復網絡/集群**,而非依賴靜態列表掩蓋問題。生產環境強烈建議 DynamicServerList=ON。
# httpd.conf (Apache) 或 web.xml (HttpClusterServlet)
WebLogicCluster 10.130.2.41:7021 # 僅需一個種子節點
DynamicServerList ON # 顯式開啟 (默認即 ON)
# DynamicServerList OFF # 僅調試/特殊場景使用
DynamicServerList 通過 請求頭標識 → 響應頭 Hash 比對變更 → 完整列表下發 → 請求結束原子更新 的輕量級協議,實現了 Plugin 端零配置維護的集群感知負載均衡。理解其機制有助於排查節點摘掛延遲、新節點發現失效、集群分區等疑難問題。