Nacos 注册服务源码分析

Nacos 注册服务分析

分析源码,首先我们得找到入口。在源码入口,我们可以看到一个叫nacos-example的工程,看命名我们就能知道这个是一个样例工程,就是为了方便我们快速入手的。在这个工程中有三个启动测试类,这里我们找到我们关注点NamingExample。在这个main方法中,我们查看关键的两行代码

// 根据NamingFactory创建一个Service服务类
NamingService naming = NamingFactory.createNamingService(properties);
// 通过服务类去注向注册中心注册自己的服务
naming.registerInstance("nacos.test.3", "11.11.11.11", 8888, "TEST1");

我们首先跟踪一下NamingFactory#createNamingService方法,这个方法很简单,就是根据构造方法创建一个NacosNamingService

/**
  * Create a new naming service.
  *
  * @param properties naming service properties
  * @return new naming service
  * @throws NacosException nacos exception
  */
public static NamingService createNamingService(Properties properties) throws NacosException {
    try {
        Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.naming.NacosNamingService");
        Constructor constructor = driverImplClass.getConstructor(Properties.class);
        return (NamingService) constructor.newInstance(properties);
    } catch (Throwable e) {
        throw new NacosException(NacosException.CLIENT_INVALID_PARAM, e);
    }
}

这里有一点要注意,创建一个NacosNamingService,是根据构造方法创建,但是千万不要小看构造方法。如果平时写习惯了spring工程代码,往往直接放容器中托管,不需要操心属性的注入,spring会自动帮忙注入处理,但是在非spring的代码工程中,很多属性都需要自己去创建和处理,而这些一般都是通过静态代码块,或者构造方法来处理的。

接下来从这个里面的注册方法开始分析registerInstance,这个才是我们需要看的重点。

我们找到这个registerInstance的实现方法

@Override
public void registerInstance(String serviceName, String groupName, String ip, int port, String clusterName)
    throws NacosException {
    Instance instance = new Instance();
    instance.setIp(ip);
    instance.setPort(port);
    instance.setWeight(1.0);
    instance.setClusterName(clusterName);
    // 创建了一个Instance,这个Instance,查看它的包名,是com.alibaba.nacos.api.naming.pojo,也就是需要传递属性的一个实体类
    registerInstance(serviceName, groupName, instance);
}

@Override
public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {
    // 检查合法性
    NamingUtils.checkInstanceIsLegal(instance);
    // 通过客户端代理去注册服务
    clientProxy.registerService(serviceName, groupName, instance);
}

当我们准备去跟踪clientProxy.registerService,其提示如下图所示

那应用是跟踪哪个类?

这里,我提供两种方法。

  1. 代码分析法,如果有多个实现类,肯定在前面的某个步骤会去创建该类,因为这个类不会无缘无故的就产生的。计算机的程序代码是很规范的,你要他怎么做,他才怎么做,不会无故产生,俗话说事出反常必有妖。
  2. 断点调试法,这个方法简单粗暴,只要你debug一下,跟着debug进去,到哪个类处理,那就是哪个类处理。

我们还是倒回来看下,通过代码分析具体一下。还记得上面说的创建NamingService吗,这里我们进去看下这个NamingService的具体的实现方法NacosNamingService的构造方法。

public NacosNamingService(Properties properties) throws NacosException {
    init(properties);
}

private void init(Properties properties) throws NacosException 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值