
上次我们探讨了 OpenFeign 的架构原理,这次我们把目光转向 Nacos。作为服务注册中心与配置中心的业界标杆,Nacos 已经非常成熟。在深入其架构原理之前,我们先来一篇使用教程作为开胃菜。
本篇将涵盖 Nacos 的两个核心应用场景:
- 用 Nacos 作为注册中心。
- 用 Nacos 作为配置中心。
教程内容可能略显枯燥,建议快速浏览并收藏,以备后续查阅。所有示例将基于我的开源 SpringCloud 项目 PassJava 进行演示。
开源地址: https://github.com/Jackson0714/PassJava-Platform
喜欢的小伙伴可以点个 Star 支持一下。
下图是 PassJava 项目的整体架构图,其中包含了 Nacos 作为核心组件的位置:

Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
一、Nacos 作为注册中心
1.1 引入 Nacos 服务发现组件
在 passjava-common 模块的 pom.xml 文件中引入 Nacos 服务发现组件。
<!-- nacos discovery 服务发现组件-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
1.2 下载 Nacos Server 工具包并启动
注意:此步骤在 Windows 和 Mac 系统上均测试通过。
- 下载 Nacos Server:从 GitHub Release 页面 下载压缩包。
- 启动 Server:解压后,进入
nacos/bin 目录,根据操作系统执行相应命令:
- Linux/Unix/Mac:执行
sh startup.sh -m standalone
- Windows:执行
cmd startup.cmd
Windows 启动问题:若执行 startup.cmd 时遇到 “Please set the JAVA_HOME variable...” 错误。
- 解决方案:编辑
startup.cmd 文件,将 %JAVA_HOME% 替换为你本地 JDK 的绝对路径,例如:C:\Program Files\Java\jdk1.8.0_131。
启动成功后的终端日志示例如下:

1.3 每个微服务都配置 Nacos Server 地址
在 passjava-question、passjava-channel、passjava-content、passjava-member、passjava-study 等微服务的 /src/main/resources/application.yml 配置文件中,添加 Nacos Server 地址。
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
1.4 添加注解
在每个微服务的主启动类上添加 @EnableDiscoveryClient 注解,以开启服务注册与发现功能。
@EnableDiscoveryClient
@MapperScan("com.jackson0714.passjava.question.dao")
@SpringBootApplication
public class PassjavaQuestionApplication {
public static void main(String[] args) {
SpringApplication.run(PassjavaQuestionApplication.class, args);
}
}
1.5 配置微服务的名称
在微服务的 application.yml 中,配置其应用名称。
spring:
application:
name: passjava-question
1.6 访问 Nacos Server 后台
二、Nacos 作为配置中心
在传统的单体或微服务架构中,配置管理通常是一个痛点。Nacos 作为配置中心,提供了动态刷新、多环境管理等强大功能,能显著提升配置管理的效率和灵活性。
2.1 传统配置方式的局限
我们先看一个传统的配置方式:
- 在
application.properties 中定义配置:
member.nickname = "悟空聊架构"
member.age = "18"
-
在控制器中使用 @Value 注解获取配置:
@Value("${member.nickname}")
private String nickname;
@Value("${member.age}")
private Integer age;
- 编写测试接口:
@RequestMapping("/test-local-config")
public R testLocalConfig() {
return R.ok().put("nickname", nickname).put("age", age);
}
- 测试结果:

缺点:若要修改配置,必须重启服务。在服务众多的分布式系统中,这无疑是低效且不可取的。有没有办法实现不停机更新配置呢?答案是肯定的,使用 Nacos 作为配置中心即可。
2.2 引入 Nacos Config 依赖
在 PassJava-Common 项目的 pom.xml 中引入 Spring Cloud Alibaba Nacos Config 依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.3 配置 Nacos 元数据
在 passjava-member 服务中添加 /src/main/resources/bootstrap.properties 配置文件(bootstrap.properties 的优先级高于其他配置文件),并配置 Nacos Server 地址。

spring.application.name=passjava-member
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
2.4 Nacos 后台新增配置
登录 Nacos 控制台,在“配置管理”->“配置列表”中,点击“+”创建新配置。
2.5 开启动态刷新配置功能
在需要动态刷新配置的类上添加 @RefreshScope 注解。
@RefreshScope
@RestController
@RequestMapping("member/sample")
public class SampleController {}
当你在 Nacos 控制台修改配置并发布后,应用日志中会出现类似信息,表明配置已动态刷新:
Refresh keys changed: [member.age]
... [notify-ok] dataId=passjava-member.properties, group=DEFAULT_GROUP ...
2.6 测试结果
访问接口:http://localhost:10000/member/sample/test-local-config
返回结果中的 nickname 和 age 将与 Nacos 后台的配置一致。这说明我们只需在 Nacos 后台修改配置,即可实时生效,无需重启服务。注意:Nacos 中的配置项优先级高于本地 application.properties 中的配置。

2.7 命名空间 (Namespace)
在微服务体系中,不同服务通常需要独立的配置。Nacos 的命名空间功能可以用于实现配置的隔离。
- 创建命名空间:在 Nacos 控制台“命名空间”菜单下,为每个微服务创建一个命名空间(例如:
passjava-member)。


- 在命名空间下创建配置:切换到对应的命名空间(如
passjava-member),然后为该服务创建配置。也可以通过“克隆”功能从 public 空间复制配置。


- 应用指定命名空间:在微服务的
bootstrap.properties 中配置要使用的命名空间 ID。
spring.cloud.nacos.config.namespace=passjava-member
- 测试:修改
passjava-member 命名空间下的配置,重启服务(首次绑定命名空间需重启)后访问接口,确认获取的是指定命名空间的配置。

2.8 分组 (Group)
为了区分开发、测试、生产等不同环境,可以使用 Nacos 的分组功能。
- 创建多套环境配置:在 Nacos 中,为同一配置(
Data ID)创建多个分组,如 dev,test,prod,并分别设置不同的值。


- 应用指定分组:在
bootstrap.properties 中配置当前激活的分组。
spring.cloud.nacos.config.group=prod
- 测试:访问接口,确认获取的是
prod 分组下的配置值。
2.9 多配置集 (Extension Configs)
我们可以将传统的 application.yml 中繁杂的配置(如数据源、MyBatis、其他自定义配置)拆分成多个独立的配置文件,并托管到 Nacos,实现更精细化的管理。这对于管理复杂的应用配置,尤其是在多环境场景下,非常有帮助。
2.9.1 在配置中心新建拆分后的配置
datasource.yml:存放数据源配置。

mybatis.yml:存放 MyBatis-Plus 相关配置。

more.yml:存放其他配置,如应用名、Nacos 注册中心地址等。

2.9.2 克隆配置到多环境
将 dev 分组下的上述三个配置文件,克隆到 test 和 prod 分组,并可按环境修改具体值。

2.9.3 应用端配置多配置集
在 bootstrap.properties 中,通过 extension-configs 数组来加载多个配置集。同时,可以注释掉本地 application.yml 中的相应配置。
spring.application.name=passjava-member
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=passjava-member
spring.cloud.nacos.config.group=dev
# 加载多配置集
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
spring.cloud.nacos.config.extension-configs[0].group=dev
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
spring.cloud.nacos.config.extension-configs[1].refresh=true
spring.cloud.nacos.config.extension-configs[2].data-id=more.yml
spring.cloud.nacos.config.extension-configs[2].group=dev
spring.cloud.nacos.config.extension-configs[2].refresh=true
2.9.4 测试配置是否生效
- 测试基本配置和
more.yml:访问 http://localhost:10000/member/sample/test-local-config,应返回 Nacos 中配置的昵称、年龄,并且服务端口为 more.yml 中定义的 10000。
- 测试
datasource.yml 和 mybatis.yml:访问一个数据库查询接口(如 http://localhost:10000/member/member/list),若能正常返回数据,则说明数据源和 MyBatis 配置生效。
2.10 更多配置项
Nacos Config 提供了丰富的配置项,用于满足各种定制化需求。以下是一些常用配置的总结:

2.11 使用 Nacos 作为配置中心总结
- 引入依赖:添加
spring-cloud-starter-alibaba-nacos-config。
- 配置数据源:在
bootstrap.properties 中配置 Nacos Server 地址 (spring.cloud.nacos.config.server-addr)。
- 配置中心操作:在 Nacos 控制台创建配置,指定
Data Id 和配置内容。
- 开启动态刷新:在需要动态刷新的 Bean 上添加
@RefreshScope 注解。
- 获取配置:使用
@Value(“${key}”) 获取配置值。
- 配置优先级:Nacos 远程配置优先级高于本地配置。
- 服务隔离:使用命名空间 (
namespace) 为不同微服务创建独立的配置空间。
- 环境隔离:使用分组 (
group) 来区分不同环境(如 dev, test, prod)。
- 配置拆分:使用多配置集 (
extension-configs) 将不同类别的配置(数据源、框架、业务)拆分开管理。
通过以上步骤,你可以充分运用 Nacos 配置中心来管理你的Spring Cloud Alibaba微服务应用配置,实现配置的集中化、动态化和环境化管理。如果你想了解更多关于微服务和数据库中间件的深度实践,欢迎在云栈社区交流探讨。
后记:关于 Nacos 的底层架构原理,我们将在后续的文章中详细剖析。本篇教程旨在帮助大家快速上手,解决实际项目中的配置管理难题。