Golang中的Consul KV工具使用指南

Golang中的Consul KV工具使用指南 该工具可便捷地访问 Consul 的键/值存储。它可用作服务配置工具,并支持热更新。

GitHub

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解析可以轻松实现配置热更新,无需重启服务即可应用新配置。

回到顶部