首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

WebLogic Plugin DynamicServerList 內部機制深度解析:集群感知負載均衡的核心

     編輯:Java 相關知識

WebLogic Plugin (Apache/IIS/HttpClusterServlet) 的 DynamicServerList 參數控制代理端是否動態感知後端集群成員變化。本文從 HTTP Header 交互、Managed Server 端集群 Hash 變更通知、Plugin 端動態列表更新三個層面,完整還原其內部實現流程。

DynamicServerList 作用與默認行為

  • ON (默認):Plugin 實時獲取集群成員列表 (新增/下線/啟動/關閉),負載均衡避開失效節點,無需重啟 Plugin。
  • OFF:僅使用靜態 WebLogicCluster 列表,節點失效會嘗試連接死節點降低性能,新增節點需手動更新配置並重載。
關鍵便利性:DynamicServerList=ON 時,WebLogicCluster 僅需配置**任意一個**集群節點地址即可,Plugin 會自動發現完整列表。

三階段交互流程

階段 1:Plugin → Managed Server (請求頭標識)

Plugin 轉發請求時,注入內部 Header:

// HttpClusterServlet.addRequestHeaders()
headerOut.print("X_WEBLOGIC_REQUEST_CLUSTERINFO: true");
告知後端:請求來自支持動態列表的 Plugin,請在響應中攜帶集群信息 (若有變更)。

階段 2:Managed Server → Plugin (響應頭通知變更)

Managed Server 處理完請求,檢查條件:

  1. 自身屬於某集群
  2. 請求含 X_WEBLOGIC_REQUEST_CLUSTERINFO Header
  3. **集群 Hash 發生變化** (對比請求攜帶的 Hash 與當前 MembershipControllerImpl.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。

階段 3:Plugin 端解析並更新本地列表

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 時忽略動態列表,僅用靜態配置

集群分區 (Partition) 場景下的靜態列表優勢

極端情況:集群發生網絡分區,節點 A 僅能見到節點 B (C/D 仍運行但網絡不通)。

  • 動態列表:A 返回 {A,B} → Plugin 僅在 A/B 分發 → C/D 雖存活但無流量。
  • 靜態列表:Plugin 仍在 {A,B,C,D} 輪詢 → C/D 繼續收到請求 (若客戶端能達到)。
分區屬於故障狀態,**首要任務修復網絡/集群**,而非依賴靜態列表掩蓋問題。生產環境強烈建議 DynamicServerList=ON。

配置最佳實踐

# httpd.conf (Apache) 或 web.xml (HttpClusterServlet)
WebLogicCluster 10.130.2.41:7021          # 僅需一個種子節點
DynamicServerList ON                      # 顯式開啟 (默認即 ON)
# DynamicServerList OFF                   # 僅調試/特殊場景使用

總結

DynamicServerList 通過 請求頭標識 → 響應頭 Hash 比對變更 → 完整列表下發 → 請求結束原子更新 的輕量級協議,實現了 Plugin 端零配置維護的集群感知負載均衡。理解其機制有助於排查節點摘掛延遲、新節點發現失效、集群分區等疑難問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved