关于nacos:Nacos-客户端心跳续约及客户端总结

55次阅读

共计 2426 个字符,预计需要花费 7 分钟才能阅读完成。

Nacos – 客户端注册中提到了心跳续约。

public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {String groupedServiceName = NamingUtils.getGroupedName(serviceName, groupName);
    if (instance.isEphemeral()) {
        // 封装心跳信息
        BeatInfo beatInfo = beatReactor.buildBeatInfo(groupedServiceName, instance);
        // 开启定时工作续约
        beatReactor.addBeatInfo(groupedServiceName, beatInfo);
    }
    serverProxy.registerService(groupedServiceName, groupName, instance);
}

BeatReactor#addBeatInfo

把心跳工作放入线程池。

public void addBeatInfo(String serviceName, BeatInfo beatInfo) {NAMING_LOGGER.info("[BEAT] adding beat: {} to beat map.", beatInfo);
    String key = buildKey(serviceName, beatInfo.getIp(), beatInfo.getPort());
    BeatInfo existBeat = null;
    //fix #1733
    // 移除旧的 BeatInfo
    if ((existBeat = dom2Beat.remove(key)) != null) {existBeat.setStopped(true);
    }
    // 存入 dom2Beat
    dom2Beat.put(key, beatInfo);
    // 开启定时工作
    executorService.schedule(new BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS);
    MetricsMonitor.getDom2BeatSizeMonitor().set(dom2Beat.size());
}

BeatReactor.BeatTask#run

向服务器发送心跳,如果没有心跳信息,则从新注册。

public void run() {if (beatInfo.isStopped()) {return;}
        long nextTime = beatInfo.getPeriod();
        try {
            // 向服务器发送心跳
            JsonNode result = serverProxy.sendBeat(beatInfo, BeatReactor.this.lightBeatEnabled);
            // 获取下一次发送的间隔时间
            long interval = result.get("clientBeatInterval").asLong();
            boolean lightBeatEnabled = false;
            if (result.has(CommonParams.LIGHT_BEAT_ENABLED)) {lightBeatEnabled = result.get(CommonParams.LIGHT_BEAT_ENABLED).asBoolean();}
            BeatReactor.this.lightBeatEnabled = lightBeatEnabled;
            if (interval > 0) {nextTime = interval;}
            int code = NamingResponseCode.OK;
            if (result.has(CommonParams.CODE)) {code = result.get(CommonParams.CODE).asInt();}
            // 发现没有心跳信息,则从新注册
            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 ex) {NAMING_LOGGER.error("[CLIENT-BEAT] failed to send beat: {}, code: {}, msg: {}",
                    JacksonUtils.toJson(beatInfo), ex.getErrCode(), ex.getErrMsg());
            
        }
        executorService.schedule(new BeatTask(beatInfo), nextTime, TimeUnit.MILLISECONDS);
    }

客户端总结

正文完
 0