【短小精悍的Go輪子】Viper(一)
阿新 • • 發佈:2019-12-31
前言
在我們開發過程中,像資料庫資訊、郵件配置和其他的第三方服務金鑰等這些固定的資訊都會寫在配置檔案中,而配置檔案又有多種表現形式和格式,有 JSON,TOML,YAML各種格式,而且測試環境,開發環境和生產環境用的配置檔案也不是同一份,那就讓我們說說Go 中用於載入配置資訊的Viper。
什麼是Viper?
Viper是Go應用程式的完整配置解決方案,包括12-Factor應用程式。它旨在在應用程式中工作,並可以處理所有型別的配置需求和格式。它支援:
- 設定預設值
- 從JSON,TOML,YAML,HCL和Java屬性配置檔案中讀取
- 實時觀看和重新讀取配置檔案(可選)
- 從環境變數中讀取
- 從遠端配置系統(etcd或Consul)讀取,並觀察變化
- 從命令列標誌讀取
- 從緩衝區讀取
- 設定顯式值
Viper可以被認為是所有應用程式配置需求的登入檔。
為什麼要使用Viper
在構建現代應用程式時,您不必擔心配置檔案格式; 你可以專注於構建出色的軟體。 Viper 可以做如下工作:
- 載入並解析JSON、TOML、YAML、HCL 或 Java properties 格式的配置檔案
- 可以為各種配置項設定預設值
- 可以在命令列中指定配置項來覆蓋配置值
- 提供了別名系統,可以不破壞現有程式碼來實現引數重新命名
- 可以很容易地分辨出使用者提供的命令列引數或配置檔案與預設相同的區別
Viper讀取配置資訊的優先順序順序,從高到低,如下:
- 顯式呼叫Set函式
- 命令列引數
- 環境變數
- 配置檔案
- key/value 儲存系統
- 預設值
- Viper 的配置項的key不區分大小寫。
如果使用Viper
使用 go get -u github.com/spf13/viper 進行安裝
const (
// gRPC 服務地址
Address = "0.0.0.0:9090"
)
......
複製程式碼
像上面這種地址寫死在程式碼裡,我們可以把它放入配置檔案中進行讀取,安裝完viper後,利用viper寫toml格式的檔案
func init(){
viper.SetConfigFile("hello.toml")//檔名
viper.Set("Address","0.0.0.0:9090" )//統一把Key處理成小寫 Address->address
err := viper.WriteConfig()//寫入檔案
if err != nil { // Handle errors reading the config file
panic(fmt.Errorf("Fatal error config file: %s \n",err))
}
}
複製程式碼
執行一下,會發現當前目錄會出現一個hello.toml的檔案✅
相對於寫入配置檔案的操作,讀取配置檔案在程式碼中反而會常見得多
viper.SetConfigFile("hello.toml")
err := viper.ReadInConfig() // 會查詢和讀取配置檔案
if err != nil { // Handle errors reading the config file
panic(fmt.Errorf("Fatal error config file: %s \n",err))
}
Address = viper.GetString("Address")
//key取Address或者address都能取到值,反正viper轉成小寫處理
fmt.Println(Address)
複製程式碼
其他用法
設定預設值
viper.SetDefault("ContentDir","content")
viper.SetDefault("LayoutDir","layouts")
viper.SetDefault("Taxonomies",map[string]string{"tag": "tags","category": "categories"})
複製程式碼
監聽配置變化
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("配置發生變更:",e.Name)
})
複製程式碼
讀取遠端 Key/Value
啟用該功能,需要匯入 viper/remot 包:
import _ "github.com/spf13/viper/remote"
viper.AddRemoteProvider("etcd","http://127.0.0.1:4001","/config/hello.json")
viper.SetConfigType("json") // 因為不知道格式,所以需要指定
err := viper.ReadRemoteConfig()
複製程式碼
其他
以下是全部程式碼截圖
總結
viper程式碼短小精悍,就三個檔案,非常適合初學者閱讀,如果有需要,以後會出原始碼閱讀篇。