ZooKeeper配置版本与环境隔离
配置版本控制和环境隔离是配置中心关键特性。
配置版本管理
版本机制:
Java
每次setData修改配置
version字段自动递增
可用于判断配置是否变更
版本字段:
| 字段 | 说明 |
|---|---|
| dataVersion | 数据版本号 |
| cversion | 子节点版本号 |
| aversion | ACL版本号 |
条件更新:
Java
// 指定版本号更新,避免并发冲突
Stat stat = new Stat();
zk.getData("/config/app/db", false, stat);
int version = stat.getVersion();
// 使用版本号更新
zk.setData("/config/app/db", newData, version);
// 版本不匹配抛出BadVersionException
版本回滚方案:
Java
方案1: 保留历史版本节点
/config/app/db/v1
/config/app/db/v2
/config/app/db/v3
方案2: 数据中包含版本号
{
"version": 3,
"data": {...}
}
版本查询:
Java
Stat stat = new Stat();
zk.getData("/config/app/db", false, stat);
System.out.println("Version: " + stat.getVersion());
System.out.println("Mzxid: " + stat.getMzxid());
版本对比更新:
Bash
// 乐观锁更新
public boolean updateConfig(String path, byte[] newData) {
Stat stat = new Stat();
byte[] oldData = zk.getData(path, false, stat);
try {
zk.setData(path, newData, stat.getVersion());
return true;
} catch (BadVersionException e) {
// 版本冲突,需要重试
return false;
}
}
提示:版本号实现乐观锁,并发更新需处理版本冲突。
多环境配置隔离
路径隔离方案:
Java
/config/dev/app/db <- 开发环境
/config/test/app/db <- 测试环境
/config/prod/app/db <- 生产环境
应用读取逻辑:
text
// 根据环境变量选择路径
String env = System.getenv("APP_ENV"); // dev/test/prod
String path = "/config/" + env + "/app/db";
Config config = readConfig(path);
权限控制:
| 环境 | ACL建议 |
|---|---|
| dev | world:anyone:r 或开放 |
| test | digest:test:r |
| prod | digest:admin:crwa |
ACL配置:
text
# 生产环境配置设置digest ACL
create /config/prod/app/db "secret" digest:admin:pwd:crwa
# 开发环境开放读取
create /config/dev/app/db "data" world:anyone:r
环境继承:
text
/config/common/app/db <- 公共配置(继承)
/config/dev/app/db <- 环境特定配置(覆盖)
应用读取时:
1. 读取公共配置
2. 读取环境特定配置
3. 合并配置,特定配置覆盖公共
合并逻辑:
text
public Config loadConfig(String env, String app) {
// 公共配置
Config common = readConfig("/config/common/" + app);
// 环境配置
Config envConfig = readConfig("/config/" + env + "/" + app);
// 合并
return mergeConfig(common, envConfig);
}
注意:生产环境配置必须设置ACL保护敏感数据。
要点总结
- version字段每次修改递增
- 条件更新使用setData指定版本号
- 版本不匹配抛出BadVersionException
- 多环境使用路径隔离:/config/{env}
- 应用根据环境变量选择配置路径
- 公共配置+环境配置合并实现继承
- 生产环境配置必须设置ACL保护
📝 发现内容有误?点击此处直接编辑