Sentinel教程进阶七setToServer()

    public static boolean setToServer() {
        if (mode == 1) {
            return true;
        } else {
            mode = 1;
            sleepIfNeeded();
            lastModified = TimeUtil.currentTimeMillis();
			//启动server
            return startServer();
        }
    }
    private static boolean startServer() {
        try {
            ClusterTokenClient tokenClient = TokenClientProvider.getClient();
            if (tokenClient != null) {
                tokenClient.stop();
            }
			//获取server并启动
            EmbeddedClusterTokenServer server = EmbeddedClusterTokenServerProvider.getServer();
            if (server != null) {
                //启动server(实际上是启动一个netty server)
                server.start();
                RecordLog.info("[ClusterStateManager] Changing cluster mode to server", new Object[0]);
                return true;
            } else {
                RecordLog.warn("[ClusterStateManager] Cannot change to server (no server SPI found)", new Object[0]);
                return false;
            }
        } catch (Exception var2) {
            RecordLog.warn("[ClusterStateManager] Error when changing cluster mode to server", var2);
            return false;
        }
    }
public final class EmbeddedClusterTokenServerProvider {
    private static EmbeddedClusterTokenServer server = null;

    static {
        //类加载的时候加载spiEmbeddedClusterTokenServer
        resolveInstance();
    }
    
    private static void resolveInstance() {
        EmbeddedClusterTokenServer s = (EmbeddedClusterTokenServer)SpiLoader.of(EmbeddedClusterTokenServer.class).loadFirstInstance();
        if (s == null) {
            RecordLog.warn("[EmbeddedClusterTokenServerProvider] No existing cluster token server, cluster server mode will not be activated", new Object[0]);
        } else {
            server = s;
            RecordLog.info("[EmbeddedClusterTokenServerProvider] Cluster token server resolved: {}", new Object[]{server.getClass().getCanonicalName()});
        }

    }
    //返回server
    public static EmbeddedClusterTokenServer getServer() {
        return server;
    }
}

img

com.alibaba.csp.sentinel.cluster.server.DefaultEmbeddedTokenServer

DefaultEmbeddedTokenServer#

public class DefaultEmbeddedTokenServer implements EmbeddedClusterTokenServer {
    private final TokenService tokenService = TokenServiceProvider.getService();
    private final ClusterTokenServer server = new SentinelDefaultTokenServer(true);

    public DefaultEmbeddedTokenServer() {
    }

    public void start() throws Exception {
        this.server.start();
    }

    public void stop() throws Exception {
        this.server.stop();
    }

    public TokenResult requestToken(Long ruleId, int acquireCount, boolean prioritized) {
        return this.tokenService != null ? this.tokenService.requestToken(ruleId, acquireCount, prioritized) : new TokenResult(-1);
    }

    public TokenResult requestParamToken(Long ruleId, int acquireCount, Collection<Object> params) {
        return this.tokenService != null ? this.tokenService.requestParamToken(ruleId, acquireCount, params) : new TokenResult(-1);
    }

    public TokenResult requestConcurrentToken(String clientAddress, Long ruleId, int acquireCount) {
        return null;
    }

    public void releaseConcurrentToken(Long tokenId) {
    }
}

SentinelDefaultTokenServer#

    public SentinelDefaultTokenServer() {
        this(false);
    }

    public SentinelDefaultTokenServer(boolean embedded) {
        this.shouldStart = new AtomicBoolean(false);
        this.embedded = embedded;
        //ClusterServerConfigManager添加监听
        ClusterServerConfigManager.addTransportConfigChangeObserver(new ServerTransportConfigObserver() {
            public void onTransportConfigChange(ServerTransportConfig config) {
                SentinelDefaultTokenServer.this.changeServerConfig(config);
            }
        });
        //初始化server
        this.initNewServer();
    }

    private void initNewServer() {
        if (this.server == null) {
            int port = ClusterServerConfigManager.getPort();
            if (port > 0) {
                //server为一个netty server
                this.server = new NettyTransportServer(port);
                this.port = port;
            }

        }
    }

作者:roylee666

出处:https://www.cnblogs.com/roylee666/p/15847425.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   树先生1024  阅读(123)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示