【短小精悍的Go輪子】Viper(一)

前言


在咱們開發過程當中,像數據庫信息、郵件配置和其餘的第三方服務密鑰等這些固定的信息都會寫在配置文件中,而配置文件又有多種表現形式和格式,有 JSON, TOML, YAML各類格式,並且測試環境,開發環境和生產環境用的配置文件也不是同一份,那就讓咱們說說Go 中用於加載配置信息的Viper。git

什麼是Viper?


Viper是Go應用程序的完整配置解決方案,包括12-Factor應用程序。它旨在在應用程序中工做,並能夠處理全部類型的配置需求和格式。它支持:github

  • 設置默認值
  • 從JSON,TOML,YAML,HCL和Java屬性配置文件中讀取
  • 實時觀看和從新讀取配置文件(可選)
  • 從環境變量中讀取
  • 從遠程配置系統(etcd或Consul)讀取,並觀察變化
  • 從命令行標誌讀取
  • 從緩衝區讀取
  • 設置顯式值

Viper能夠被認爲是全部應用程序配置需求的註冊表。數據庫

爲何要使用Viper


在構建現代應用程序時,您沒必要擔憂配置文件格式; 你能夠專一於構建出色的軟件。 Viper 能夠作以下工做:json

  • 加載並解析JSON、TOML、YAML、HCL 或 Java properties 格式的配置文件
  • 能夠爲各類配置項設置默認值
  • 能夠在命令行中指定配置項來覆蓋配置值
  • 提供了別名系統,能夠不破壞現有代碼來實現參數重命名
  • 能夠很容易地分辨出用戶提供的命令行參數或配置文件與默認相同的區別

Viper讀取配置信息的優先級順序,從高到低,以下:bash

  • 顯式調用Set函數
  • 命令行參數
  • 環境變量
  • 配置文件
  • key/value 存儲系統
  • 默認值
  • Viper 的配置項的key不區分大小寫。

若是使用Viper


使用 go get -u github.com/spf13/viper 進行安裝ide

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的文件✅測試

相對於寫入配置文件的操做,讀取配置文件在代碼中反而會常見得多spa

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代碼短小精悍,就三個文件,很是適合初學者閱讀,若是有須要,之後會出源碼閱讀篇。

相關文章
相關標籤/搜索