nacos注册中心之客户端服务注册

举报
周杰伦本人 发表于 2022/05/11 11:10:49 2022/05/11
【摘要】 4 nacos注册中心之客户端服务注册 register()方法 registerInstance()方法: addBeatInfo方法: registerService()方法 总结 4 nacos注册中心之客户端服务注册 register()方法Nacos的服务注册核心方法是NacosServiceRegistry的register方法:public void register(Reg...

4 nacos注册中心之客户端服务注册

register()方法

Nacos的服务注册核心方法是NacosServiceRegistry的register方法:

public void register(Registration registration) {
    if (StringUtils.isEmpty(registration.getServiceId())) {
        log.warn("No service to register for nacos client...");
    } else {
        String serviceId = registration.getServiceId();
        String group = this.nacosDiscoveryProperties.getGroup();
        Instance instance = this.getNacosInstanceFromRegistration(registration);

        try {
            this.namingService.registerInstance(serviceId, group, instance);
            log.info("nacos registry, {} {} {}:{} register finished", new Object[]{group, serviceId, instance.getIp(), instance.getPort()});
        } catch (Exception var6) {
            log.error("nacos registry, {} register failed...{},", new Object[]{serviceId, registration.toString(), var6});
            ReflectionUtils.rethrowRuntimeException(var6);
        }

    }
}

首先判断对应的ServiceId是否为空,不为空的话获取serviceId、group和instance,然后我们在方法中调用Nacos Client 的registerInstance完成服务的注册,下面我们看一下registerInstance()方法的实现

registerInstance()方法:

@Override
public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {

    if (instance.isEphemeral()) {
        BeatInfo beatInfo = new BeatInfo();
        beatInfo.setServiceName(NamingUtils.getGroupedName(serviceName, groupName));
        beatInfo.setIp(instance.getIp());
        beatInfo.setPort(instance.getPort());
        beatInfo.setCluster(instance.getClusterName());
        beatInfo.setWeight(instance.getWeight());
        beatInfo.setMetadata(instance.getMetadata());
        beatInfo.setScheduled(false);
        long instanceInterval = instance.getInstanceHeartBeatInterval();
        beatInfo.setPeriod(instanceInterval == 0 ? DEFAULT_HEART_BEAT_INTERVAL : instanceInterval);

        beatReactor.addBeatInfo(NamingUtils.getGroupedName(serviceName, groupName), beatInfo);
    }

    serverProxy.registerService(NamingUtils.getGroupedName(serviceName, groupName), groupName, instance);
}
  1. 先是创建BeatInfo对象,并填相关的属性信息,BeatInfo是保存着实例心跳的相关信息,包括ip地址、端口号、所在集群、权重信息等

  2. 通过beatReactor.addBeatInfo创建心跳信息实现健康监测,参数有ServiceName、groupName和心跳实例对象,从而确定是哪个服务哪个组下面的实例,Naocs Server必须确保注册的服务实例是健康的,而心跳检测就是服务健康检测的手段

  3. serverProxy.registerService实现服务的注册。

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
    if ((existBeat = dom2Beat.remove(key)) != null) {
        existBeat.setStopped(true);
    }
    dom2Beat.put(key, beatInfo);
    executorService.schedule(new BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS);
    MetricsMonitor.getDom2BeatSizeMonitor().set(dom2Beat.size());
}

所谓心跳机制就是客户端通过schedule方法定时向服务端发送一个数据包,然后启动一个线程不断检测服务端的回应,如果在设定时间内没有收到服务端的回应,则认为服务器发生故障。Nacos服务端根据客户端的心跳包不断更新服务状态。

registerService()方法

接下来就是serverProxy.registerService进行服务的注册,进入方法可以看到其实是一个HTTP协议的POST请求,也就是Nacos提供了Open API来实现服务的注册,SDK进行了封装,这里不贴源码的内容了

总结

让我们总结一下,nacos实现服务的注册是通过调用NacosServiceRegistry的register()方法,方法中获取serviceId和group等信息,构建BeatInfo心跳实例对象,通过线程定时发送BeatInfo心跳信息,从而让服务端时刻知道服务的运行状态是否良好,真正注册的是serverProxy.registerService()进行服务的注册,本质是发送POST请求给nacos服务端。下篇文章我们将分析nacos服务端对服务注册做了哪些操作。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。