📖 本章预览
本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。
第九章:Config 模块总览 — 配置中心架构
从本章开始进入配置中心。如果说 Naming 模块像一个"通讯录"(谁在哪),Config 模块就像一个"公告板"(最新通知是什么)。
9.1 Config 与 Naming 的核心差异
| 维度 | Naming(服务发现) | Config(配置管理) |
|---|---|---|
| 数据存储 | 纯内存(Client 对象) | MySQL/Derby + 内存缓存 |
| 数据大小 | 小(IP + Port) | 大(配置内容可达几十 KB) |
| 集群同步 | Distro 直接传输数据 | 通知 + 各节点从 DB 读取 |
| 推送内容 | 完整实例列表(纯推) | 只推 groupKey,客户端拉内容(推拉结合) |
| 一致性 | AP(最终一致) | 强一致(共享 DB) |
9.2 Config 模块包结构
config/server/
├── controller/ # HTTP 接口层
├── remote/ # gRPC 接口层
│ ├── ConfigPublishRequestHandler # 发布
│ ├── ConfigQueryRequestHandler # 查询
│ ├── ConfigRemoveRequestHandler # 删除
│ ├── ConfigChangeBatchListenRequestHandler # 监听注册
│ ├── RpcConfigChangeNotifier # 变更推送
│ └── ConfigChangeClusterSyncRequestHandler # 集群同步
├── service/ # 业务逻辑层
│ ├── ConfigOperationService # 配置操作入口
│ ├── ConfigCacheService # 内存缓存(MD5 比对)
│ ├── dump/ # Dump 同步机制
│ ├── repository/ # 持久化层(双存储引擎)
│ ├── query/ # 查询责任链
│ └── notify/ # 集群通知
└── model/ # 数据模型
9.3 配置数据模型
9.3.1 ConfigInfo——配置的完整信息
public class ConfigInfo extends ConfigInfoBase {
private long id;
private String dataId;
private String group;
private String tenant; // 命名空间(代码中 tenant = namespace)
private String content;
private String md5;
private String type; // properties/yaml/json/xml
private String encryptedDataKey;
}
9.3.2 CacheItem——内存中的配置缓存
public class CacheItem {
private ConfigCache configCache; // MD5 + 最后修改时间
private Map<String, ConfigCacheGray> configCacheGray; // 灰度配置缓存
private List<ConfigCacheGray> sortConfigGrays; // 按优先级排序
private SimpleReadWriteLock rwLock; // 读写锁
private String type;
}
CacheItem 不存配置内容本身,只存 MD5 摘要和时间戳。查询时通过 MD5 判断配置是否变更,变更时才去读取完整内容。
9.4 三级流水线——理解 Config 的关键
第一级:DB(持久化)
│ 配置发布 → 写入 MySQL/Derby
▼ Dump(定时/事件触发)
第二级:内存 CacheItem(MD5 缓存)
│ MD5 变更 → 发布 LocalDataChangeEvent
▼
第三级:推送
│ gRPC 推送 / 长轮询唤醒
▼
客户端收到通知 → 主动拉取最新配置内容
🔒 解锁完整内容
本章剩余内容需要解锁后查看
以上仅为本章部分预览内容,完整内容包含更多深度源码解析、实战代码和面试要点。
加入知识星球你将获得:
- ✅ 全部 17 章完整内容 + 持续更新
- ✅ 配套源码 + 实战项目
- ✅ 一对一答疑 + 面试辅导
- ✅ 简历优化 + 内推机会
📚 本章完整目录
以下为本章完整目录结构,加入知识星球即可解锁全部内容。