婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解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實現配置文件熱更新及其源碼分析的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 宜兰县| 长阳| 海林市| 新建县| 景洪市| 岫岩| 沙湾县| 阳朔县| 额济纳旗| 大邑县| 大同市| 盘山县| 虹口区| 新化县| 隆化县| 银川市| 乌苏市| 东乡族自治县| 延津县| 股票| 肇源县| 涡阳县| 黄骅市| 灵石县| 博客| 株洲县| 怀仁县| 嘉善县| 四川省| 敖汉旗| 湄潭县| 金门县| 泾川县| 武陟县| 徐水县| 陇川县| 深水埗区| 邢台县| 秦安县| 林芝县| 石棉县|