Consul 的键值存储(KV Store)是一个功能强大的分布式配置中心,提供了动态配置管理、服务协调、领导选举等功能。
基本概念
Consul KV Store 是一个类似 etcd 的分布式键值存储系统,具有以下特点:
- 分布式:数据在多个 Consul Server 节点间复制
- 强一致性:通过 Raft 协议保证数据一致性
- 层级结构:支持类似文件系统的层级键结构
- 原子操作:支持事务和原子操作
- 版本控制:每个键都有版本号和修改时间
CLI 操作
基本读写操作
bash# 设置键值 consul kv put config/app/name "myapp" # 获取键值 consul kv get config/app/name # 获取键值详细信息 consul kv get -detailed config/app/name # 删除键 consul kv delete config/app/name # 递归删除 consul kv delete -recurse config/
列出和查询
bash# 列出所有键 consul kv get -recurse # 列出指定前缀的键 consul kv get -recurse config/ # 导出所有键值 consul kv export > backup.json # 导入键值 consul kv import < backup.json
HTTP API 操作
基本操作
bash# 设置键值 curl -X PUT -d "value" http://localhost:8500/v1/kv/config/app/name # 获取键值 curl http://localhost:8500/v1/kv/config/app/name # 删除键 curl -X DELETE http://localhost:8500/v1/kv/config/app/name # 递归获取 curl http://localhost:8500/v1/kv/config/?recurse=true
高级操作
bash# CAS(Compare-And-Set)操作 curl -X PUT -d "newvalue" \ http://localhost:8500/v1/kv/config/app/name?cas=10 # 获取键的元数据 curl http://localhost:8500/v1/kv/config/app/name?keys=true # 获取指定索引之后的数据 curl http://localhost:8500/v1/kv/config/?recurse=true&index=100
应用场景
1. 动态配置管理
bash# 存储应用配置 consul kv put config/app/database/host "localhost" consul kv put config/app/database/port "5432" consul kv put config/app/database/user "admin" # 应用启动时读取配置 curl http://localhost:8500/v1/kv/config/app/database/host?raw
2. 服务协调
分布式锁:
bash# 获取锁 consul kv put -acquire lock/service1 "owner1" # 释放锁 consul kv put -release lock/service1 "owner1" # 设置锁超时 consul kv put -acquire -ttl=30s lock/service1 "owner1"
领导选举:
bash# 参与选举 consul kv put -acquire leader/election "node1" # 检查当前领导者 consul kv get leader/election
3. 特性开关
bash# 启用新功能 consul kv put features/new_feature "true" # 读取特性开关 curl http://localhost:8500/v1/kv/features/new_feature?raw
4. 服务元数据
bash# 存储服务元数据 consul kv put metadata/service1/version "1.0.0" consul kv put metadata/service1/deploy_time "2024-01-01"
Watch 机制
Consul KV 支持 Watch 机制,可以监听键值变化:
bash# 监听键变化 consul watch -type=key -key=config/app/name /bin/cat # 监听前缀变化 consul watch -type=keyprefix -prefix=config/ /bin/cat
事务操作
Consul 支持原子性的事务操作:
json{ "KV": [ { "Verb": "set", "Key": "config/app/host", "Value": "aGVsbG8=" }, { "Verb": "set", "Key": "config/app/port", "Value": "ODA4MA==" } ] }
bashcurl -X PUT -d @transaction.json http://localhost:8500/v1/txn
ACL 权限控制
Consul KV 支持 ACL(Access Control List)进行权限控制:
bash# 创建策略 consul acl policy create -name kv-policy -rules @kv-policy.hcl # kv-policy.hcl 内容 key_prefix "config/" { policy = "read" } key_prefix "secrets/" { policy = "deny" }
最佳实践
1. 键命名规范
shell# 使用层级结构 config/{service}/{environment}/{key} metadata/{service}/{key} locks/{resource}/{id}
2. 数据版本管理
bash# 使用版本号 config/app/v1/database/host config/app/v2/database/host # 使用时间戳 config/app/20240101/database/host
3. 数据备份
bash# 定期备份 consul kv export > backup_$(date +%Y%m%d).json # 恢复数据 consul kv import < backup_20240101.json
4. 监控和告警
bash# 监控键值变化 consul watch -type=key -key=secrets/ /usr/local/bin/alert.sh
与其他工具集成
Spring Cloud Consul
java@RefreshScope @RestController public class ConfigController { @Value("${app.name}") private String appName; @GetMapping("/config") public String getConfig() { return appName; } }
Go Consul SDK
gokv := client.KV() pair, _, err := kv.Get("config/app/name", nil) if err != nil { log.Fatal(err) } fmt.Printf("Value: %s\n", string(pair.Value))
Consul KV Store 是一个简单而强大的分布式配置中心,适合各种微服务架构的配置管理需求。