初識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")
如有錯誤請留言反饋