1. 程式人生 > 其它 >Sentinel教程進階四ClusterStateManager

Sentinel教程進階四ClusterStateManager

當我們設定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;
        }
    }