配置中心 Nacos Config?

2025年 阅读约 15 分钟 面试指南 · Spring Cloud

深入解析Nacos Config配置中心:配置管理、动态刷新(@RefreshScope)、多环境配置(namespace)、配置共享(shared-configs)、灰度发布、bootstrap.yml vs application.yml,附面试模拟问答。

一句话总结

Nacos Config 是集中式配置管理方案,解决微服务配置分散、修改需重启的问题。核心功能:配置集中存储(Nacos 服务端)、动态刷新(@RefreshScope + @Value)、多环境隔离(namespace)、配置共享(shared-configs)、灰度发布。配置优先级:命令行参数 > Nacos 配置 > 本地配置。Data ID 命名规则:${prefix}-${spring.profiles.active}.${file-extension},如 user-service-dev.yml。

初级理解

为什么需要配置中心?

# 传统配置管理的问题 # 1. 配置分散:每个服务有自己的 application.yml # 2. 修改需重启:改配置 → 重新打包 → 重新部署 # 3. 环境不一致:开发/测试/生产配置容易搞混 # 4. 安全风险:敏感信息(密码)散落在代码中 # 配置中心的优势 # 1. 集中管理:所有配置统一在 Nacos 管理 # 2. 动态刷新:修改配置后实时生效,无需重启 # 3. 环境隔离:dev/test/prod 通过 namespace 隔离 # 4. 权限控制:敏感配置可加密存储

基本使用

# 1. 引入依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> # 2. bootstrap.yml(比 application.yml 先加载) spring: application: name: user-service cloud: nacos: config: server-addr: localhost:8848 file-extension: yml namespace: dev-namespace-id # 环境隔离 # 3. Nacos 控制台创建配置 # Data ID: user-service.yml # Group: DEFAULT_GROUP # 配置内容: # server: # port: 8081 # 4. 动态刷新 @RestController @RefreshScope // 配置变更时刷新 Bean public class ConfigController { @Value("${app.timeout:3000}") private int timeout; @GetMapping("/timeout") public int getTimeout() { return timeout; } }

中级深入

多环境配置

# 通过 namespace 隔离环境 # Nacos 控制台创建三个命名空间 # dev-namespace-id → 开发环境 # test-namespace-id → 测试环境 # prod-namespace-id → 生产环境 # bootstrap.yml 指定 namespace spring: cloud: nacos: config: namespace: ${NACOS_NAMESPACE:dev-namespace-id} # 启动时通过环境变量切换 # java -jar app.jar --NACOS_NAMESPACE=prod-namespace-id # 通过 group 区分不同业务 # DEFAULT_GROUP:通用配置 # USER_GROUP:用户服务配置 # ORDER_GROUP:订单服务配置

配置共享

# 共享配置:多个服务共用同一份配置 spring: cloud: nacos: config: shared-configs: - data-id: common.yml # 共享配置 Data ID group: DEFAULT_GROUP refresh: true # 是否动态刷新 - data-id: redis.yml group: DEFAULT_GROUP refresh: true # 扩展配置(extension-configs) # 与 shared-configs 类似,但优先级更高 spring: cloud: nacos: config: extension-configs: - data-id: datasource.yml group: DEFAULT_GROUP refresh: true

高级拓展

配置加载优先级

# Nacos 配置加载顺序(优先级从高到低) # 1. ${application.name}-${profile}.${file-extension} # 如 user-service-dev.yml(当前环境专属) # 2. ${application.name}.${file-extension} # 如 user-service.yml(通用配置) # 3. ${application.name}-${profile}.${file-extension}(extension-configs) # 4. ${application.name}.${file-extension}(extension-configs) # 5. shared-configs(共享配置) # 整体配置优先级 # 命令行参数 > Nacos 配置 > 本地 application.yml > bootstrap.yml # 注意:bootstrap.yml 优先级最低 # 它只是用来加载 Nacos 配置的"引导配置"

@RefreshScope 原理

# @RefreshScope 动态刷新原理 # 1. @RefreshScope 注解的 Bean 是代理对象 # 2. Nacos 配置变更 → 发布 RefreshEvent 事件 # 3. RefreshScope 监听事件 → 清空缓存 # 4. 下次访问时重新创建 Bean(懒加载) # 5. 新 Bean 读取最新配置 # 注意 # @RefreshScope 只对 @Value 注入的属性生效 # @ConfigurationProperties 绑定的属性自动刷新,无需 @RefreshScope

实战场景

场景:灰度发布配置

# Nacos 灰度发布 # 场景:新功能上线,先让 10% 用户使用新配置 # 1. 创建灰度配置 # Data ID: user-service.yml # Group: GRAY_GROUP # 配置内容:feature.new.enabled=true # 2. 灰度服务指定 group spring: cloud: nacos: config: group: GRAY_GROUP # 3. 部署灰度实例 # 正常实例:group=DEFAULT_GROUP # 灰度实例:group=GRAY_GROUP # 4. 网关按权重路由 # 10% 流量 → 灰度实例 # 90% 流量 → 正常实例

面试模拟

面试官:配置中心如何实现动态刷新?

你:通过 @RefreshScope 注解。Nacos 配置变更后发布 RefreshEvent,RefreshScope 监听事件清空缓存,下次访问时重新创建 Bean 读取最新配置。@ConfigurationProperties 绑定的属性自动刷新,无需 @RefreshScope。

面试官:多环境配置如何管理?

你:通过 namespace 隔离环境(dev/test/prod),每个 namespace 有独立的配置。通过 group 区分不同业务。通过 shared-configs 共享公共配置。启动时通过环境变量指定 namespace。