使用Viper讀取Nacos配置(開源)
一、前言
目前Viper支援的Remote遠端讀取配置如 etcd, consul;目前還沒有對Nacos進行支援,本文中將開源一個Nacos的Viper支援庫, 開源地址在文章的最下方.
實現這個倉庫的主要目的是為了,最終整合到我們的yoyogo框架中。
二、什麼是Viper
Viper是適用於Go應用程式的完整配置解決方案。它被設計用於在應用程式中工作,並且可以處理所有型別的配置需求和格式。
2.1 它支援以下特性:
- 設定預設值
- 從JSON、TOML、YAML、HCL、envfile和Java properties格式的配置檔案讀取配置資訊
- 實時監控和重新讀取配置檔案(可選)
- 從環境變數中讀取
- 從遠端配置系統remote(etcd或Consul)讀取並監控配置變化
- 從命令列引數讀取配置
- 從buffer讀取配置
- 顯式配置值
2.2 讀取本地檔案
viper.SetConfigFile("./config.yaml") // 指定配置檔案路徑
viper.SetConfigName("config") // 配置檔名稱(無副檔名)
viper.SetConfigType("yaml") // 如果配置檔案的名稱中沒有副檔名,則需要配置此項
viper.AddConfigPath("/etc/appname/") // 查詢配置檔案所在的路徑
viper.AddConfigPath("$HOME/.appname") // 多次呼叫以新增多個搜尋路徑
viper.AddConfigPath(".") // 還可以在工作目錄中查詢配置
err := viper.ReadInConfig() // 查詢並讀取配置檔案
if err != nil { // 處理讀取配置檔案的錯誤
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
本篇文章重點著重於remote部分,Nacos的支援.
Viper remote
在Viper中啟用遠端支援,需要在程式碼中匿名匯入viper/remote這個包。
import _ "github.com/spf13/viper/remote"
通過remote,Viper將支援讀取從Key/Value儲存( 例如etcd或Consul或本文中的Nacos ).
Viper載入配置值的優先順序
磁碟上的配置檔案 > 命令列標誌位 > 環境變數 > 遠端Key/Value儲存 > 預設值 。
Nacos 支援
引用我們的開源庫 https://github.com/yoyofxteam/nacos-viper-remote
import (
"github.com/spf13/viper"
remote "github.com/yoyofxteam/nacos-viper-remote"
)
在專案中使用:
runtime_viper := viper.New()
// 配置 Viper for Nacos 的遠端倉庫引數
remote.SetOptions(&remote.Option{
Url: "localhost", // nacos server 多地址需要地址用;號隔開,如 Url: "loc1;loc2;loc3"
Port: 80, // nacos server埠號
NamespaceId: "public", // nacos namespace
GroupName: "DEFAULT_GROUP", // nacos group
Config: remote.Config{ DataId: "config_dev" }, // nacos DataID
Auth: nil, // 如果需要驗證登入,需要此引數
})
err := remote_viper.AddRemoteProvider("nacos", "localhost", "")
remote_viper.SetConfigType("yaml")
_ = remote_viper.ReadRemoteConfig() //sync get remote configs to remote_viper instance memory . for example , remote_viper.GetString(key)
_ = remote_viper.WatchRemoteConfigOnChannel() //非同步監聽Nacos中的配置變化,如發生配置更改,會直接同步到 viper例項中。
appName := remote_viper.GetString("key") // sync get config by key
fmt.Println(appName)
// 這裡不是必須的,只為了監控Demo中的配置變化,並列印出來
go func() {
for {
time.Sleep(time.Second * 30) // 每30秒檢查配置是否發生變化
appName = config_viper.GetString("yoyogo.application.name")
fmt.Println(appName)
}
}()
最後
實現這個倉庫的主要目的是為了,最終整合到我們的yoyogo框架中。
本文提及的開源庫地址:
nacos-viper-remote
https://github.com/yoyofxteam/nacos-viper-remote
yoyogo
https://github.com/yoyofx/yoyogo
?? YoyoGo is a simple, light and fast , dependency injection based micro-service framework written in Go. Support Nacos ,Consoul ,Etcd ,Eureka ,kubernetes.