1.下载源码:
git clone git@github.com:alibaba/nacos.git
2.导入源码到idea中
3.打包编译:
mvn -Prelease-nacos clean install -U -Dmaven.test.skip=true
4.开始分析源码
首先找到distribution这个mudule,该module中的start.sh启动文件,找到这一行:
JAVA_OPT="${JAVA_OPT} -Dloader.path=${BASE_DIR}/plugins/health -jar ${BASE_DIR}/target/${SERVER}.jar"
根据上面的定义:
export SERVER="nacos-server"
可以看出,nacos启动的时候是启动的nacos-servce.jar这个jar包。该包在步骤3的编译打包后位于distribution这个module的target下,解压该包,查看MANIFEST.MF文件,看到启动类为Nacos类:
Start-Class: com.alibaba.nacos.Nacos
该类位于console这个module下,入口找到。
5.console这个springboot项目,console本身没有什么核心功能,主要是一些权限相关的内容,console还引入了naming和config项目。
<dependency> <groupId>${project.groupId}</groupId> <artifactId>nacos-config</artifactId> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>nacos-naming</artifactId> </dependency>
并且在console的启动类中:
@SpringBootApplication(scanBasePackages = "com.alibaba.nacos") @ServletComponentScan @EnableScheduling public class Nacos { public static void main(String[] args) { SpringApplication.run(Nacos.class, args); } }
指定了包扫描,因此,工程中所有该包下的@Component类型注解都会描加载。
distribution中的sh脚本启动调用java -jar nacos-server.jar
nacos-server中执行main方法位于console项目中:com.alibaba.nacos.Nacos类。
console项目依赖于naming和config项目;
naming项目依赖于core和api项目;
config项目依赖于core和api项目;
core项目依赖于common项目;
client项目依赖于common项目和client项目;
cmdb项目依赖于core和api项目;
console的Nacos类启动后,会通过包扫描来扫描所有的module相关目录,至此,项目启动。