亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 詳解go基于viper實現配置文件熱更新及其源碼分析

詳解go基于viper實現配置文件熱更新及其源碼分析

熱門標簽:福州鐵通自動外呼系統 烏魯木齊人工電銷機器人系統 澳門防封電銷卡 賺地圖標注的錢犯法嗎 智能電銷機器人營銷 長沙ai機器人電銷 濮陽自動外呼系統代理 廣東語音外呼系統供應商 地圖標注測試

go第三方庫 github.com/spf13/viper  實現了對配置文件的讀取并注入到結構中,好用方便。

其中以

viperInstance := viper.New()	// viper實例
viperInstance.WatchConfig()
viperInstance.OnConfigChange(func(e fsnotify.Event) {
	log.Print("Config file updated.")
	viperLoadConf(viperInstance)  // 加載配置的方法
})

可實現配置的熱更新,不用重啟項目新配置即可生效(實現熱加載的方法也不止這一種,比如以文件的上次修改時間來判斷等)。

為什么這么寫?這樣寫為什么就能立即生效?基于這兩個問題一起來看看viper是怎樣實現熱更新的。

上面代碼的核心一共兩處:WatchConfig()方法、OnConfigChange()方法。WatchConfig()方法用來開啟事件監聽,確定用戶操作文件后該文件是否可正常讀取,并將內容注入到viper實例的config字段,先來看看WatchConfig()方法:

func (v *Viper) WatchConfig() {
	go func() {
      // 建立新的監視處理程序,開啟一個協程開始等待事件
      // 從I/O完成端口讀取,將事件注入到Event對象中:Watcher.Events
		watcher, err := fsnotify.NewWatcher()  
		if err != nil {
			log.Fatal(err)
		}
		defer watcher.Close()
 
		// we have to watch the entire directory to pick up renames/atomic saves in a cross-platform way
		filename, err := v.getConfigFile()  
		if err != nil {
			log.Println("error:", err)
			return
		}
 
		configFile := filepath.Clean(filename)    //配置文件E:\etc\bizsvc\config.yml
		configDir, _ := filepath.Split(configFile)  // E:\etc\bizsvc\

 
		done := make(chan bool)
		go func() {
			for {
				select {
        // 讀取的event對象有兩個屬性,Name為E:\etc\bizsvc\config.yml,Op為write(對文件的操作)
				case event := -watcher.Events:
		// 清除內部的..和他前面的元素,清除當前路徑.,用來判斷操作的文件是否是configFile
					if filepath.Clean(event.Name) == configFile {
        // 如果對該文件進行了創建操作或寫操作
						if event.Opfsnotify.Write == fsnotify.Write || event.Opfsnotify.Create == fsnotify.Create {
							err := v.ReadInConfig()
							if err != nil {
								log.Println("error:", err)
							}
							v.onConfigChange(event)
						}
					}
				case err := -watcher.Errors:
         // 有錯誤將打印
					log.Println("error:", err)
				}
			}
		}()
 
		watcher.Add(configDir)
		-done
	}()
}

其中,fsnotify是用來監控目錄及文件的第三方庫;  watcher, err := fsnotify.NewWatcher() 用來建立新的監視處理程序,它會開啟一個協程開始等待讀取事件,完成 從I / O完成端口讀取任務,將事件注入到Event對象中,即Watcher.Events;

執行v.ReadInConfig()后配置文件的內容將重新讀取到viper實例中,如下圖:

執行完v.ReadInConfig()后,config字段的內容已經是用戶修改的最新內容了;

其中這行v.onConfigChange(event)的onConfigChange是核心結構體Viper的一個屬性,類型是func:

type Viper struct {
	// Delimiter that separates a list of keys
	// used to access a nested value in one go
	keyDelim string
 
	// A set of paths to look for the config file in
	configPaths []string
 
	// The filesystem to read config from.
	fs afero.Fs
 
	// A set of remote providers to search for the configuration
	remoteProviders []*defaultRemoteProvider
 
	// Name of file to look for inside the path
	configName string
	configFile string
	configType string
	envPrefix string
 
	automaticEnvApplied bool
	envKeyReplacer   *strings.Replacer
 
	config     map[string]interface{}
	override    map[string]interface{}
	defaults    map[string]interface{}
	kvstore    map[string]interface{}
	pflags     map[string]FlagValue
	env      map[string]string
	aliases    map[string]string
	typeByDefValue bool
 
	// Store read properties on the object so that we can write back in order with comments.
	// This will only be used if the configuration read is a properties file.
	properties *properties.Properties
 
	onConfigChange func(fsnotify.Event)
}

它用來傳入本次event來執行你寫的函數。為什么修改會立即生效?相信第二個疑問已經得到解決了。

接下來看看OnConfigChange(func(e fsnotify.Event) {...... })的運行情況:

func (v *Viper) OnConfigChange(run func(in fsnotify.Event)) {
	v.onConfigChange = run
}

方法參數為一個函數,類型為func(in fsnotify.Event)) {},這就意味著開發者需要把你自己的執行邏輯放到這個func里面,在監聽到event時就會執行你寫的函數,所以就可以這樣寫:

	viperInstance.OnConfigChange(func(e fsnotify.Event) {
		log.Print("Config file updated.")
		viperLoadConf(viperInstance)  // viperLoadConf函數就是將最新配置注入到自定義結構體對象的邏輯
	})

而OnConfigChange方法的參數會賦值給形參run并傳到viper實例的onConfigChange屬性,以WatchConfig()方法中的v.onConfigChange(event)來執行這個函數。

到此,第一個疑問也就解決了。

到此這篇關于詳解go基于viper實現配置文件熱更新及其源碼分析的文章就介紹到這了,更多相關go viper文件熱更新內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • golang使用信號量熱更新的實現示例
  • 解讀golang plugin熱更新嘗試

標簽:慶陽 德州 阿克蘇 調研邀請 太原 廣西 貴陽 西雙版納

巨人網絡通訊聲明:本文標題《詳解go基于viper實現配置文件熱更新及其源碼分析》,本文關鍵詞  詳解,基于,viper,實現,配置文件,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解go基于viper實現配置文件熱更新及其源碼分析》相關的同類信息!
  • 本頁收集關于詳解go基于viper實現配置文件熱更新及其源碼分析的相關信息資訊供網民參考!
  • 推薦文章
    超级乱淫伦动漫| 国产一区精品| 四虎精品在线观看| 国产不卡在线观看视频| 久久精品大片| 国产国语在线播放视频| 国产伦理精品| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 亚洲天堂免费| 成人免费网站久久久| 欧美激情伊人| 色综合久久天天综合| 高清一级毛片一本到免费观看| 国产精品自拍在线观看| 精品久久久久久中文| 成人影院一区二区三区| 日本免费乱理伦片在线观看2018| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 台湾毛片| 超级乱淫伦动漫| 一级女人毛片人一女人| 在线观看成人网 | 国产不卡高清在线观看视频| 欧美激情影院| 91麻豆精品国产自产在线观看一区| 九九精品久久| 尤物视频网站在线| 99热精品在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美一区二区三区在线观看| 欧美激情伊人| 色综合久久久久综合体桃花网| 九九干| 亚洲 激情| 国产91精品系列在线观看| 日日日夜夜操| 青草国产在线| 欧美爱爱网| 亚洲天堂免费| 高清一级淫片a级中文字幕| 国产不卡高清在线观看视频| 国产一区二区精品久久91| 亚洲精品影院| 成人a大片高清在线观看| 久久国产一区二区| 国产91素人搭讪系列天堂| 国产91精品一区| 精品国产一区二区三区免费 | 日韩中文字幕在线播放| 天天做日日干| 欧美激情一区二区三区中文字幕| 亚洲女初尝黑人巨高清在线观看| 国产伦精品一区三区视频| 国产91丝袜高跟系列| 国产视频在线免费观看| 亚久久伊人精品青青草原2020| 日本在线不卡免费视频一区| 中文字幕一区二区三区 精品| 日韩一级精品视频在线观看| 欧美激情一区二区三区在线 | 欧美激情一区二区三区在线 | 国产不卡在线播放| 麻豆系列 在线视频| 国产一区二区精品久久| 国产伦久视频免费观看视频| 99久久精品国产免费| 日韩综合| 欧美a级片免费看| 久久99中文字幕| 国产网站麻豆精品视频| 亚洲爆爽| 99久久网站| 午夜欧美福利| 日韩中文字幕一区| 日日夜夜婷婷| 日日日夜夜操| 国产伦精品一区二区三区无广告 | 香蕉视频一级| 国产麻豆精品视频| 国产成人啪精品| 成人a级高清视频在线观看| 夜夜操天天爽| 精品国产一区二区三区久久久狼| 可以在线看黄的网站| 成人a大片高清在线观看| 黄色短视频网站| 午夜在线亚洲| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产一区二区精品尤物| 日韩免费在线观看视频| 欧美另类videosbestsex视频| 久草免费在线色站| 91麻豆精品国产综合久久久| 国产伦久视频免费观看视频| 国产一区二区精品| 日本特黄特色aaa大片免费| 九九免费精品视频| 精品视频一区二区三区| 91麻豆精品国产自产在线| 99久久精品国产免费| 国产成a人片在线观看视频| 99色播| 色综合久久天天综合观看| 美女免费黄网站| 精品视频免费看| 精品国产一区二区三区久久久狼| 国产福利免费观看| 国产成人女人在线视频观看 | 亚洲 国产精品 日韩| 国产一区二区精品尤物| 国产伦久视频免费观看视频| 亚久久伊人精品青青草原2020| 久久国产一区二区| 99色播| 亚洲天堂免费观看| 欧美日本韩国| 精品国产香蕉在线播出| 欧美1卡一卡二卡三新区| 国产视频一区在线| 国产伦久视频免费观看视频| 欧美另类videosbestsex高清| 国产精品123| 韩国三级视频在线观看| 亚洲爆爽| 精品视频在线观看视频免费视频| 国产精品自拍在线| 免费一级片在线观看| 99久久精品费精品国产一区二区| 国产91精品露脸国语对白| 高清一级做a爱过程不卡视频| 一级女性大黄生活片免费| 免费国产在线观看不卡| 色综合久久天天综线观看| 精品视频一区二区三区| 亚洲爆爽| 中文字幕一区二区三区 精品| 黄视频网站在线免费观看| 中文字幕97| 久久久成人影院| 国产麻豆精品hdvideoss| 成人免费网站视频ww| 午夜精品国产自在现线拍| 国产视频一区在线| 日韩av东京社区男人的天堂| 亚洲第一页色| 久久国产精品自由自在| 成人a级高清视频在线观看| 国产美女在线观看| 精品国产一区二区三区久 | 美女免费黄网站| 亚欧成人毛片一区二区三区四区 | 国产极品精频在线观看| 国产网站免费观看| 天天做日日爱| 免费毛片播放| 国产不卡在线看| 欧美另类videosbestsex视频| 欧美电影免费看大全| 亚洲 国产精品 日韩| 久久久成人影院| 成人a级高清视频在线观看| 久草免费在线色站| 日日夜夜婷婷| 亚洲第一色在线| 日本免费看视频| 日本在线不卡免费视频一区| 黄色免费网站在线| 日韩中文字幕在线亚洲一区 | 久久精品人人做人人爽97| 国产亚洲免费观看| 日韩在线观看视频黄| 精品视频免费在线| 欧美a免费| 韩国三级香港三级日本三级la| 精品视频在线观看视频免费视频| 欧美大片毛片aaa免费看| 日本特黄特色aaa大片免费| 韩国三级香港三级日本三级la| 国产成人啪精品| 香蕉视频一级| 99久久精品国产免费| 国产伦精品一区三区视频| 色综合久久手机在线| 一级女性全黄生活片免费| 精品国产一区二区三区国产馆| 成人a级高清视频在线观看| 日日日夜夜操| 国产一级强片在线观看| 青青久久网| 99色播| 999精品在线| 99久久网站| 欧美国产日韩在线| 成人高清护士在线播放| 高清一级片| 精品国产一区二区三区久久久狼| 亚洲 欧美 91| 国产成a人片在线观看视频| 青青久久网| 99色视频在线观看|