跳到主要内容
📖 本章预览

本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。

第九章:Config 模块总览 — 配置中心架构

从本章开始进入配置中心。如果说 Naming 模块像一个"通讯录"(谁在哪),Config 模块就像一个"公告板"(最新通知是什么)。

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 章完整内容 + 持续更新
  • ✅ 配套源码 + 实战项目
  • ✅ 一对一答疑 + 面试辅导
  • ✅ 简历优化 + 内推机会

📚 本章完整目录

以下为本章完整目录结构,加入知识星球即可解锁全部内容。

9.5 双存储引擎

9.6 面试热点