go 获取 consul 的配置信息

go 获取 consul 的配置信息

之前向 consul 创建微服务,调用微服务成功。这里就 用 consul 做配置 中心,从 consul 读取配置

consul 配置

  1. http://0.0.0.0:8500 访问 consul
  2. 点击 Key/Value 配置
    在这里插入图片描述点击 Create 按钮创建 Key/Value 配置
  3. name/ 创建目录,name 创建 Key/Value 键值对
    在这里插入图片描述

golang 读取配置

加载 consul 配置中心

package consul

import (
	"github.com/micro/go-micro/v2/config"
	"github.com/micro/go-plugins/config/source/consul/v2"
)

var consulConfigList map[string]interface{}

// 加载 consul 配置
func LoadConsulConfig(address, prefix string) (config.Config, error) {
 	//添加配置中心
    //配置中心使用consul key/value 模式
    consulSource := consul.NewSource(
        //设置配置中心地址
        consul.WithAddress(address),
        //设置前缀,不设置默认为 /micro/config
        consul.WithPrefix(prefix),
        //是否移除前缀,这里设置为true 表示可以不带前缀直接获取对应配置
        consul.StripPrefix(true),
    )
    //配置初始化
    conf, err := config.NewConfig()
    if err != nil {
        return conf, err
    }
    //加载配置
    err = conf.Load(consulSource)

	return conf, nil
}

// ...string 用做参数
// ... 参数语法形成了可变参数的参数。它将接受零个或多个参数,并将它们作为切⽚引⽤
func GetConsulConfig(config config.Config, configStruct interface{}, key ...string) error {
    //获取配置
    err := config.Get(key...).Scan(configStruct)
    if err != nil {
        return err
    }
    return nil
}

下面以 mysql 配置为例 读取配置信息

package consul

import (
	"fmt"
)

// MysqlConfig 创建结构体
type MysqlConfig struct {
    Host     string `json:"host"`
    User     string `json:"user"`
    Pwd      string `json:"pwd"`
    Database string `json:"database"`
    Port     int64  `json:"port"`
}

func Demo(){
	// 加载 consul 配置
	config, err := LoadConsulConfig("127.0.0.1:8500", "")
	if err != nil {
		fmt.Println("加载 consul 配置, err:", err)
		return
	}

	mysqlConfig := &MysqlConfig{}

	// 获取 MySQL 配置
	err = GetConsulConfig(config, &mysqlConfig, "mysql")
	if err != nil {
		fmt.Println("获取 MySQL 配置, err:", err)
		return
	}

	fmt.Println(mysqlConfig)
}

//设置前缀,不设置默认为 /micro/config
consul.WithPrefix(prefix),
//是否移除前缀,这里设置为true 表示可以不带前缀直接获取对应配置
consul.StripPrefix(true),
这里 prefix 传空,读取的配置是 根目录 的 Key/Value 配置信息

### 如何在Go项目中使用Consul作为配置管理中心 #### 使用场景与优势 Consul 是一个分布式的服务网格解决方案,提供了服务发现、健康检查以及键值存储等功能。通过 Consul 的键值对功能可以实现动态配置管理,在微服务架构下尤为适用[^1]。 #### 安装依赖包 为了使 Go 应用能够连接并操作 Consul ,需要引入官方 SDK `github.com/hashicorp/consul/api` 。可以通过如下命令安装: ```bash go get github.com/hashicorp/consul/api ``` #### 初始化客户端实例 创建一个新的 consul client 实例来访问远程服务器上的数据: ```go config := api.DefaultConfig() client, err := api.NewClient(config) if err != nil { log.Fatal(err) } ``` #### 获取配置项 假设已经在 consul 中设置了名为 "web/db_host" 和 "web/db_port" 的 key-value 对,则可以在程序里这样读取它们: ```go kv := client.KV() pair, _, err := kv.Get("web/db_host", nil) dbHost := string(pair.Value) portPair, _, err := kv.Get("web/db_port", nil) dbPort := string(portPair.Value) ``` #### 设置默认值和错误处理机制 考虑到某些情况下可能不存在特定路径下的 value 或者网络请求失败等问题,建议加入合理的 fallback logic 及 error handling : ```go func getConfig(key string) (string, error){ pair, _, err := kv.Get(key,nil) if err!=nil{ return "",err } if pair==nil || len(pair.Value)==0{ return "",fmt.Errorf("%s not found or empty",key) } return string(pair.Value),nil } // Usage example with default values provided when config missing from Consul. var dbHost = os.Getenv("DB_HOST") // Fallback to environment variable first if val,err:=getConfig("web/db_host");err==nil && val!=""{ dbHost=val }else if dbHost==""{ // If still no valid value after checking both sources, // then panic because this is critical information required by application. panic(fmt.Sprintf("Failed to obtain database host configuration: %v", err)) } ``` #### 自动刷新配置 对于一些非敏感且允许热更新的参数来说,可以让应用程序定期轮询最新版本的数据从而达到自动适应变化的目的;而对于那些重要的设置则应该采用更稳妥的方式比如重启进程加载新环境变量等方法来进行同步。 #### 配置监听器模式 另一种更好的做法是利用 watch API 来构建事件驱动型的设计思路——每当指定前缀范围内的任意一项发生变动时就会触发回调函数执行相应逻辑,而无需主动发起查询动作。 ```go watcher, err := client.Watch(&api.KVPair{Key:"web/"}, &api.QueryOptions{}, func(p *api.KVPair, index uint64) bool { fmt.Printf("KV changed at Index=%d\n",index) // Process changes here... return true }) defer watcher.Stop() // Remember stopping goroutine on exit! ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值