1. 程式人生 > 其它 >kratos微服務框架使用nacos作為遠端配置中心

kratos微服務框架使用nacos作為遠端配置中心

初識nacos

nacos是阿里開源的一款用於動態服務發現、配置管理和服務管理的平臺。

官方介紹,Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您實現動態服務發現、服務配置管理、服務及流量管理。
Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以“服務”為中心的現代應用架構(例如微服務正規化、雲原生正規化)的服務基礎設施。
官方文件

nacos的安裝

根據文件啟動一個nacos
nacos快速開始
在nacos中建立一個配置

在kratos中使用

package config

import (
	"fmt"
	"strings"

	"github.com/fsnotify/fsnotify"

	"github.com/nacos-group/nacos-sdk-go/clients"
	"github.com/nacos-group/nacos-sdk-go/common/constant"
	"github.com/nacos-group/nacos-sdk-go/vo"
	"github.com/spf13/viper"
)

//定義nacos配置
var (
	defaultConfig *viper.Viper //遠端配置中心例項
	nacosIp       string       //nacosip地址
	nacosPort     uint64       //nacos埠
	nacosDataId   string       //nacos配置的DataID
	nacosGroup    string       //nacos配置的group分組
)

// ThisConf 初始化viper,讀取本地配置檔案(需在本地建立配置檔案)
func ThisConf() *viper.Viper {
	localConfig := viper.New()                                //新建本地配置中心例項
	localConfig.SetConfigFile("..\\..\\configs\\config.yaml") //指定本地配置檔案
	//讀取配置檔案
	if err := localConfig.ReadInConfig(); err != nil {
		panic(fmt.Errorf("Fatal error config file: %s \n", err))
	}
	//監控配置檔案變化
	localConfig.WatchConfig()
	localConfig.OnConfigChange(func(in fsnotify.Event) {
		fmt.Println("配置檔案熱載入。。。")
	})
	return localConfig
}

// NacosInit 註冊中心客戶端配置
func NacosInit() vo.NacosClientParam {
	localConfig := ThisConf()   //初始化viper
	defaultConfig = viper.New() //連線遠端的配置中心例項
	defaultConfig.SetConfigType("yaml") //配置的格式
	nacosIp = localConfig.GetString("nacos.ip")
	nacosPort = localConfig.GetUint64("nacos.prot")
	nacosDataId = localConfig.GetString("nacos.dataId")
	nacosGroup = localConfig.GetString("nacos.group")
	//連線註冊中心配置
	return vo.NacosClientParam{
		//客戶端配置
		ClientConfig: &constant.ClientConfig{
			NamespaceId:         localConfig.GetString("nacos.namespaceId"),
			TimeoutMs:           localConfig.GetUint64("nacos.timeoutMs"),
			NotLoadCacheAtStart: localConfig.GetBool("nacos.notLoadCacheAtStart"),
			LogDir:              localConfig.GetString("nacos.logDir"),
			CacheDir:            localConfig.GetString("nacos.cacheDir"),
			RotateTime:          localConfig.GetString("nacos.rotateTime"),
			MaxAge:              localConfig.GetInt64("nacos.maxAge"),
			LogLevel:            localConfig.GetString("nacos.logLevel"),
		},
		//服務端配置
		ServerConfigs: []constant.ServerConfig{
			{IpAddr: nacosIp, Port: nacosPort},
		},
	}
}

// InitConfig 初始化nacos配置中心
func InitConfig() *viper.Viper {
	nacosClient, err := clients.NewConfigClient(NacosInit())
	if err != nil {
		panic(fmt.Errorf("nacos初始化錯誤: %s \n", err))
	}
	content, err := nacosClient.GetConfig(vo.ConfigParam{DataId: nacosDataId, Group: nacosGroup})
	if err != nil {
		panic(fmt.Errorf("nacos讀取配置錯誤: %s \n", err))
	}
	err = defaultConfig.ReadConfig(strings.NewReader(content))
	if err != nil {
		panic(fmt.Errorf("Viper解析配置失敗: %s \n", err))
	}
	//配置監聽
	err = nacosClient.ListenConfig(vo.ConfigParam{
		DataId: nacosDataId,
		Group:  nacosGroup,
		OnChange: func(namespace, group, dataId, data string) {
			fmt.Println("config changed group:" + group + ", dataId:" + dataId + ", content:" + data)
			//使用viper解析配置
			err = defaultConfig.ReadConfig(strings.NewReader(data))
			if err != nil {
				panic(fmt.Errorf("Viper解析配置失敗: %s \n", err))
			}
		},
	})
	return defaultConfig
}

// GetConfig 獲取配置
func GetConfig() *viper.Viper {
	if defaultConfig == nil {
		defaultConfig = InitConfig()
	}
	return defaultConfig
}

本文中使用viper配置管理工具,未使用kratos推薦的使用proto生態方案

使用方法

在需要引用配置的地方引用GetConfig()方法

// 例
config.GetConfig().GetString("data.database.source")