ZooKeeper配置存储与推送
配置中心是ZooKeeper典型应用场景。
配置存储结构设计
路径设计:
JSON
/config <- 配置根节点
/config/app1 <- 应用1配置目录
/config/app1/db-config <- 数据库配置
/config/app1/redis-config <- Redis配置
/config/app1/app-config <- 应用配置
数据格式:
Java
{
"host": "192.168.1.100",
"port": 3306,
"username": "root",
"password": "xxx",
"maxPoolSize": 100
}
设计原则:
| 原则 | 说明 |
|---|---|
| 按应用分组 | 不同应用配置隔离 |
| 按类型分类 | db、redis、app等分类 |
| 层级清晰 | 便于查找和管理 |
| 格式统一 | 推荐JSON格式 |
存储容量:
| 约束 | 说明 |
|---|---|
| 单节点数据 | 默认1MB上限 |
| 数据量建议 | 配置数据<1KB |
| 节点数量 | 无明确限制 |
路径命名建议:
Java
/config/{env}/{app}/{type}
env: dev、test、prod
app: 应用名称
type: 配置类型
提示:配置数据不宜过大,元数据和配置为主。
配置变更推送
推送机制:
text
1. 应用启动读取配置,注册Watcher
2. 管理员修改配置节点
3. 触发NodeDataChanged事件
4. 应用收到通知,重新读取
5. 更新本地缓存,应用新配置
监听代码:
text
// 读取并监听配置
byte[] data = zk.getData("/config/app/db", watcher, stat);
Config config = parseConfig(data);
Watcher watcher = new Watcher() {
public void process(WatchedEvent event) {
if (event.getType() == EventType.NodeDataChanged) {
// 重新读取配置
byte[] newData = zk.getData(event.getPath(), this, null);
Config newConfig = parseConfig(newData);
// 更新本地配置
updateConfig(newConfig);
}
}
};
推送特点:
| 特点 | 说明 |
|---|---|
| 实时 | 变更立即推送 |
| 主动 | 服务端主动通知 |
| 节省 | 无需轮询 |
推送注意事项:
| 注意点 | 说明 |
|---|---|
| Watcher一次性 | 需在回调中重新注册 |
| 重连重建 | 会话恢复后需重新监听 |
| 数据比对 | 比对版本号确认变更 |
TreeCache持续监听:
text
// 使用TreeCache持续监听
TreeCache cache = TreeCache.newBuilder(client, "/config/app").build();
cache.start();
cache.getListenable().addListener((client, event) -> {
if (event.getType() == TreeCacheEvent.Type.NODE_UPDATED) {
// 处理配置变更
String path = event.getData().getPath();
byte[] data = event.getData().getData();
updateConfig(path, data);
}
});
注意:Watcher一次性触发,回调中必须重新注册。
要点总结
- 配置存储在ZNode节点数据中
- 路径按应用和类型分组设计
- 数据格式推荐JSON,便于解析
- Watcher监听实现实时推送
- 推送后重新读取并更新缓存
- Watcher一次性,需重新注册
- TreeCache实现持续监听
📝 发现内容有误?点击此处直接编辑