Loading

Sentinel教程进阶四ClusterStateManager

当我们设置token-server或token-client时,sentinel-dashboard第一步就会调用api: /setClusterMode

img

    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;
        }
    }
posted @ 2022-01-26 17:11  树先生1024  阅读(123)  评论(0编辑  收藏  举报