设计配置中心,核心是把”配置该用哪一份”的集中决策与”客户端本地容灾”的取舍处理好:服务端做版本化存储与发布,客户端拉取、缓存、监听并热刷新。变更实时触达靠长轮询或长连接通知,而不是短轮询空转。
一、配置中心要解决的核心问题
微服务拆分后,每个服务都有连接地址、限流阈值、功能开关等配置,配置项随服务数、环境数、集群数一起膨胀。传统把配置写进代码或外部文件,改一项就要重启,且与发版耦合、缺乏权限与审计。配置中心把变更从发版里解耦,支持热发布、灰度、回滚和审计。
二、主流方案能力对比
选型先看管理粒度与实时性。Apollo、Nacos、Spring Cloud Config、K8s ConfigMap 的差别集中在界面、灰度、推送机制和运维边界。
| 方案 | 实时生效 | 灰度发布 | 权限审计 | 存储依赖 | 适用场景 |
|---|---|---|---|---|---|
| Apollo | 长轮询秒级 | 支持(规则细) | 强(多层粒度) | MySQL | 治理要求高的团队 |
| Nacos | 变更通知+拉取 | 支持(1.1.0+) | 支持 | MySQL/Derby+JRaft | 配置+注册二合一 |
| Spring Cloud Config | 半实时(Bus) | 不支持 | 依赖 Git | Git + MQ | Spring 体系求简 |
| K8s ConfigMap | 周期同步 | 不支持 | 弱 | Etcd | K8s 原生环境 |
只需配置中心选 Apollo 或 Nacos;要配置加服务发现选 Nacos;纯 K8s 环境用 ConfigMap 挂载加文件监听更轻。
三、实时通知的三种推送机制
通知机制直接决定配置变更的感知延迟。短轮询延迟高还浪费资源,长轮询和长连接才是主流。
| 机制 | 实时性 | 服务端压力 | 复杂度 | 典型实现 |
|---|---|---|---|---|
| 推 Push | 毫秒级 | 高(维护连接) | 高 | WebSocket / gRPC Stream |
| 拉 Pull | 秒~分钟级 | 高(无效轮询) | 低 | 定时轮询 |
| 长轮询 | 秒级 | 中(挂起连接) | 中 | Apollo / Nacos |
3.1 Apollo 的长轮询
Apollo 客户端向 notifications/v2 发 HTTP 请求,服务端用 DeferredResult 挂起;Admin Service 改配置后,Config Service 扫 ReleaseMessage 表并立刻响应,客户端秒级感知。
3.2 Nacos 的变更通知 + 拉取
Nacos 2.x 服务发现走 gRPC 双向流,配置链路更准确地说是”通知 + 拉取”两阶段:服务端通知配置变了,客户端再按需拉最新内容。
3.3 客户端监听代码示例
Apollo 客户端注册变更监听器,配置一变即回调:
Config config = ConfigService.getAppConfig;
config.addChangeListener(new ConfigChangeListener {
@Override
public void onChange(ConfigChangeEvent event) {
for (String key : event.changedKeys) {
ConfigChange change = event.getChange(key);
System.out.println(key + " => " + change.getNewValue);
}
}
});
String value = config.getProperty("rate.limit", "100");
Nacos 用 addListener 注册 Listener,收到 LocalConfigInfoProcessor 推送后刷新内存并写本地快照,逻辑同构。
四、配置变更实时通知的落地步骤
把”改一处、全网生效”跑通,按五步推进:
- 服务端把配置以不可变版本写入存储,发布即切换”当前版本”指针,保证原子发布与无锁读取;
- 客户端启动时从服务端全量拉取,写入内存并落本地磁盘快照,后续只同步差异;
- 客户端向服务端发起长轮询或长连接,挂起等待变更通知;
- 服务端检测到配置变更,立即响应通知,客户端据此拉取新版本内容;
- 客户端更新内存缓存并触发变更回调,必要时配合
@RefreshScope刷新 Bean。
不可变数据模型让回滚也变成指针切换,可回退到任意历史版本,风险极低。
五、版本化与灰度发布
生产环境不该全量一把推。Apollo、Nacos 都支持灰度:先把配置发到部分实例验证,再全量。权限上 Apollo 用 RBAC 做配置项级管控,Nacos 用 Namespace+Group 做多租户隔离,所有变更记审计日志,结合类 Git 的版本回溯快速定位误操作。
常见问题(FAQ)
Q1:配置中心一定要自建吗?
不必。小团队用 ConfigMap 或 Spring Cloud Config 即可,高频治理场景再上 Apollo/Nacos。
Q2:长轮询算推还是拉?
本质是客户端拉,服务端挂起请求实现近实时,行业惯例单列突出其运行特征。
Q3:配置改了 Bean 一定会刷新吗?
不一定。普通字段、final 字段需配 @RefreshScope 或监听器,否则不按预期刷新。