Golang中的Consul KV工具使用指南
Golang中的Consul KV工具使用指南 该工具可便捷地访问 Consul 的键/值存储。它可用作服务配置工具,并支持热更新。
lockp111/consul-kv
一个用于 Golang 的 Consul KV 工具包。通过在 GitHub 上创建账户,为 lockp111/consul-kv 的开发做出贡献。
更多关于Golang中的Consul KV工具使用指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Golang中的Consul KV工具使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这是一个非常实用的Consul KV工具包,我来详细介绍一下它的核心功能和使用方法。
核心特性
这个工具包封装了Consul KV存储的常用操作,主要特点包括:
- 支持键值对的增删改查
- 支持配置热更新
- 支持JSON格式数据的自动序列化和反序列化
- 提供Watch机制监听配置变化
基本使用示例
package main
import (
"fmt"
"log"
"time"
consulkv "github.com/lockp111/consul-kv"
)
func main() {
// 1. 初始化客户端
client, err := consulkv.NewClient(&consulkv.Config{
Address: "127.0.0.1:8500",
Token: "", // 如果有ACL token
})
if err != nil {
log.Fatal(err)
}
defer client.Close()
// 2. 设置键值对
err = client.Set("myapp/config/database", `{
"host": "localhost",
"port": 3306,
"username": "root",
"password": "secret"
}`)
if err != nil {
log.Fatal(err)
}
// 3. 获取键值对
value, err := client.Get("myapp/config/database")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Database config: %s\n", value)
// 4. 获取JSON格式并解析到结构体
type DBConfig struct {
Host string `json:"host"`
Port int `json:"port"`
Username string `json:"username"`
Password string `json:"password"`
}
var dbConfig DBConfig
err = client.GetJSON("myapp/config/database", &dbConfig)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Parsed config: %+v\n", dbConfig)
}
配置热更新示例
func watchConfig() {
client, err := consulkv.NewClient(&consulkv.Config{
Address: "127.0.0.1:8500",
})
if err != nil {
log.Fatal(err)
}
defer client.Close()
// 定义配置结构
type AppConfig struct {
LogLevel string `json:"log_level"`
Timeout int `json:"timeout"`
Features []string `json:"features"`
}
var config AppConfig
// 初始获取配置
err = client.GetJSON("myapp/config/app", &config)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Initial config: %+v\n", config)
// 监听配置变化
stopChan := make(chan struct{})
go func() {
err = client.Watch("myapp/config/app", &config, stopChan, func(err error) {
if err != nil {
log.Printf("Watch error: %v", err)
return
}
fmt.Printf("Config updated: %+v\n", config)
})
if err != nil {
log.Printf("Watch failed: %v", err)
}
}()
// 运行一段时间后停止监听
time.Sleep(5 * time.Minute)
close(stopChan)
}
批量操作示例
func batchOperations() {
client, err := consulkv.NewClient(&consulkv.Config{
Address: "127.0.0.1:8500",
})
if err != nil {
log.Fatal(err)
}
defer client.Close()
// 批量设置配置
configs := map[string]interface{}{
"myapp/config/database": map[string]interface{}{
"host": "localhost",
"port": 3306,
},
"myapp/config/redis": map[string]interface{}{
"addr": "localhost:6379",
"db": 0,
},
"myapp/config/cache_ttl": 300,
}
for key, value := range configs {
err := client.SetJSON(key, value)
if err != nil {
log.Printf("Failed to set %s: %v", key, err)
}
}
// 列出指定前缀的所有键
keys, err := client.List("myapp/config/")
if err != nil {
log.Fatal(err)
}
fmt.Println("All config keys:")
for _, key := range keys {
fmt.Printf("- %s\n", key)
}
// 删除配置
err = client.Delete("myapp/config/cache_ttl")
if err != nil {
log.Printf("Failed to delete: %v", err)
}
}
错误处理示例
func errorHandling() {
client, err := consulkv.NewClient(&consulkv.Config{
Address: "127.0.0.1:8500",
})
if err != nil {
log.Fatal("Failed to create client:", err)
}
defer client.Close()
// 检查键是否存在
exists, err := client.Exists("myapp/config/nonexistent")
if err != nil {
log.Printf("Error checking existence: %v", err)
} else {
fmt.Printf("Key exists: %v\n", exists)
}
// 获取不存在的键(返回特定错误)
_, err = client.Get("myapp/config/nonexistent")
if err != nil {
if err == consulkv.ErrKeyNotFound {
fmt.Println("Key not found, this is expected")
} else {
log.Printf("Unexpected error: %v", err)
}
}
}
这个工具包通过简洁的API封装了Consul KV存储的核心功能,特别适合用作微服务配置中心。Watch机制配合JSON解析可以轻松实现配置热更新,无需重启服务即可应用新配置。

