欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang配置管理Viper的實(shí)現(xiàn)

 更新時(shí)間:2025年07月25日 09:30:23   作者:小許cod  
Viper是Go語(yǔ)言配置管理庫(kù),支持JSON/YAML/TOML等多格式,可動(dòng)態(tài)監(jiān)聽(tīng)配置變更,本文就來(lái)介紹一下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", &param.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的使用樣例

    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-03
  • golang?gorm實(shí)現(xiàn)get請(qǐng)求查詢案例測(cè)試

    golang?gorm實(shí)現(xiàn)get請(qǐng)求查詢案例測(cè)試

    這篇文章主要為大家介紹了golang?gorm實(shí)現(xiàn)get請(qǐng)求查詢案例測(cè)試,
    2022-04-04
  • golang基礎(chǔ)之reflect反射的實(shí)現(xiàn)

    golang基礎(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-06
  • GO?CountMinSketch計(jì)數(shù)器(布隆過(guò)濾器思想的近似計(jì)數(shù)器)

    GO?CountMinSketch計(jì)數(shù)器(布隆過(guò)濾器思想的近似計(jì)數(shù)器)

    這篇文章主要介紹了GO?CountMinSketch計(jì)數(shù)器(布隆過(guò)濾器思想的近似計(jì)數(shù)器),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-09-09
  • Golang切片刪除指定元素的三種方法對(duì)比

    Golang切片刪除指定元素的三種方法對(duì)比

    Go語(yǔ)言并沒(méi)有提供用于刪除元素的語(yǔ)法或接口,而是通過(guò)利用切片本身的特性來(lái)刪除元素—追加元素,這篇文章主要給大家介紹了關(guān)于Golang切片刪除指定元素的三種方法,需要的朋友可以參考下
    2022-06-06
  • GoZero實(shí)現(xiàn)數(shù)據(jù)庫(kù)MySQL單例模式連接的簡(jiǎn)單示例

    GoZero實(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-02
  • Go語(yǔ)言實(shí)現(xiàn)超時(shí)的三種方法實(shí)例

    Go語(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-07
  • golang獲取客戶端ip的實(shí)現(xiàn)

    golang獲取客戶端ip的實(shí)現(xiàn)

    本文主要介紹了golang獲取客戶端ip的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • golang實(shí)現(xiàn)數(shù)組分割的示例代碼

    golang實(shí)現(xiàn)數(shù)組分割的示例代碼

    本文主要介紹了golang實(shí)現(xiàn)數(shù)組分割的示例代碼,要求把數(shù)組分割成多個(gè)正整數(shù)大小的數(shù)組,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • golang整合jwt的實(shí)現(xiàn)示例

    golang整合jwt的實(shí)現(xiàn)示例

    json web tokens(jwt)已成為大多數(shù)web api設(shè)計(jì)中的常見(jiàn)身份驗(yàn)證和授權(quán)方案之一,本文主要介紹了golang整合jwt的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08

最新評(píng)論