Sentinel教程進階四ClusterStateManager
阿新 • • 發佈:2022-01-26
當我們設定token-server或token-client時,sentinel-dashboard第一步就會呼叫api: /setClusterMode
public static void applyState(Integer state) {
stateProperty.updateValue(state);
}
從上圖我們看出,收到請求後的主要邏輯在ClusterStateManager.applyState(mode)中,因此我們要了解ClusterStateManager。
ClusterStateManager
該類主要負責管理叢集的狀態,我們看一下它的屬性
private static volatile SentinelProperty<Integer> stateProperty = new DynamicSentinelProperty();
private static final PropertyListener<Integer> PROPERTY_LISTENER = new ClusterStateManager.ClusterStatePropertyListener();
- stateProperty:型別為DynamicSentinelProperty
- PROPERTY_LISTENER:型別為ClusterStatePropertyListener
ClusterStateManager中的靜態方法會將PROPERTY_LISTENER註冊到stateProperty中
static {
InitExecutor.doInit();
stateProperty.addListener(PROPERTY_LISTENER);
}
ClusterStatePropertyListener
PropertyListener的實現類
private static class ClusterStatePropertyListener implements PropertyListener<Integer> { private ClusterStatePropertyListener() { } public synchronized void configLoad(Integer value) { ClusterStateManager.applyStateInternal(value); } public synchronized void configUpdate(Integer value) { ClusterStateManager.applyStateInternal(value); } }
當觸發configLoad或configUpdate方法後都會執行ClusterStateManager.applyStateInternal(value);
applyStateInternal的邏輯:
-
state=0:啟動叢集client,setToClient()
-
state=1:啟動叢集server,setToServer()
-
state=-1:停止叢集client和叢集server,setStop()
private static boolean applyStateInternal(Integer state) {
if (state != null && state >= -1) {
if (state == mode) {
return true;
} else {
try {
switch(state) {
case -1:
setStop();
return true;
case 0:
return setToClient();
case 1:
return setToServer();
default:
RecordLog.warn("[ClusterStateManager] Ignoring unknown cluster state: " + state, new Object[0]);
return false;
}
} catch (Throwable var2) {
RecordLog.warn("[ClusterStateManager] Fatal error when applying state: " + state, var2);
return false;
}
}
} else {
return false;
}
}