kratos微服務框架使用nacos作為遠端配置中心
阿新 • • 發佈:2021-11-03
初識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")