Spring Cloud 2.2.2 源码之四十四nacos客户端服务发现任务解析一

Spring Cloud 2.2.2 源码之四十四nacos客户端服务发现任务解析一

服务发现任务图

在这里插入图片描述

NacosWatch

这个就不多说了,SmartLifecycle这个已经很熟悉了吧,调用start,里面开启任务,30秒一次,发送HeartbeatEvent,不过貌似现在没有监听器监听。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

BeatTask心跳任务

服务注册默认是临时结点,所以要有心跳。
在这里插入图片描述
在这里插入图片描述
其实就是发送心跳到/nacos/v1/ns/instance/beat,然后根据返回的信息设置属性,如果是没找到就注册服务。默认第一次是非轻量级的心跳,会发body的,body就是一堆服务信息的url编码的字符串,后面就不需要了,默认间隔5秒。

        @Override
        public void run() {
            if (beatInfo.isStopped()) {
                return;
            }
            long nextTime = beatInfo.getPeriod();
            try {
            	//直接http调用,如果是轻量级的心跳没有body,否则会带body
                JSONObject result = serverProxy.sendBeat(beatInfo, BeatReactor.this.lightBeatEnabled);
                long interval = result.getIntValue("clientBeatInterval");//心跳间隔
                boolean lightBeatEnabled = false;
                //根据服务端发开的是否要进行轻量级心跳进行改变
                if (result.containsKey(CommonParams.LIGHT_BEAT_ENABLED)) {
                    lightBeatEnabled = result.getBooleanValue(CommonParams.LIGHT_BEAT_ENABLED);
                }
                BeatReactor.this.lightBeatEnabled = lightBeatEnabled;
                if (interval > 0) {
                    nextTime = interval;
                }
                int code = NamingResponseCode.OK;
                if (result.containsKey(CommonParams.CODE)) {
                    code = result.getIntValue(CommonParams.CODE);
                }
                //如果不存在,就注册
                if (code == NamingResponseCode.RESOURCE_NOT_FOUND) {
                    Instance instance = new Instance();
                    instance.setPort(beatInfo.getPort());
                    instance.setIp(beatInfo.getIp());
                    instance.setWeight(beatInfo.getWeight());
                    instance.setMetadata(beatInfo.getMetadata());
                    instance.setClusterName(beatInfo.getCluster());
                    instance.setServiceName(beatInfo.getServiceName());
                    instance.setInstanceId(instance.getInstanceId());
                    instance.setEphemeral(true);
                    try {
                        serverProxy.registerService(beatInfo.getServiceName(),
                            NamingUtils.getGroupName(beatInfo.getServiceName()), instance);
                    } catch (Exception ignore) {
                    }
                }
            } catch (NacosException ne) {
                NAMING_LOGGER.error("[CLIENT-BEAT] failed to send beat: {}, code: {}, msg: {}",
                    JSON.toJSONString(beatInfo), ne.getErrCode(), ne.getErrMsg());

            }
            //根据间隔进行下一次调用
            executorService.schedule(new BeatTask(beatInfo), nextTime, TimeUnit.MILLISECONDS);
        }
    

在这里插入图片描述

securityProxy.login(getServerList());安全验证

这个以前说过,就是安全验证的,没用户名密码就直接返回了。

    public boolean login(List<String> servers) {

        try {//没超时直接返回
            if ((System.currentTimeMillis() - lastRefreshTime) < TimeUnit.SECONDS.toMillis(tokenTtl - tokenRefreshWindow)) {
                return true;
            }

            for (String server : servers) {
                if (login(server)) {//登录和计时
                    lastRefreshTime = System.currentTimeMillis();
                    return true;
                }
            }
        } catch (Throwable ignore) {
        }

        return false;
    }

还有其他任务下次讲。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章