Golang配置管理Viper的實(shí)現(xiàn)
viper簡(jiǎn)介
Viper 是一個(gè)完整的 Go 應(yīng)用程序配置解決方案,優(yōu)勢(shì)就在于開(kāi)發(fā)項(xiàng)目中你不必去操心配置文件的格式而是讓你騰出手來(lái)專注于項(xiàng)目的開(kāi)發(fā)。其特性如下:
- 支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多種格式的配置文件
- 可以設(shè)置監(jiān)聽(tīng)配置文件的修改,修改時(shí)自動(dòng)加載新的配置
- 從環(huán)境變量、命令行選項(xiàng)和io.Reader,遠(yuǎn)程K/V中讀取配置
- 從遠(yuǎn)程配置系統(tǒng)中讀取和監(jiān)聽(tīng)修改,如 etcd/Consul
- 代碼邏輯中顯示設(shè)置鍵值
總結(jié)起來(lái)就是支持多種類型,支持動(dòng)態(tài)更新,而且非常便捷。畢竟大家都用的東西肯定是得到了大部分人的認(rèn)可!
基本使用
使用流程可以概括為設(shè)置文件名(SetConfigName)、配置類型(SetConfigType )和搜索路徑( AddConfigPath),然后讀取配置(ReadInConfig)。
因?yàn)閂iper沒(méi)有默認(rèn)配置,因?yàn)樾枰诔跏蓟案嬖V上面這些信息
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中獲取配置值得方式
如下有一個(gè)redis的yaml文件的配置
redis: user:admin password: 123456 host: 127.0.0.1 port: 6379 database: 0
主要有以下方式獲取配置的值,沒(méi)有找到對(duì)應(yīng)的值將返回對(duì)應(yīng)類型的零值,比如 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,將會(huì)以map[struct{}]的形式解析。或者只需要一部分配置時(shí),比如解析到struct可以用UnmarshalKey,其實(shí)redis就是Key指的是對(duì)應(yīng)的redis配置的父節(jié)點(diǎn)。
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將設(shè)置并覆蓋配置值
監(jiān)聽(tīng)讀取配置
運(yùn)行時(shí)動(dòng)態(tài)讀取更新配置能力是非常方便的,如果不能動(dòng)態(tài)更新配置,那么線上的服務(wù)要修改某個(gè)配置就不得不重啟服務(wù),Viper支持在程序運(yùn)行時(shí)動(dòng)態(tài)的監(jiān)聽(tīng)配置。只需告訴viper實(shí)例watchConfig,前提是在基本使用部分一樣設(shè)置文件名,類型等配置
viper.WatchConfig() viper.OnConfigChange(func(e fsnotify.Event) { // 配置文件發(fā)生變更之后會(huì)調(diào)用的回調(diào)函數(shù) fmt.Println("Config file changed:", e.Name) })
配置說(shuō)明:WatchConfig()方法、OnConfigChange()方法。WatchConfig()方法用來(lái)開(kāi)啟事件監(jiān)聽(tīng),確定用戶操作文件后該文件是否可正常讀取,并將內(nèi)容注入到viper實(shí)例的config字段
viper的動(dòng)態(tài)監(jiān)聽(tīng)配置時(shí)使用的fsnotify,fsnotify是用來(lái)監(jiān)控目錄及文件的第三方庫(kù); watcher, err := fsnotify.NewWatcher() 用來(lái)建立新的監(jiān)視處理程序,它會(huì)開(kāi)啟一個(gè)協(xié)程開(kāi)始等待讀取事件,完成 從I / O完成端口讀取任務(wù),將事件注入到Event對(duì)象中,即Watcher.Events,具體大家可以看看源碼。
讀取遠(yuǎn)程配置
從Etcd中或Consul中讀取配置,在Viper中啟用遠(yuǎn)程支持需要導(dǎo)入viper/remote這個(gè)包,并且使用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)
總結(jié)
Viper基本的使用介紹就這些了, 雖然viper支持多配置同時(shí)使用,但是一個(gè)Viper實(shí)例只能尋一個(gè)配置路徑。至于很多細(xì)節(jié)我們多去實(shí)踐就很清楚啦
到此這篇關(guān)于Golang配置管理Viper的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Golang配置管理Viper內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang標(biāo)準(zhǔn)庫(kù)crc32的使用樣例
根據(jù)實(shí)驗(yàn)我們知道crc32算法比md5算法快4倍左右,所以研究了下golang的crc32使用,這篇文章主要給大家介紹了關(guān)于golang標(biāo)準(zhǔn)庫(kù)crc32使用的相關(guān)資料,需要的朋友可以參考下2024-03-03golang?gorm實(shí)現(xiàn)get請(qǐng)求查詢案例測(cè)試
這篇文章主要為大家介紹了golang?gorm實(shí)現(xiàn)get請(qǐng)求查詢案例測(cè)試,2022-04-04golang基礎(chǔ)之reflect反射的實(shí)現(xiàn)
Golang反射通過(guò)TypeOf/ValueOf實(shí)現(xiàn)接口與反射對(duì)象的轉(zhuǎn)換,可動(dòng)態(tài)獲取和修改值,本文主要介紹了golang基礎(chǔ)之reflect反射的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2025-06-06GO?CountMinSketch計(jì)數(shù)器(布隆過(guò)濾器思想的近似計(jì)數(shù)器)
這篇文章主要介紹了GO?CountMinSketch計(jì)數(shù)器(布隆過(guò)濾器思想的近似計(jì)數(shù)器),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09GoZero實(shí)現(xiàn)數(shù)據(jù)庫(kù)MySQL單例模式連接的簡(jiǎn)單示例
在 GoZero 框架中實(shí)現(xiàn)數(shù)據(jù)庫(kù)的單例連接可以通過(guò)以下步驟來(lái)完成,GoZero 使用 gorm 作為默認(rèn)的數(shù)據(jù)庫(kù)操作框架,接下來(lái)我會(huì)展示一個(gè)簡(jiǎn)單的單例模式實(shí)現(xiàn),需要的朋友可以參考下2025-02-02Go語(yǔ)言實(shí)現(xiàn)超時(shí)的三種方法實(shí)例
超時(shí)在一些業(yè)務(wù)場(chǎng)景里非常普遍,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言實(shí)現(xiàn)超時(shí)的三種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Go語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-07-07golang實(shí)現(xiàn)數(shù)組分割的示例代碼
本文主要介紹了golang實(shí)現(xiàn)數(shù)組分割的示例代碼,要求把數(shù)組分割成多個(gè)正整數(shù)大小的數(shù)組,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12