Golang配置管理Viper的實現(xiàn)
viper簡介
Viper 是一個完整的 Go 應用程序配置解決方案,優(yōu)勢就在于開發(fā)項目中你不必去操心配置文件的格式而是讓你騰出手來專注于項目的開發(fā)。其特性如下:
- 支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多種格式的配置文件
- 可以設置監(jiān)聽配置文件的修改,修改時自動加載新的配置
- 從環(huán)境變量、命令行選項和io.Reader,遠程K/V中讀取配置
- 從遠程配置系統(tǒng)中讀取和監(jiān)聽修改,如 etcd/Consul
- 代碼邏輯中顯示設置鍵值
總結起來就是支持多種類型,支持動態(tài)更新,而且非常便捷。畢竟大家都用的東西肯定是得到了大部分人的認可!
基本使用
使用流程可以概括為設置文件名(SetConfigName)、配置類型(SetConfigType )和搜索路徑( AddConfigPath),然后讀取配置(ReadInConfig)。
因為Viper沒有默認配置,因為需要在初始化前告訴上面這些信息
viperConfig.SetConfigName("config")
viperConfig.SetConfigType("yaml")
viperConfig.AddConfigPath("/etc/appname/")
err := viperConfig.ReadInConfig()
if err != nil {
panic(fmt.Errorf("Fatal error config file: %w \n", err))
}
從Viper中獲取配置值得方式
如下有一個redis的yaml文件的配置
redis:
user:admin
password: 123456
host: 127.0.0.1
port: 6379
database: 0
主要有以下方式獲取配置的值,沒有找到對應的值將返回對應類型的零值,比如 int返回0
Get(key string) : interface{}
GetBool(key string) : bool
GetFloat64(key string) : float64
GetInt(key string) : int
GetIntSlice(key string) : []int
GetString(key string) : string
GetStringMap(key string) : map[string]interface{}
GetStringMapString(key string) : map[string]string
GetStringSlice(key string) : []string
GetTime(key string) : time.Time
GetDuration(key string) : time.Duration
IsSet(key string) : bool
AllSettings() : map[string]interface{}
獲取嵌套類型的user的值
GetString("redis.user")
如果你需要一次性加載所有文件到并解析到變量中,可以用viper.Unmarshal,將會以map[struct{}]的形式解析?;蛘咧恍枰徊糠峙渲脮r,比如解析到struct可以用UnmarshalKey,其實redis就是Key指的是對應的redis配置的父節(jié)點。
viper.Unmarshal(&ConfigSetting)
viper.UnmarshalKey("redis", ¶m.RedisConfig)
從IO/Reader中獲取配置
自定義配置源
viper.SetConfigType("yaml")
// 你的程序需要的任何配置,如下
var yamlDemo = []byte(`
name: zhangsan
age:18
`)
viper.ReadConfig(bytes.NewBuffer(yamlDemo))
viper.Get("name") //獲取到的值是zhangsan
io.Reader讀取配置,Viper.Set將設置并覆蓋配置值
監(jiān)聽讀取配置
運行時動態(tài)讀取更新配置能力是非常方便的,如果不能動態(tài)更新配置,那么線上的服務要修改某個配置就不得不重啟服務,Viper支持在程序運行時動態(tài)的監(jiān)聽配置。只需告訴viper實例watchConfig,前提是在基本使用部分一樣設置文件名,類型等配置
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
// 配置文件發(fā)生變更之后會調(diào)用的回調(diào)函數(shù)
fmt.Println("Config file changed:", e.Name)
})
配置說明:WatchConfig()方法、OnConfigChange()方法。WatchConfig()方法用來開啟事件監(jiān)聽,確定用戶操作文件后該文件是否可正常讀取,并將內(nèi)容注入到viper實例的config字段
viper的動態(tài)監(jiān)聽配置時使用的fsnotify,fsnotify是用來監(jiān)控目錄及文件的第三方庫; watcher, err := fsnotify.NewWatcher() 用來建立新的監(jiān)視處理程序,它會開啟一個協(xié)程開始等待讀取事件,完成 從I / O完成端口讀取任務,將事件注入到Event對象中,即Watcher.Events,具體大家可以看看源碼。
讀取遠程配置
從Etcd中或Consul中讀取配置,在Viper中啟用遠程支持需要導入viper/remote這個包,并且使用viper.AddRemoteProvider
import _ "github.com/spf13/viper/remote"
viper.AddSecureRemoteProvider("etcd",
"https://127.0.0.1:2379",
"conf.yaml",
"key_path")
viper.SetConfigType("yaml")
err := viper.ReadRemoteConfig()
viper.Unmarshal(&remoteConfig)
if err != nil {
panic(err)
總結
Viper基本的使用介紹就這些了, 雖然viper支持多配置同時使用,但是一個Viper實例只能尋一個配置路徑。至于很多細節(jié)我們多去實踐就很清楚啦
到此這篇關于Golang配置管理Viper的實現(xiàn)的文章就介紹到這了,更多相關Golang配置管理Viper內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
golang?gorm實現(xiàn)get請求查詢案例測試
這篇文章主要為大家介紹了golang?gorm實現(xiàn)get請求查詢案例測試,2022-04-04
GO?CountMinSketch計數(shù)器(布隆過濾器思想的近似計數(shù)器)
這篇文章主要介紹了GO?CountMinSketch計數(shù)器(布隆過濾器思想的近似計數(shù)器),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-09-09
GoZero實現(xiàn)數(shù)據(jù)庫MySQL單例模式連接的簡單示例
在 GoZero 框架中實現(xiàn)數(shù)據(jù)庫的單例連接可以通過以下步驟來完成,GoZero 使用 gorm 作為默認的數(shù)據(jù)庫操作框架,接下來我會展示一個簡單的單例模式實現(xiàn),需要的朋友可以參考下2025-02-02

