![a3feb73f904c45fe42216e20902a99e7.png](https://i-blog.csdnimg.cn/blog_migrate/5b997c03e769184aa74e814948db78cd.png)
在看这篇文章之前,最好对NACOS相关功能有所了解,推荐看完Spring Cloud Alibaba Nacos(功能篇)。
针对功能,有目的的去找相对应的源代码,进一步了解功能是如何被实现出来的。
本文针对有一定源代码阅读经验的人群,不会深入太多的细节,还需要读者打开源码跟踪,自行领会。
一、引子
进入GitHub对应的页面,将NACOS工程clone下来。目录和文件看起来很冗长,但是对于看源代码真正有帮助的部分并不多。
![c1b6aa12cafc9648bf2c136acd63cab4.png](https://i-blog.csdnimg.cn/blog_migrate/01259e4e759d243447b961c2a8e713b8.jpeg)
![5efb15d9963f494dd066fd38ade57156.png](https://i-blog.csdnimg.cn/blog_migrate/ee9f2dff241a38ab8b61e15591dc9609.jpeg)
![461be25552b50dc4f60328d77afec8b0.png](https://i-blog.csdnimg.cn/blog_migrate/52cd075d0dbb0f0e6853784d06bf7336.jpeg)
有了这三张图,就能顺利找到突破口了,核心内容就集中在nacos-console,nacos-naming,nacos-config,顺藤摸瓜,就能看到不少内容了。
如果还是感觉无从下手的话,那就移步nacos-example,里面有主要业务的调用入口,一看便知。
二、配置服务
首先从一个工厂类说起:com.alibaba.nacos.api.NacosFactory。
里面的静态方法用于创建ConfigService和NamingService,代码类似,以创建ConfigService为例:
public static ConfigService createConfigService(Properties properties) throws NacosException {
try {
Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.config.NacosConfigService");
Constructor constructor = driverImplClass.getConstructor(Properties.class);
ConfigService vendorImpl = (ConfigService) constructor.newInstance(properties);
return vendorImpl;
} catch (Throwable e) {
throw new NacosException(-400, e.getMessage());
}
}
没有什么复杂的逻辑,使用的是基本的反射原理。构造参数传入了properties,这些属性可以通过bootstrap.yml中指定,对应的是NacosConfigProperties。
需要细看的是构造函数中对于namespace初始化的那部分内容。
private void initNamespace(Properties properties) {
String namespaceTmp = null;
String isUseCloudNamespaceParsing =
properties.getProperty(PropertyKeyConst.IS_USE_CLOUD_NAMESPACE_PARSING,
System.getProperty(SystemPropertyKeyConst.IS_USE_CLOUD_NAMESPACE_PARSING,
String.valueOf(Constants.DEFAULT_USE_CLOUD_NAMESPACE_PARSING)));
if (Boolean.valueOf(isUseCloudNamespaceParsing)) {
namespaceTmp = TemplateUtils.stringBlankAndThenExecute(namespaceTmp, new Callable<String>() {
@Override
public String call() {
return TenantUtil.getUserTenantForAcm();
}
});
namespaceTmp = TemplateUtils.stringBlankAndThenExecute(namespaceTmp, new Callable<String>() {
@Override
public String call() {
String namespace = System.getenv(PropertyKeyConst.SystemEnv.ALIBABA_ALIWARE_NAMESPACE);