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
,其提示如下图所示
那应用是跟踪哪个类?
这里,我提供两种方法。
- 代码分析法,如果有多个实现类,肯定在前面的某个步骤会去创建该类,因为这个类不会无缘无故的就产生的。计算机的程序代码是很规范的,你要他怎么做,他才怎么做,不会无故产生,俗话说事出反常必有妖。
- 断点调试法,这个方法简单粗暴,只要你debug一下,跟着debug进去,到哪个类处理,那就是哪个类处理。
我们还是倒回来看下,通过代码分析具体一下。还记得上面说的创建NamingService
吗,这里我们进去看下这个NamingService
的具体的实现方法NacosNamingService
的构造方法。
public NacosNamingService(Properties properties) throws NacosException {
init(properties);
}
private void init(Properties properties) throws NacosException