Appearance
Hello Nacos
1. Nacos Server 搭建
1.1. 下载并解压
访问 Nacos 官网或 GitHub 发布页面下载最新稳定版本的二进制包。
下载命令示例:
Bash
sudo wget https://github.com/alibaba/nacos/releases/download/2.5.0/nacos-server-2.5.0.tar.gz将下载的压缩包解压到指定目录,例如 /usr/local/nacos:
Bash
sudo tar -zxvf nacos-server-2.5.0.tar.gz -C /usr/local/Bash
cd /usr/local/nacos解压后,目录结构如下:
bin/:启动脚本conf/:配置文件target/:运行时文件
1.2. 配置 Nacos
Nacos 默认使用嵌入式数据库(Derby),适合测试环境。如果需要生产环境,建议配置 MySQL 数据库。
单机模式(默认,无需额外配置)
直接使用默认配置即可,配置文件位于
conf/application.properties。配置 MySQL(可选,生产推荐)
创建数据库:
在 MySQL 中创建一个数据库,例如
nacos_config,执行 Nacos 提供的 SQL 脚本(位于conf/nacos-mysql.sql):Bashmysql -u root -p nacos_config < conf/nacos-mysql.sql修改配置文件:
编辑
conf/application.properties,添加 MySQL 配置:Propertiesspring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=password
Nacos 控制台默认路径为 http://localhost:8848/nacos。
1.3. 启动/停止 Nacos 服务
进入 bin 目录,执行启动脚本:
Bash
cd /usr/local/nacos/bin && \
sudo -E bash startup.sh -m standalone-m standalone表示单机模式运行;- 若集群模式,需配置
conf/cluster.conf并启动多个实例;
启动成功后,日志会输出在 logs/start.out,你会看到类似 Nacos started successfully 的提示。
如果需要停止服务,执行:
Bash
sudo bash shutdown.sh2. Maven 依赖管理
XML
<properties>
<spring-boot.version>2.7.6</spring-boot.version>
<spring-cloud.version>2021.0.8</spring-cloud.version>
<spring-alibaba-cloud.version>2021.0.6.0</spring-alibaba-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot Dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba Dependencies -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-alibaba-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>3. 服务治理
3.1. Client 服务注册
在客户端项目中引入依赖:
XML<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 非必须,服务消费者需引入本依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>编写
application.yml:YAMLserver: port: 8081 spring: application: name: ProviderService cloud: nacos: discovery: server-addr: localhost:8848 # Nacos Server 地址 ip: localhost # 本服务的 IP 地址 cluster-name: FJ # 服务集群名称 loadbalancer: # 非必须,服务消费者配置 nacos: enabled: true # 启用 Nacos 集群感知负载均衡测试同一服务注册多个实例:
在 Idea 中将目标服务的 Run/Debug 配置文件复制一份出来后,添加 Java VM 选项
-Dserver.port=8091(需与原服务端口号不同),再 Run/Debug 该配置文件即可。
3.2. Client 服务发现
客户端项目依赖参考 Client 服务注册;
编写
application.yml:YAMLserver: port: 8082 spring: application: name: ConsumerService cloud: nacos: discovery: server-addr: localhost:8848 # Nacos Server 地址 ip: localhost # 本服务的 IP 地址 cluster-name: FJ # 服务集群名称 loadbalancer: nacos: enabled: true # 启用 Nacos 集群感知负载均衡为
RestTemplate添加@LoadBalance注解:Java@Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); }1
2
3
4
5将请求的 URL 主机名和端口号改为服务名称:
修改前 JavarestTemplate.getForObject("http://localhost:8081/request-path", ResponseVO.class)修改后 JavarestTemplate.getForObject("http://ProviderService/request-path", ResponseVO.class)
3.3. 服务集群
Nacos 支持服务集群,集群名称由 spring.cloud.nacos.discovery.cluster-name 指定。
要启用集群感知:
Ribbon
YAMLProviderService: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRuleSpring Cloud LoadBalancer
YAMLspring: cloud: loadbalancer: nacos: enabled: true
启用 Nacos 集群感知后:
- 首选本地集群,减少跨集群调用延迟;
- 本地集群内随机负载均衡;
- 本地不可用时,回退到其他集群,并记录警告日志。
3.4. 实例权重
实例权重(Weight)是一个浮点数值(范围通常为 0 到 10 或更高),表示某个实例在负载均衡中的优先级或处理能力。权重越高,该实例被客户端选中的概率越大。
使用场景:
- 流量分配:当多个实例提供相同服务,但性能或负载能力不同时,可以通过权重调整流量分布;
- 灰度发布:将新版本实例设置为较低权重,逐步增加流量以验证稳定性;
- 故障隔离:将不健康的实例权重设为 0,暂停其接收流量;
推荐通过 Nacos 控制台配置实例权重:
- 登录 Nacos 控制台,进入 “服务管理” -> “服务列表”;
- 选择某个服务,点击 “实例列表”;
- 编辑实例的 “权重” 字段,保存后生效;
注意事项:
- 权重为 0 的实例不会被选中,但仍保留在服务列表中;
- 需要客户端支持权重感知(例如 Nacos 自带的
NacosRule或自定义负载均衡策略);
3.5. 环境隔离
Nacos 通过 Namespace 和 Group 实现服务的环境隔离和逻辑分组,帮助管理不同环境或业务线的服务实例和配置。
3.5.1. Namespace
Namespace 是 Nacos 的顶级隔离单位,用于区分不同的环境(如开发、测试、生产)或租户。每个 Namespace 有唯一的 ID 和名称,服务实例和配置在不同 Namespace 之间完全隔离。
使用场景:
- 多环境管理:开发环境(Dev)、测试环境(Test)、生产环境(Prod)使用不同的 Namespace;
- 多租户隔离:不同团队或客户使用独立的 Namespace;
配置步骤:
创建 Namespace
在 Nacos 控制台的 “命名空间” 页面,点击 “新建命名空间”,输入名称和 ID(例如
dev、prod)。默认 Namespace 是public(ID 为空)。服务注册时指定 Namespace
在服务配置文件中指定:
YAMLspring: cloud: nacos: discovery: server-addr: localhost:8848 namespace: ed355476-836f-4127-b31b-5f4777197dc3 # Namespace ID
3.5.2. Group
Group 是 Namespace 下的次级隔离单位,用于对服务或配置进行逻辑分组。一个 Namespace 内可以有多个 Group,同一个 Group 内的服务通常具有某种业务关联性。
使用场景:
- 业务模块划分:在一个环境(Namespace)中,将服务按业务模块分组,例如
OrderGroup、UserGroup; - 版本管理:区分同一服务的不同版本,例如
v1和v2;
配置步骤:
服务注册时指定 Group
YAMLspring: cloud: nacos: discovery: server-addr: localhost:8848 namespace: ed355476-836f-4127-b31b-5f4777197dc3 group: OrderGroup # 指定 Group通过控制台查看
在服务列表中,Group 会在服务名前显示,例如
OrderGroup::ProviderService。客户端调用
客户端需要指定 Group 来访问特定分组的服务,例如:
JavaDiscoveryClient discoveryClient = ...; List<ServiceInstance> instances = discoveryClient.getInstances("OrderGroup::ProviderService");
3.5.3. Namespace 与 Group 的关系
- 层级:Namespace > Group > 服务名;
- 隔离性:
- Namespace 提供物理隔离(不同 Namespace 的服务完全不可见);
- Group 提供逻辑隔离(同一 Namespace 内可见,但需要显式指定 Group);
3.6. 临时实例与非临时实例
Nacos 支持两种实例注册模式:
临时实例:服务启动后,客户端每 5 秒发送心跳到 Nacos。如果心跳停止(例如服务宕机),Nacos 在 15 秒后(默认配置)将其标记为不健康,30 秒后移除。
非临时实例:服务注册后,Nacos 服务会主动询问客户端是否存活。即使客户端停止,仍保留在 Nacos 服务列表中。需要手动通过 API 或控制台删除。
非临时实例配置:
YAML
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
ephemeral: false # 设置为非临时实例3.7. 负载均衡实现原理
参考 Eureka 负载均衡实现原。
3.8. 与 Eureka 的区别
除上述列举的 Nacos 特性外,Nacos 与 Eureka 还存在以下关键区别:
- Nacos 支持服务列表变更的消息推送模式,服务列表更新更及时;
- Nacos 集群默认采用 AP 模式,当集群中存在非临时实例时,采用 CP 模式。Eureka 采用 AP 方式。
4. 配置中心
4.1. 添加 Maven 依赖
在 pom.xml 中添加 Nacos 配置中心的依赖:
XML
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>4.2. 配置 application.yml
配置如下:
YAML
spring:
application:
name: service-name
config:
import:
- nacos:service-name.yaml # Nacos 配置 Data Id
cloud:
nacos:
config:
server-addr: localhost:8848 # Nacos 服务地址如果 Nacos 配置是可选的则可以添加 optional: 前缀,如 optional:nacos:service-name.yaml。
提示
Nacos 配置优先级高于 application.yml。
信息
在 Spring Boot 2.4 之前的版本中需要在 bootstrap.yml 中配置外部配置源,bootstrap.yml 优先于 application.yml 初始化。
从 Spring Boot 2.4 和 Spring Cloud 2020.0.0 开始,移除了对 bootstrap.yml 的自动支持。引入了 Config Data API 以统一和增强配置加载机制。Spring Cloud Alibaba 提供了 NacosConfigDataLoader,实现 Spring Boot 的 ConfigDataLoader 接口。当 spring.config.import 属性包含 nacos: 前缀时,会自动从 Nacos 加载配置。
如需继续使用 bootstrap.yml,需显式引入:
XML
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>4.3. Nacos 控制台创建配置
登录 Nacos 控制台;
点击 “配置管理” -> “配置列表” -> “+” 新建配置;
输入以下信息:
Data ID:
service-name.yaml;Group:默认
DEFAULT_GROUP(可自定义);配置格式:选择
YAML;示例配置内容:
YAMLapp: message: Hello from Nacos!
点击 “发布” 保存;
4.4. 在代码中读取配置
通过
@Value读取配置:Java@RestController @RefreshScope // 支持动态刷新 public class ConfigController { @Value("${app.message}") private String message; @GetMapping("/getMessage") public String getMessage() { return message; } }1
2
3
4
5
6
7
8
9
10
11@RefreshScope注解确保配置变更时,Spring Bean 会动态刷新;@Value用于注入 Nacos 中的配置;
Note:关于
@RefreshScope注解的说明可以参考这篇文章。通过
@ConfigurationProperties读取配置:Java@Data @Component @ConfigurationProperties(prefix = "app") public class AppConfig { private String message; }配置变更时,
@ConfigurationPropertiesBean 会自动刷新。默认情况下 Spring Boot 原生的
@ConfigurationProperties不会自动刷新,但 Spring Cloud Alibaba Nacos 监听到配置变化后,会触发EnvironmentChangeEvent,然后重新绑定@ConfigurationPropertiesBean。刷新时不会创建新的 Bean 实例,而是给原对象的属性重新赋值!