Nacos源码环境搭建与调试指南
# 写在文章开头
近期因为个人需要,需要搭建一套nacos源码环境来调测了解如下3个模块的工作机制:
- 服务启动时注册至
nacos。 nacos服务端处理下线请求。nacos服务消费者负载均衡算法。
本质个人技术驱动,遂以此文作为nacos系列的第一篇文章,记录一下笔者搭建nacos源码调试环境的步骤。
我是 SharkChili ,Java 开发者,Java Guide 开源项目维护者。欢迎关注我的公众号:写代码的SharkChili,也欢迎您了解我的开源项目 mini-redis:https://github.com/shark-ctrl/mini-redis (opens new window)。
为方便与读者交流,现已创建读者群。关注上方公众号获取我的联系方式,添加时备注加群即可加入。
# 详解源码环境搭建步骤
# 拉取指定版本nacos源码
因为笔者使用的nacos源码版本为2.3.2,所以到GitHub拉取时通过--branch指定tag为2.3.2,对应的指令如下所示,读者可以按需调整版本拉取源码:
git clone --branch 2.3.0 git@github.com:alibaba/nacos.git
由此我们就可从github上拿到2.3.2版本的nacos的完整代码:

# 依赖加载并完成编译与数据库配置
在完成必要的maven依赖加载之后,由于nacos需要通过maven插件生成特定的代码,否者就可以出现下图所示的异常:

所以我们需要通过IDEA的maven插件进行编译,让nacos中的特定插件运行生成所需要代码:

等待片刻后,如果输出编译成功则说明我们的项目基本初始化完成了:

# 配置数据库
因为笔者是通过MySQL来统一存储nacos的管理信息,所以笔者专门创建了一个名为nacos的数据库,然后将distribution模块下的mysql-schema.sql中的初始化数据刷到数据库中:

刷完脚本之后,对应的数据库就会有如下几张数据表:

最后将console模块下的application.properties配置为上述的数据库连接:

以笔者为例,因为数据库配置在本地且名为nacos,所以对应的配置如下:
## Count of DB:
db.num=1
## Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos
db.user=xxxxxx
db.password=xxxxxxx
2
3
4
5
6
7
# 设置单机模式并启动测试
默认情况下nacos是采用集群模式的方式运行,因为笔者需要单机模式运行,所以需要通过JVM参数指定运行模式为单机模式:
-Dnacos.standalone=true
对应的配置截图示例如下所示:

此时我们通过Nacos将其启动,如果可以正常进入nacos访问页面则说明本次配置成功:

# 服务提供者和服务消费者
# 调测架构说明
本质上nacos是作为服务注册中心和服务配置中心,本系列文章将会针对服务注册和服务配置的工作原理展开探讨,所以我们需要搭建一套具备如下条件的调测环境:
- 一个单机模式的
nacos作为服务注册中心和配置中心(本系列更多强调是服务注册中心)。 - 两个服务提供者
nacos-provider分别对应9001和9002端口提供负载均衡的服务调用。 - 一个服务消费者
nacos-consumer对应8080端口通过nacos感知nacos-provider信息发起服务调用。
对应的逻辑架构图如下所示:

# 服务提供者环境搭建
# 依赖配置
先来搭建服务提供者,结合版本兼容性我们首先给出对应SCA、Spring Boot以及JDK等版本信息:
<properties>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<lombok.version>1.18.30</lombok.version>
<spring-cloud.version>2021.0.5</spring-cloud.version>
<spring-cloud-alibaba.verison>2021.0.5.0</spring-cloud-alibaba.verison>
<spring-boot.version>2.7.6</spring-boot.version>
</properties>
2
3
4
5
6
7
8
9
基于上述的版本,我们引入如下依赖,可以看到笔者的配置有如下处理:
- 使用
spring loadbalancer作为负载均衡器,弃用已停止维护的ribbon。 nacos作为服务注册和配置中心。openfeign作为服务调用。
<!-- nacos服务注册 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!-- 使用Loadbalancer作为负载均衡器,弃用已停止维护的ribbon -->
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- nacos配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--No spring.config.import set-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--负载均衡器loadbalancer 替换ribbon使用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<!-- openfeign作为服务调用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>10.10.1</version>
</dependency>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 启用服务发现
对应的我们在服务提供者的启动类上注明EnableDiscoveryClient开启服务发现:
@SpringBootApplication
@EnableDiscoveryClient//启用服务发现
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
2
3
4
5
6
7
8
9
# 指明注册中心
随后我们在application.properties然指明服务名称为nacos-provider,并通过spring.cloud.nacos.discovery.server-addr
# 指定服务名称为
spring.application.name=nacos-provider
# 指定nacos地址用于服务注册和服务发现
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
2
3
4
5
# 编写测试接口
作为服务提供者,我们可以先写一个简单的测试接口provide,返回当前服务提供者的服务名和端口号,便于服务消费者观测当前调用到哪个服务上:
@Autowired
private Environment env;
@GetMapping("/provide")
public String provide() {
Map<String, String> map = new HashMap<>();
//服务名称
map.put("provider", env.getProperty("spring.application.name"));
//服务端口号,用于后续调用时查看结果使用
map.put("port", env.getProperty("server.port"));
return JSONUtil.toJsonStr(map);
}
2
3
4
5
6
7
8
9
10
11
12
13
# 基于不同端口号启动服务提供者
完成基本服务配置之后,我们就要通过不同端口启动服务提供者,首先点击services启动服务配置项:

然后点击add service添加服务:

然后我们通过JVM参数-Dserver.port=9001指明服务1的端口号为9001:

完成后将服务启动键入curl 127.0.0.1:9001/provide进行连通性测试,如果输出结果如下则说明服务提供者的接口是可用的:
{"provider":"nacos-provider","port":"9001"}
同理服务2配置为9002启动:

# 小结
自此我们完成nacos源码环境的搭建,后续笔者会针对nacos服务注册、服务发现等核心流程进行详尽的源码分析,希望对你有帮助。
我是 SharkChili ,Java 开发者,Java Guide 开源项目维护者。欢迎关注我的公众号:写代码的SharkChili,也欢迎您了解我的开源项目 mini-redis:https://github.com/shark-ctrl/mini-redis (opens new window)。
为方便与读者交流,现已创建读者群。关注上方公众号获取我的联系方式,添加时备注加群即可加入。
# 参考
nacos源码分析-环境搭建 :https://blog.csdn.net/weixin_41314389/article/details/143571552 (opens new window)
如何使用nacos服务注册和发现 :https://www.cnblogs.com/zhumengke/articles/11845468.html (opens new window)
解决通过@FeignClient自动注入service失败的问题 :https://blog.csdn.net/pk694046220/article/details/105060307https://blog.csdn.net/pk694046220/article/details/105060307 (opens new window)
idea实现同时启动两个相同服务但不同端口的项目,全图解 :https://blog.csdn.net/qq_57581439/article/details/130037264 (opens new window)