golang,go,博客,开源,编程

viper从nacos获取配置

Published on with 0 views and 0 comments

Viper 作为一个灵活的配置管理库,虽然没有直接内置对 Nacos 的支持,但你可以通过将 Nacos 客户端与 Viper 配合使用,从 Nacos 获取配置数据并将其加载到 Viper 中。Nacos 是一个开源的动态服务发现、配置管理和服务管理平台,常用于微服务架构中。

为了实现从 Nacos 获取配置并与 Viper 结合,你可以使用 nacos-sdk-go(Nacos 的 Go 客户端)来从 Nacos 获取配置,然后将其与 Viper 结合。

1. 安装依赖

首先,安装 Vipernacos-sdk-go

go get github.com/spf13/viper
go get github.com/nacos-group/nacos-sdk-go/v2

2. Nacos 客户端设置

Nacos 客户端用于从 Nacos 服务器获取配置。你需要设置好 Nacos 的服务器地址和其他参数。

3. 从 Nacos 获取配置并加载到 Viper

假设我们已经在 Nacos 中存储了类似如下的配置:

{
  "app": {
    "name": "MyApp",
    "port": 8080
  }
}

4. 示例代码

下面的示例代码展示了如何通过 nacos-sdk-goNacos 获取配置并加载到 Viper 中。

package main

import (
	"fmt"
	"github.com/spf13/viper"
	"github.com/nacos-group/nacos-sdk-go/v2/common/constant"
	"github.com/nacos-group/nacos-sdk-go/v2/config"
	"log"
	"time"
)

func main() {
	// 初始化 Nacos 客户端配置
	serverConfig := []constant.ServerConfig{
		{
			IpAddr: "127.0.0.1", // Nacos 服务器地址
			ContextPath: "/nacos",
			Port: 8848, // 默认端口
		},
	}

	clientConfig := constant.ClientConfig{
		NamespaceId:         "public", // Nacos Namespace ID
		TimeoutMs:           5000,
		NotLoadCacheAtStart: true,
		LogLevel:            "debug",
	}

	// 创建 Nacos 配置客户端
	configClient, err := config.NewConfigClient(config.WithServerConfigs(serverConfig), config.WithClientConfig(clientConfig))
	if err != nil {
		log.Fatalf("create config client failed, err: %v", err)
		return
	}

	// 从 Nacos 获取配置,指定 dataId 和 group
	dataID := "config-app"
	group := "DEFAULT_GROUP"

	// 获取配置文件
	content, err := configClient.GetConfig(vo.ConfigParam{
		DataId: dataID,
		Group:  group,
	})
	if err != nil {
		log.Fatalf("get config from Nacos failed, err: %v", err)
		return
	}

	// 打印从 Nacos 获取的配置内容
	fmt.Println("Nacos Config Content:")
	fmt.Println(content)

	// 将从 Nacos 获取到的配置加载到 Viper 中
	// 假设配置文件内容为 JSON 格式
	viper.SetConfigType("json") // 可以根据你的配置格式选择 json/yaml/toml 等
	err = viper.ReadConfig(content)
	if err != nil {
		log.Fatalf("load config into Viper failed, err: %v", err)
		return
	}

	// 使用 Viper 获取配置
	appName := viper.GetString("app.name")
	port := viper.GetInt("app.port")

	// 打印读取到的配置
	fmt.Printf("App Name: %s\n", appName)
	fmt.Printf("App Port: %d\n", port)

	// 监听 Nacos 配置变更(可选)
	err = configClient.ListenConfig(vo.ConfigParam{
		DataId: dataID,
		Group:  group,
		OnChange: func(namespace, group, dataId, data string) {
			// 配置变更回调
			fmt.Printf("Nacos Config Changed: %s\n", data)
			// 更新 Viper 中的配置
			viper.SetConfigType("json")
			err = viper.ReadConfig([]byte(data))
			if err != nil {
				log.Printf("Error reading new config from Nacos: %v", err)
				return
			}
			// 打印更新后的配置
			appName = viper.GetString("app.name")
			port = viper.GetInt("app.port")
			fmt.Printf("Updated App Name: %s\n", appName)
			fmt.Printf("Updated App Port: %d\n", port)
		},
	})

	// 程序阻塞,保持监听配置变化
	select {}
}

代码解析

  1. Nacos 客户端配置
    • serverConfig:配置了 Nacos 服务器的 IP 地址和端口。
    • clientConfig:配置了客户端的参数,包括命名空间(NamespaceId)、超时时间(TimeoutMs)等。
  2. 从 Nacos 获取配置
    • 使用 configClient.GetConfig 方法从 Nacos 获取配置文件。这里假设我们从 Nacos 获取 JSON 格式的配置,dataID 是配置文件的唯一标识,group 是配置的组。
  3. 将配置加载到 Viper 中
    • 使用 viper.SetConfigType("json") 设置配置类型为 JSON 格式。
    • 使用 viper.ReadConfig(content) 方法将从 Nacos 获取的配置内容加载到 Viper 中。
  4. 监听配置变更
    • configClient.ListenConfig 用于监听配置变化。当 Nacos 中的配置发生变化时,会触发 OnChange 回调函数,回调中会更新 Viper 中的配置。
  5. 获取配置
    • 使用 viper.GetStringviper.GetInt 方法从 Viper 中获取配置项。
  6. 程序阻塞
    • 通过 select {} 使程序阻塞,从而持续监听配置的变化。

5. 配置变更的监听

通过 ListenConfig 方法,Nacos 客户端可以监听配置的变化,收到变化时会调用回调函数,在回调中你可以更新 Viper 中的配置。上面代码中,当 Nacos 中的配置发生变化时,Viper 会动态加载新配置。

6. 总结

通过将 NacosViper 结合使用,你可以实现:

  1. Nacos 获取配置:通过 nacos-sdk-go 获取存储在 Nacos 中的配置信息。
  2. 使用 Viper 管理配置:将获取的配置加载到 Viper 中,利用 Viper 的 API 来访问和管理配置。
  3. 动态更新配置:通过 ListenConfig 监听 Nacos 配置变化,并动态更新 Viper 中的配置,实现热加载。

这种方式让你可以灵活地管理分布式系统中的配置,尤其适用于微服务架构中使用 Nacos 作为配置中心的场景。


标题:viper从nacos获取配置
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/01/07/1736215452677.html
联系:scotttu@163.com