Nacos 从入门到实战:一站式注册中心与配置中心详解
-
- [一、Nacos 简介](#一、Nacos 简介)
- [二、Nacos 的安装与启动](#二、Nacos 的安装与启动)
-
- [2.1 版本选择](#2.1 版本选择)
- [2.2 下载 Nacos](#2.2 下载 Nacos)
- [2.3 启动 Nacos](#2.3 启动 Nacos)
- [2.4 服务注册与发现基本原理](#2.4 服务注册与发现基本原理)
- [三、Spring Boot 微服务集成 Nacos 注册中心](#三、Spring Boot 微服务集成 Nacos 注册中心)
-
- [3.1 添加依赖](#3.1 添加依赖)
- [3.2 基础配置](#3.2 基础配置)
- [3.3 服务调用与负载均衡](#3.3 服务调用与负载均衡)
- [四、Nacos 注册中心的高级特性](#四、Nacos 注册中心的高级特性)
-
- [4.1 服务集群与就近访问](#4.1 服务集群与就近访问)
- [4.2 权重配置](#4.2 权重配置)
- [4.3 环境隔离:命名空间(Namespace)和分组(Group)](#4.3 环境隔离:命名空间(Namespace)和分组(Group))
- [4.4 实例类型:临时实例 vs 永久实例](#4.4 实例类型:临时实例 vs 永久实例)
- [五、Nacos 配置中心](#五、Nacos 配置中心)
-
- [5.1 添加配置中心依赖](#5.1 添加配置中心依赖)
- [5.2 配置 Nacos 配置中心](#5.2 配置 Nacos 配置中心)
- [5.3 导入 Nacos 配置文件](#5.3 导入 Nacos 配置文件)
- [5.4 读取配置的三种方式](#5.4 读取配置的三种方式)
-
- [5.4.1 使用 `@Value` 注解(不支持自动刷新)](#5.4.1 使用
@Value注解(不支持自动刷新)) - [5.4.2 使用 `@RefreshScope` 实现动态刷新](#5.4.2 使用
@RefreshScope实现动态刷新) - [5.4.3 使用 `@ConfigurationProperties` 配置类(推荐,默认支持热更新)](#5.4.3 使用
@ConfigurationProperties配置类(推荐,默认支持热更新))
- [5.4.1 使用 `@Value` 注解(不支持自动刷新)](#5.4.1 使用
- [5.5 配置优先级](#5.5 配置优先级)
- [5.6 配置持久化(切换数据库)](#5.6 配置持久化(切换数据库))
- 六、常见问题与注意事项
- 七、总结
一、Nacos 简介
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置和管理平台。它提供以下核心能力:
- 服务发现与服务健康检查:支持基于 DNS 和 RPC 的服务发现,以及服务的健康检查(心跳、TCP、HTTP 等),实现服务的自动注册与摘除。
- 动态配置管理:可以集中管理所有环境的配置,配置变更时无需重启应用即可实时生效。
- 动态 DNS 服务:支持基于服务的负载均衡和路由策略。
- 服务和元数据管理:提供可视化的服务管理控制台,便于运维管理。
Nacos 致力于帮助您构建、交付和管理微服务平台,是 Spring Cloud Alibaba 生态中的关键组件之一。
二、Nacos 的安装与启动
2.1 版本选择
目前 Nacos 的最新稳定版本为 2.5.2,对于大多数微服务应用,选择 2.x 版本即可 (3.x 版本引入了对 AI 和 MCP 协议的支持,若无特殊需求无需升级)。本文以 Nacos 2.5.2 为例进行讲解。
2.2 下载 Nacos
您可以从 Nacos 官方 GitHub 下载页面获取,也可以直接使用以下链接下载 2.5.2 的压缩包:
下载后解压到任意目录,例如 D:\cloud\nacos-server-2.5.2。
2.3 启动 Nacos
Nacos 支持单机模式和集群模式。开发环境中通常使用单机模式启动。
- Windows :进入
bin目录,双击或命令行执行startup.cmd -m standalone - Linux/Mac :执行
sh startup.sh -m standalone
启动成功后,控制台会显示 Nacos 运行信息,默认端口为 8848 。打开浏览器访问 http://localhost:8848/nacos,即可看到 Nacos 控制台登录页面(默认用户名/密码均为 nacos)。
- 登录后即可管理服务与配置。

2.4 服务注册与发现基本原理
Nacos 作为注册中心时,工作流程如下:
- 服务注册:微服务启动时向 Nacos Server 发送注册请求,包含服务名、IP、端口、健康检查方式等信息。
- 心跳续约:服务会定时向 Nacos 发送心跳,表明自己健康存活。若一段时间未收到心跳,Nacos 会将服务实例标记为不健康并最终剔除。
- 服务发现:服务消费者从 Nacos 获取服务提供者的实例列表,并缓存到本地。当实例列表发生变化时,Nacos 会主动推送更新。
- 负载均衡:消费者拿到实例列表后,可使用负载均衡算法(如轮询、随机、权重等)选择一个实例发起调用。
三、Spring Boot 微服务集成 Nacos 注册中心
3.1 添加依赖
在微服务模块的 pom.xml 中引入 Nacos 服务发现 Starter:
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
如果您使用的是 Spring Cloud 2023.x 及 Spring Boot 3.2.x,请确保版本兼容(推荐使用 spring-cloud-alibaba 2023.0.1.0)。
3.2 基础配置
在 application.yml 中配置 Nacos 服务发现:
yaml
spring:
application:
name: lqb-user # 微服务名称,注册到 Nacos 的标识
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos 服务端地址
# 可选配置
# namespace: 命名空间ID
# group: 分组名
启动应用后,在 Nacos 控制台"服务管理"中即可看到注册的服务。
3.3 服务调用与负载均衡
在消费者服务中,可使用 @LoadBalanced 的 RestTemplate 或 OpenFeign 进行服务调用。
使用 RestTemplate:
java
@Configuration
public class AppConfig {
@Bean
@LoadBalanced // 开启客户端负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/call/{id}")
public String call(@PathVariable Long id) {
// 直接使用服务名调用
return restTemplate.getForObject("http://lqb-user/user/" + id, String.class);
}
}
使用 OpenFeign(推荐):
java
@FeignClient(name = "lqb-user") // name 为注册中心的服务名
public interface UserFeignClient {
@GetMapping("/user/{id}")
User getUser(@PathVariable("id") Long id);
}
然后在启动类添加 @EnableFeignClients。
四、Nacos 注册中心的高级特性
4.1 服务集群与就近访问
在微服务部署多机房时,可以配置 cluster-name 来标识服务所在的集群(如北京机房、上海机房)。结合 Nacos 的负载均衡策略,可以实现优先访问同集群的服务实例,降低跨机房调用延迟。
配置示例:
yaml
spring:
cloud:
nacos:
discovery:
cluster-name: BJ # 服务所在集群名称
同时,在负载均衡器中启用 Nacos 的负载均衡扩展,即可实现同集群优先访问:
yaml
spring:
cloud:
loadbalancer:
nacos:
enabled: true # 启用 Nacos 负载均衡策略(随机访问,且优先同集群)
注意:该功能依赖
spring-cloud-starter-loadbalancer依赖,且需要将 Nacos 的权重和集群信息纳入负载均衡决策。
4.2 权重配置
在 Nacos 控制台中,可以为每个服务实例设置权重(默认值为 1)。权重越高,被负载均衡选中的概率越大。利用这一特性,可以实现灰度发布、金丝雀发布等场景。
例如,将新版本服务的权重设置为 10,旧版本保持 1,则大部分流量会流向新版本,便于观察和验证。



4.3 环境隔离:命名空间(Namespace)和分组(Group)
- 命名空间:用于隔离不同环境(如开发、测试、生产)。不同命名空间的服务互不可见。
- 分组:在同一个命名空间内,可以进一步使用分组来隔离不同业务或版本的服务。
在 Nacos 控制台创建命名空间后,会生成一个命名空间 ID(不是名称),配置时需要填写此 ID。
配置示例:
yaml
spring:
cloud:
nacos:
discovery:
namespace: d0247d5f-d454-47cd-ad12-e59c70bd207c # 命名空间 ID
group: DEV-01 # 分组名
重要提示 :服务消费者和提供者必须处于同一个命名空间和分组才能互相发现。
- 命名空间:

- 分组:

4.4 实例类型:临时实例 vs 永久实例
- 临时实例(ephemeral=true):默认实例类型。客户端向 Nacos 发送心跳维持活性,若心跳超时则服务会被自动剔除。适合常规微服务场景。
- 永久实例(ephemeral=false):不依赖心跳,需要手动管理健康状态。适合固定机器或数据库等资源。
配置方式:
ephemeral:true为临时实例,false为永久实例。
yaml
spring:
cloud:
nacos:
discovery:
ephemeral: true # 默认为 true,true:临时实例;false:永久实例
五、Nacos 配置中心
Nacos 除了作为注册中心,还可以作为配置中心,实现配置的集中管理和动态刷新。
5.1 添加配置中心依赖
在微服务模块中引入 Nacos 配置中心 Starter:
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
5.2 配置 Nacos 配置中心
在 application.yml 中,同时配置注册中心和配置中心(注意:配置中心的命名空间和分组一般建议与注册中心保持一致,以保证逻辑统一)。
yaml
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: d0247d5f-d454-47cd-ad12-e59c70bd207c # 与 discovery 保持一致
group: DEV-01
file-extension: yaml # 配置文件后缀
5.3 导入 Nacos 配置文件
-
先在nacos中配置user-dev.yaml文件。


-
从 Spring Boot 2.4 开始,官方推荐使用
spring.config.import来导入外部配置。在application.yml中添加:
yaml
spring:
config:
import:
- nacos:user-dev.yaml # 导入 user-dev.yaml 配置(dataId 为 user-dev.yaml)
- nacos:deepseek-dev.yaml # 可导入多个配置
此时,应用启动时会自动从 Nacos 拉取对应的配置文件,并合并到 Spring Environment 中。
注意事项:
nacos:后面紧跟 dataId,中间不能有空格。- dataId 的格式通常为
服务名-环境.后缀,例如user-dev.yaml。 - 如果指定了
file-extension,也可以只写user-dev,Spring 会自动拼接后缀。
5.4 读取配置的三种方式
5.4.1 使用 @Value 注解(不支持自动刷新)
java
@RestController
public class UserController {
@Value("${pattern.dateformat}")
private String dateFormat;
@GetMapping("/format")
public String getFormat() {
return dateFormat;
}
}
这种方式在 Nacos 修改配置后,需要重启应用才能生效,不支持动态刷新。
5.4.2 使用 @RefreshScope 实现动态刷新
在类上添加 @RefreshScope 注解,并配合 @Value 使用,即可实现配置变更后的自动刷新。
java
@RestController
@RefreshScope
public class UserController {
@Value("${pattern.dateformat}")
private String dateFormat;
@GetMapping("/format")
public String getFormat() {
return dateFormat;
}
}
此时,在 Nacos 中修改 pattern.dateformat 的值,并发布后,无需重启应用,再次访问 /format 接口即可看到新值。
注意 :
@RefreshScope的原理是创建代理,当配置变化时重新初始化 Bean。它不能用于static字段,且对于某些复杂 Bean 可能需要额外处理。
5.4.3 使用 @ConfigurationProperties 配置类(推荐,默认支持热更新)
定义一个配置类,使用 @ConfigurationProperties 注解:
java
@Data
@ConfigurationProperties(prefix = "deepseek")
public class DeepSeekProperties {
private String url;
private String apiKey;
}
在 Spring Boot 启动类或配置类上启用该配置:
java
@SpringBootApplication
@EnableConfigurationProperties(DeepSeekProperties.class)
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
或者在 @Configuration 类上直接使用 @ConfigurationPropertiesScan。
之后,在任意 Bean 中注入 DeepSeekProperties 即可:
java
@Service
public class DeepSeekService {
@Autowired
private DeepSeekProperties deepSeekProperties;
public void printConfig() {
System.out.println(deepSeekProperties.getUrl());
}
}
优势:
- 支持批量配置绑定,类型安全。
- 默认支持热更新 :当 Nacos 中的配置发生变化时,
DeepSeekProperties会自动刷新,无需额外注解。 - 便于集中管理配置属性。
5.5 配置优先级
- 远程配置优先级高于本地配置 :如果本地
application.yml与 Nacos 配置中存在相同的属性,Nacos 中的值会覆盖本地值。 - 多个 Nacos 配置文件的优先级 :
spring.config.import中按声明顺序,后导入的配置文件优先级更高,会覆盖先导入的相同属性。 - Spring Boot 的配置优先级规则:命令行参数 > 环境变量 > 远程配置 > 本地配置文件 > 默认值。
5.6 配置持久化(切换数据库)
Nacos 默认使用内嵌的 Derby 数据库存储配置,仅适用于开发测试。生产环境建议切换到 MySQL。
- 创建数据库和表 :在 MySQL 中创建名为
nacos的数据库,并执行 Nacos 安装目录下conf/mysql-schema.sql文件,生成表结构。 - 修改 Nacos 配置文件 :打开
conf/application.properties,取消注释并修改数据库相关配置:

properties
# 开启 MySQL 存储
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=root
db.password.0=123456
- 重启 Nacos ,之后配置数据将持久化到 MySQL 的
config_info等表中。
六、常见问题与注意事项
- 命名空间 ID vs 名称:配置时使用的是 Nacos 中生成的唯一 ID,而不是用户输入的命名空间名称。务必复制控制台中的 ID。
- 配置中心和注册中心的命名空间/分组一致性:如果注册中心指定了命名空间和分组,建议配置中心也使用相同配置,否则可能导致服务注册在一个空间,配置却在另一个空间,引发混乱。
- 配置动态刷新的局限性 :
@RefreshScope不能作用于@Bean方法返回的单例 Bean 中的字段,若需刷新整个 Bean,可考虑将 Bean 也标注@RefreshScope。 spring.config.import的正确格式 :- nacos:user-dev.yaml中间不要有空格,否则无法识别。- 权重配置仅在 Nacos 负载均衡策略下生效 :若使用 Ribbon 或默认 LoadBalancer,需确保启用了 Nacos 扩展(即
spring.cloud.loadbalancer.nacos.enabled=true)。
七、总结
本文从 Nacos 的基础概念出发,详细介绍了 Nacos 的安装、启动,以及如何将 Spring Boot 微服务集成到 Nacos 注册中心和配置中心。深入讲解了服务集群、权重、环境隔离(命名空间/分组)、实例类型等高级特性,并展示了三种读取配置的方式及其优缺点。最后,提供了配置持久化方案和常见问题注意事项。
掌握 Nacos 的使用,是构建稳健微服务架构的重要一步。希望本文能帮助您快速上手 Nacos,并在实际项目中灵活运用。
参考链接: