[toc]
| 单词 | 词性 | 音标 | 含义 |
|---|---|---|---|
| Data ID | n. | /ˈdeɪtə aɪ diː/ | 配置的唯一标识(一般 = 服务名 + 文件后缀) |
| Group | n. | /ɡruːp/ | 分组(把配置分组管理,默认 DEFAULT_GROUP) |
| namespace | n. | /ˈneɪmspeɪs/ | 命名空间(环境隔离:dev / test / prod 各一套配置) |
| refresh | v. | /rɪˈfreʃ/ | 刷新(配置修改后让运行中的服务自动拿到最新值) |
| priority | n. | /praɪˈɒrəti/ | 优先级(多个配置来源同时存在时,谁生效) |
| shared | adj. | /ʃeərd/ | 共享的(多个服务共用的公共配置) |
Lecture04-SpringCloud-Nacos配置中心
目标:把各服务的配置集中到 Nacos,改配置不用重启服务,并掌握 Data ID、Group、命名空间、共享配置与配置优先级。
1、为什么需要配置中心
单体时代配置写在 application.yml 里,改一下要重启整个应用;微服务有几十个服务,逐台改配置不现实。配置中心解决:
- 集中管理:所有服务的配置放在 Nacos 一个地方。
- 动态刷新:改完配置,运行中的服务自动拿到新值,无需重启。
- 环境隔离:dev / test / prod 用命名空间隔离,互不干扰。
一句话:配置中心 = 各服务的"设置面板",改完即生效。
2、Nacos 里的三个关键概念
| 概念 | 作用 | 示例 |
|---|---|---|
| Data ID | 一条配置的唯一名字 | user-service.yaml |
| Group | 配置分组,默认 DEFAULT_GROUP | 一般不用改 |
| Namespace | 环境/租户隔离,各自独立 | dev、test、prod |
定位一条配置:Namespace + Group + Data ID 三要素唯一确定。
3、接入配置中心
1、加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、配置文件中声明"引入 Nacos 配置"
Spring Cloud 2025.1.x 用 spring.config.import 方式引入 Nacos 配置(注意:声明了 import 后,Nacos 里没有对应配置启动会报错):
spring:
application:
name: user-service
config:
import:
- nacos:user-service.yaml # 引入 Data ID = user-service.yaml
cloud:
nacos:
server-addr: 192.168.100.100:8848
config:
file-extension: yaml # 后缀(与 import 里的后缀一致)
提示:为避免"import 的配置不存在就启动失败",可在 Nacos 里先建一条空配置
user-service.yaml。
3、在 Nacos 里建配置
控制台 → 配置管理 → 配置列表 → 新建配置:
- Data ID:
user-service.yaml - Group:
DEFAULT_GROUP - 格式:
YAML - 内容:例如
app:
slogan: 来自Nacos配置中心的问候
max-users: 1000
4、动态刷新 @RefreshScope
想让配置改了立即生效,在被注入的类上加 @RefreshScope:
@RestController
@RefreshScope // 关键:配置变更时重建当前 Bean,读最新值
public class ConfigController {
@Value("${app.slogan:默认}")
private String slogan;
@Value("${app.max-users:0}")
private int maxUsers;
@GetMapping("/config")
public String show() {
return "slogan=" + slogan + ", maxUsers=" + maxUsers;
}
}
演示:在 Nacos 里改
app.slogan并发布,不重启应用,GET /config立刻返回新值。
注意:
@RefreshScope只对"Bean 级别"生效;静态字段、常量等不受控制。读取频繁的热点配置可结合 Redis 缓存(衔接 Redis 课)。
注意:@Value("${app.slogan:默认}")中的默认值非常有用!先让默认值在创建类的 bean 对象时能够给成员变量赋值,否则此时还无法从 Nacos 配置中心拉取配置数据,先保证当前微服务能够完成初始化,然后再从 Nacos 拉取配置更新成员变量的值!
提问:什么数据适合放在 Nacos 配置中心管理,什么数据适合放在 Redis 中维护?
回答:业务数据、高频读写的适合放在 Redis;微服务本身的配置信息、不经常修改的适合放在 Nacos 中。
5、共享配置与配置优先级
1、共享配置(多服务复用)
把公共配置(如 Redis、消息、日志级别)抽成独立 Data ID,多个服务都引入:
spring:
config:
import:
- nacos:user-service.yaml # 本服务专有配置
- nacos:common-db.yaml # 公共配置:数据库
- nacos:common-redis.yaml # 公共配置:Redis
2、配置优先级(本课程结论,从上到下越来越高)
本地 application.yml(最低,仅兜底)
↓
Nacos 共享配置(common-*.yaml)
↓
Nacos 本服务 Data ID(user-service.yaml) ← 一般在这层配业务项
实际生效顺序以 Spring 官方文档为准;业务开发记住:Nacos 里"本服务 Data ID"的配置优先级高于本地与共享配置即可。
6、课堂练习
- 给
user-service接入 Nacos 配置中心,从 Nacos 读取app.slogan并显示。 - 改
app.slogan并发布,验证@RefreshScope动态刷新(不用重启)。 - 建一条共享配置
common-redis.yaml(放 Redis 连接项),让两个服务都引入。 - (挑战)新建命名空间
dev,在 dev 命名空间下建一条与默认命名空间同名配置,观察环境隔离效果。
7、本讲小结
- Nacos Config 集中管理配置,改完即生效(配合
@RefreshScope)。 - 一条配置用 Namespace + Group + Data ID 唯一定位。
- 接入方式:
spring.config.import: nacos:<DataID>。 - 公共配置用共享 Data ID 复用;"本服务 Data ID"配置优先级最高。
8、本节验证
- 理解配置中心的作用(统一管理、动态刷新)✅
- 掌握 Data ID / Group / Namespace 三个关键概念 ✅
- 会接入 Nacos 配置中心并在 Nacos 里建配置 ✅
- 会用 @RefreshScope 实现动态刷新,理解共享配置与配置优先级 ✅