配置中心
配置中心负责微服务的动态配置管理:配置统一存储、版本管理、变更推送、灰度发布。让应用配置与代码分离,无需重启即可生效。
为什么需要配置中心
传统做法(properties / yaml 写死在包内):
- 改配置 = 重新打包 + 重启
- 多环境配置散落,难管理
- 无变更审计
K8s ConfigMap / Secret:
- 解决静态配置和注入
- 但应用要重启或重新挂载才能感知
配置中心:
- 实时推送,秒级生效
- 灰度发布(不同实例不同配置)
- 配置版本管理 + 一键回滚
- 权限与审计
- 加密敏感配置
核心能力
开发者 / 运维
│ 修改配置(控制台 / Git PR)
▼
配置中心 Server
│ 长轮询 / WebSocket / gRPC 推送
▼
应用实例
│ 本地缓存 + 监听变更
▼
业务代码读取(@Value / @ConfigurationProperties)
| 能力 | 说明 |
|---|---|
| 动态刷新 | 配置变更秒级推送到所有实例 |
| 多环境管理 | dev / test / staging / prod 隔离 |
| 多租户 | 不同业务线/团队隔离 |
| 灰度发布 | 按 IP / Label 推送给部分实例 |
| 版本管理 | 历史版本、Diff、一键回滚 |
| 加密 | 敏感字段加密存储 |
| 审计 | 谁、何时、改了什么 |
| 监听通知 | 配置变更 → 触发自定义回调 |
主流方案对比
| 方案 | 一致性 | 推送机制 | 配置 + 注册 | 适用生态 |
|---|---|---|---|---|
| Nacos | AP / CP 可切换 | 长轮询 / 推送 | ✅ 一体 | Spring Cloud / Dubbo |
| Apollo | 最终一致 | 长轮询 | ❌ 仅配置 | Java 微服务 |
| Consul | CP(Raft) | Watch | ✅ 一体 | 多语言、Hashicorp |
| etcd | CP(Raft) | Watch | ❌ 偏 KV | K8s 底层 |
| Spring Cloud Config | 依赖 Git | Bus 广播 | ❌ 仅配置 | Spring Cloud 早期 |
| K8s ConfigMap | etcd | reload 文件 / 重启 | ❌ 仅配置 | K8s 原生 |
Nacos 架构(国内主流)
┌──────────────────────────────────────┐
│ Nacos Server │
│ (集群 3 节点以上) │
│ │
│ ┌──────────────────────────────┐ │
│ │ 配置中心 │ │
│ │ DataId + Group + Tenant │ │
│ └──────────────────────────────┘ │
│ ┌──────────────────────────────┐ │
│ │ 注册中心 │ │
│ │ 服务实例 + 健康检查 │ │
│ └──────────────────────────────┘ │
│ │
│ 存储:MySQL(配置) + 内存(实例) │
└──────────────────────────────────────┘
│ 长轮询 / 推送
▼
┌──────┴──────────────────┐
▼ ▼
应用实例 A 应用实例 B
(本地缓存 + 监听) (本地缓存 + 监听)
核心概念:
| 概念 | 说明 |
|---|---|
| Namespace | 环境隔离(dev / prod) |
| Group | 业务分组 |
| DataId | 配置文件唯一标识 |
| Tenant | 多租户 |
配置示例(Spring Boot):
# bootstrap.yml
spring:
application:
name: order-service
cloud:
nacos:
config:
server-addr: nacos:8848
namespace: prod
group: ORDER_GROUP
file-extension: yaml
refresh-enabled: true@RestController
@RefreshScope // 配置变更自动刷新
public class OrderController {
@Value("${order.timeout}")
private int timeout;
}Apollo 架构(携程开源)
┌─────────────────────────────────────┐
│ Apollo 三大组件 │
│ │
│ Config Service(配置读取 + 推送) │
│ Admin Service(配置管理) │
│ Portal(管理界面) │
│ │
│ 存储:MySQL(ApolloConfigDB + │
│ ApolloPortalDB) │
└─────────────────────────────────────┘
│ 长轮询
▼
客户端 SDK
Apollo 特色:
- 灰度发布(按 IP / Label 推送)
- 审计与权限(修改 / 发布权限分离)
- 命名空间继承(公共配置复用)
- 配置 Diff 对比
推送机制对比
长轮询(Long Polling)
客户端 ──── HTTP 请求(带超时 30s)────► 配置中心
│
无变更 → 等待 30s │
有变更 → 立即返回新配置 │
客户端 ◄──────────────────────────────── │
│
▼
处理配置变更,继续下一轮长轮询
Apollo、Nacos 默认使用,兼容性好,无需 WebSocket。
Watch 机制(gRPC Stream)
客户端 ──── 建立 gRPC 流 ────► 配置中心
│ 变更
客户端 ◄──── 推送变更 ─────────── │
Consul、etcd、Nacos 2.x 默认。延迟更低。
与 K8s ConfigMap 的关系
ConfigMap 局限:
- 修改后 Pod 不自动 reload(需手动 rollout restart)
- 没有版本管理 / 审计
- 没有权限隔离
- 没有灰度
两种集成方式:
方案 1:ConfigMap + Reloader
ConfigMap 修改
│
Reloader Operator 检测变更
│
▼
触发 Deployment rollout restart
│
所有 Pod 滚动重启
简单粗暴,仅适合非核心服务。
方案 2:Nacos / Apollo + K8s 应用
K8s Pod(应用)
│ Init Container 从 Nacos 拉初始配置
│ Sidecar 长轮询 Nacos 推送变更
▼
应用进程(不重启,热刷新配置)
生产推荐方案,结合 K8s 编排 + 配置中心实时性。
配置最佳实践
配置分类与存储位置
| 类型 | 存储 | 示例 |
|---|---|---|
| 启动配置 | 镜像 / ConfigMap | 端口、日志路径 |
| 业务配置 | 配置中心 | 限流阈值、开关、特性标志 |
| 敏感配置 | Vault / KMS | 数据库密码、API Key |
| 公共配置 | 配置中心(公共 namespace) | 监控地址、链路追踪开关 |
命名规范
{环境}/{服务}/{配置类别}
prod/order-service/business
prod/order-service/database
dev/order-service/business
配置变更安全
1. 变更前:在 staging 验证
2. 灰度发布:先推 5% 实例
3. 监控指标:error rate、latency 是否异常
4. 异常 → 自动回滚(Apollo 支持)
5. 全量推送
危险配置项保护
# 关键阈值配置必须人工 review
order:
max-amount: 100000 # 单笔限额
rate-limit: 1000 # QPS 上限通过权限控制 + 二次审批,防止误操作。
Feature Flag(特性开关)
配置中心常被用于实现 Feature Flag,灰度上线新功能:
features:
new-checkout-flow:
enabled: true
rollout:
percentage: 10 # 10% 用户启用
whitelist: [123, 456] # 指定用户启用if (featureFlag.isEnabled("new-checkout-flow", userId)) {
return newCheckout();
} else {
return oldCheckout();
}专门的 Feature Flag 平台:
- LaunchDarkly(商业)
- Unleash(开源)
- Flagsmith(开源)
安全注意事项
| 风险 | 防护 |
|---|---|
| 敏感配置泄露 | 加密存储(AES)+ 传输 TLS |
| 权限滥用 | RBAC + 审批流 |
| 误删 / 误改 | 版本管理 + 一键回滚 |
| 配置爆炸 | 命名规范 + 定期清理 |
| 配置中心宕机 | 客户端本地缓存兜底 + 多副本部署 |
与注册中心的关系
参见 服务注册与发现。Nacos 同时承担配置中心 + 注册中心两个职责,部署一套即可:
┌─────────────────────────────────────┐
│ Nacos │
│ │
│ 配置中心:DataId / Group / Tenant │
│ 注册中心:Service / Instance │
│ │
│ 两者共享:权限、命名空间、集群 │
└─────────────────────────────────────┘
相比 Apollo(仅配置) + Eureka(仅注册),Nacos 一体化更易运维,这也是它成为国内主流的核心原因。