设计配置中心
需求分析
配置中心统一管理所有服务的配置,支持动态更新无需重启。
架构设计
核心功能
| 功能 | 说明 |
|---|---|
| 多环境 | dev / staging / production 配置隔离 |
| 灰度发布 | 配置变更先推送到部分实例 |
| 版本回滚 | 配置变更历史 + 一键回滚 |
| 权限控制 | 不同团队只能修改自己的配置 |
| 审计日志 | 谁改了什么配置 |
| 加密存储 | 数据库密码等敏感配置加密 |
三级回退机制
远程配置中心 → 本地缓存文件 → 代码内默认值
↓ ↓ ↓
正常使用 配置中心不可用 首次启动兜底
警告
配置中心自身挂了不能导致业务不可用。客户端 SDK 必须有本地缓存文件兜底。
方案对比
| 维度 | Nacos | Apollo | Spring Cloud Config | etcd |
|---|---|---|---|---|
| 动态刷新 | ✅ 长轮询 | ✅ 长轮询 | 需配合 Bus | Watch |
| Web UI | ✅ | ✅ 功能丰富 | ❌ | ❌ |
| 灰度发布 | ✅ | ✅ | ❌ | ❌ |
| 多语言 SDK | Java/Go/Python | Java 为主 | Java | 多语言 |
| 服务发现 | ✅ 集成 | ❌ | ❌ | ✅ |
常见面试问题
Q1: 配置变更如何做到不重启生效?
答案:
- 长轮询(Apollo/Nacos):客户端定期轮询服务端,有变更立即返回
- WebSocket:服务端主动推送变更
- Watch(etcd/ZooKeeper):监听 key 变化事件
客户端收到变更后,更新内存中的配置对象,应用通过统一的配置接口读取,无需重启。