一句话总结
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。