配置中心
问题
为什么微服务需要配置中心?Nacos Config 和 Apollo 有什么区别?
答案
为什么需要配置中心
单体应用通过 application.yml 管理配置即可,但微服务架构面临以下问题:
| 痛点 | 说明 |
|---|---|
| 配置分散 | 几十个服务各自维护配置文件,难以统一管理 |
| 环境管理 | 开发/测试/生产配置不同,容易出错 |
| 动态更新 | 修改配置需要重启服务 |
| 安全管理 | 敏感配置(密钥、密码)散落在各处 |
配置中心将配置集中管理,支持动态推送、版本追溯、环境隔离。
Nacos Config
Nacos 同时提供注册中心和配置中心:
bootstrap.yml — Nacos 配置中心
spring:
application:
name: order-service
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: dev
group: DEFAULT_GROUP
file-extension: yaml # 配置格式
# 共享配置
shared-configs:
- data-id: common.yaml
group: DEFAULT_GROUP
refresh: true
配置的 dataId 命名规则:${spring.application.name}-${spring.profiles.active}.${file-extension}
例如:order-service-prod.yaml
动态刷新配置
动态配置读取
// 方式1:@Value + @RefreshScope
@RestController
@RefreshScope // 配置变更时刷新 Bean
public class ConfigController {
@Value("${order.max-amount:10000}")
private int maxAmount;
@GetMapping("/config")
public int getMaxAmount() {
return maxAmount;
}
}
// 方式2:@ConfigurationProperties(推荐,自动支持刷新)
@ConfigurationProperties(prefix = "order")
public class OrderProperties {
private int maxAmount = 10000;
private boolean enableDiscount = true;
// getter/setter
}
@ConfigurationProperties vs @Value
@ConfigurationProperties 在 Nacos Config 中天然支持动态刷新,无需额外加 @RefreshScope。推荐使用。
Nacos Config vs Apollo
| 对比 | Nacos Config | Apollo |
|---|---|---|
| 出品 | 阿里巴巴 | 携程 |
| 定位 | 注册中心 + 配置中心 | 专业配置中心 |
| 配置格式 | properties/yaml/json | properties/yaml/json/xml/txt |
| 灰度发布 | 不支持(社区版) | 支持(按 IP/Label 灰度) |
| 版本管理 | 保留历史版本,支持回滚 | 保留历史版本,支持回滚 |
| 权限管理 | 命名空间级别 | 细粒度(应用 + 环境 + 集群) |
| 配置监听 | 长轮询 + 推送 | 长轮询 |
| 控制台 | 简洁 | 功能完善 |
| 部署 | 单组件 | 4 个组件(复杂) |
| 适用 | 中小型项目 + 已用 Nacos 注册中心 | 大型项目、配置管理要求高 |
配置中心架构
常见面试问题
Q1: 配置中心的作用?
答案:
配置中心将微服务的配置集中管理,核心能力包括:集中管理(一个地方管理所有服务配置)、环境隔离(dev/test/prod 分离)、动态推送(修改配置无需重启服务)、版本追溯(配置变更记录、一键回滚)、安全管理(敏感配置加密、权限控制)。
Q2: Nacos Config 的动态刷新原理?
答案:
客户端通过长轮询(Long Polling)监听配置变更。客户端发起请求,如果配置无变化,服务端 hold 住连接(默认 30s),配置变更时立即返回。客户端收到变更后更新本地缓存,同时触发 @RefreshScope Bean 的重建或 @ConfigurationProperties 的属性重新绑定。
Q3: bootstrap.yml 和 application.yml 的区别?
答案:
bootstrap.yml:Spring Cloud 引入的,在application.yml之前加载。用于配置中心地址等启动阶段必须的配置application.yml:Spring Boot 的标准配置文件
从 Spring Cloud 2021.x 开始,需要引入 spring-cloud-starter-bootstrap 才能使用 bootstrap.yml,或者改用 spring.config.import 方式。
Q4: 配置中心的高可用如何保证?
答案:
- 服务端集群:Nacos/Apollo 部署多节点集群
- 客户端缓存:配置中心不可用时从本地缓存文件读取
- 数据库:配置持久化到 MySQL 等数据库,避免单点故障
- 快照机制:Nacos 客户端会在本地保存配置快照
相关链接
- Nacos 配置管理
- Apollo 官方文档
- 注册中心 - Nacos 作为注册中心
- 配置管理 - Spring Boot 配置体系