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

主頁 > 知識庫 > 使用Go語言實現(xiàn)配置文件熱加載功能

使用Go語言實現(xiàn)配置文件熱加載功能

熱門標(biāo)簽:阿里云ai電話機(jī)器人 釘釘有地圖標(biāo)注功能嗎 濱州自動電銷機(jī)器人排名 惠州電銷防封電話卡 浙江高頻外呼系統(tǒng)多少錢一個月 汕頭小型外呼系統(tǒng) 建造者2地圖標(biāo)注 鄭州亮點科技用的什么外呼系統(tǒng) 黃岡人工智能電銷機(jī)器人哪個好

 說到配置文件熱加載,這個功能在很多框架中都提供了,如beego,實現(xiàn)的效果就是當(dāng)你修改文件后,會把你修改后的配置重新加載到配置文件中,而不用重啟程序,這個功能在日常中還是非常實用的,畢竟很多時候,線上的配置文件不是想改就能改的。

這次就自己實現(xiàn)一個配置文件的熱加載功能的包,并通過一個簡單的例子對完成的包進(jìn)行使用驗證

配置文件熱加載包的是實現(xiàn)

其實整體的思路還是比較簡單的,當(dāng)獲取配置文件內(nèi)容后,會開啟一個goroutine,去 循環(huán)讀配置文件,當(dāng)然這里不可能不限制的一直循環(huán),而是設(shè)置了一個定時器,定時去讀文件,根據(jù)文件的修改時間是否變化,從而確定是否重新reload配置文件

實現(xiàn)的config 包的文件結(jié)構(gòu)為:

├── config.go
└── config_notify.go

config.go:代碼的主要處理邏輯
config_notify.go:主要定義了一個接口,用于當(dāng)文件修改時間變化的時候執(zhí)行回調(diào)

config_notify.go的代碼相對來說比較簡單,我們先看看這個代碼:

package config
// 定義一個通知的接口
type Notifyer interface {
 Callback(*Config)
}

這樣當(dāng)我們實現(xiàn)了Callback這個方法的時候,我們就實現(xiàn)了Notifyer這個接口,具體的調(diào)用在后面會說

在config.go中我們頂一個了一個結(jié)構(gòu)體:

type Config struct {
 filename string
 lastModifyTime int64
 data map[string]string
 rwLock sync.RWMutex
 notifyList []Notifyer
}

結(jié)構(gòu)體中主要包含幾個字段:

filename:配置文件名字
lastModifyTime:配置文件的最后修改時間
data:用于將從配置文件中讀取的內(nèi)容存儲為map
rwlock:讀寫鎖
notifyList:用于將調(diào)用該包的程序追加到切片中,用于通知調(diào)用上面在config_notify.go定義的callback回調(diào)函數(shù)

關(guān)于讀取配置文件中的內(nèi)容并存儲到map中,這里定義了一個方法實現(xiàn):

func (c *Config) parse()(m map[string]string,err error){
 // 讀文件并或?qū)⑽募械臄?shù)據(jù)以k/v的形式存儲到map中
 m = make(map[string]string,1024)
 file,err := os.Open(c.filename)
 if err != nil{
  return
 }
 var lineNo int
 reader := bufio.NewReader(file)
 for{
  // 一行行的讀文件
  line,errRet := reader.ReadString('\n')
  if errRet == io.EOF{
   // 表示讀到文件的末尾
   break
  }
  if errRet != nil{
   // 表示讀文件出問題
   err = errRet
   return
  }
  lineNo++
  line = strings.TrimSpace(line) // 取出空格
  if len(line) == 0 || line[0] == '\n' || line[0] == '+' || line[0] == ';'{
   // 當(dāng)前行為空行或者是注釋行等
   continue
  }
  arr := strings.Split(line,"=") // 通過=進(jìn)行切割取出k/v結(jié)構(gòu)
  if len(arr) == 0{
   fmt.Printf("invalid config,line:%d\n",lineNo)
   continue
  }
  key := strings.TrimSpace(arr[0])
  if len(key) == 0{
   fmt.Printf("invalid config,line:%d\n",lineNo)
   continue
  }
  if len(arr) == 1{
   m[key] = ""
   continue
  }
  value := strings.TrimSpace(arr[1])
  m[key] = value
 }
 return
}

而最后我們就需要一個定時器,每隔一段時間判斷配置文件的最后修改時間是否變化,如果變化則重新讀取一次文件并將文件內(nèi)容存儲到map中。

func (c *Config) reload(){
 // 這里啟動一個定時器,每5秒重新加載一次配置文件
 ticker := time.NewTicker(time.Second*5)
 for _ = range ticker.C{
  func(){
   file,err := os.Open(c.filename)
   if err != nil{
    fmt.Printf("open %s failed,err:%v\n",c.filename,err)
    return
   }
   defer file.Close()
   fileInfo,err := file.Stat()
   if err != nil{
    fmt.Printf("stat %s failed,err:%v\n",c.filename,err)
    return
   }
   curModifyTime := fileInfo.ModTime().Unix()
   fmt.Printf("%v --- %v\n",curModifyTime,c.lastModifyTime)
   //判斷文件的修改時間是否大于最后一次修改時間
   if curModifyTime > c.lastModifyTime{
    m,err := c.parse()
    if err != nil{
     fmt.Println("parse failed,err:",err)
     return
    }
    c.rwLock.Lock()
    c.data = m
    c.rwLock.Unlock()
    for _, n:=range c.notifyList{
     n.Callback(c)
    }
    c.lastModifyTime = curModifyTime
   }
  }()
 }

關(guān)于config完整的代碼地址:https://github.com/pythonsite/go_simple_code/tree/master/config

一個演示上述包的例子

這里一個簡單的例子,代碼的邏輯也非常簡單就是寫一個循環(huán)從配置文件讀取配置信息,當(dāng)然這里是為了測試效果,寫成了循環(huán)。這里有個問題需要注意,就是在配置文件中存放數(shù)據(jù)的時候應(yīng)該是如下格式存儲

listen_addr = localhost
server_port = 1000
# Nginx addr
nginx_addr = 192.168.1.2:9090

測試代碼的主要結(jié)構(gòu)如下:

├── config.conf
└── main.go

config.conf為配置文件
main.go 為主要測試代碼

type AppConfig struct {
 port int
 nginxAddr string
}
type AppconfigMgr struct {
 config atomic.Value
}
var appConfigMgr = AppconfigMgr{}
func(a *AppconfigMgr)Callback(conf *config.Config){
 var appConfig = AppConfig{}
 port,err := conf.GetInt("server_port")
 if err != nil{
  fmt.Println("get port failed,err:",err)
  return
 }
 appConfig.port = port
 fmt.Println("port:",appConfig.port)
 nginxAddr,err := conf.GetString("nginx_addr")
 if err != nil{
  fmt.Println("get nginx addr failed,err:",err)
  return
 }
 appConfig.nginxAddr = nginxAddr
 fmt.Println("nginx addr :",appConfig.nginxAddr)
 appConfigMgr.config.Store(appConfig)
}
func run(){
 for {
  // 每5秒打印一次數(shù)據(jù),查看自己更改配置文件后是否可以熱刷新
  appConfig := appConfigMgr.config.Load().(*AppConfig)
  fmt.Println("port:",appConfig.port)
  fmt.Println("nginx addr:",appConfig.nginxAddr)
  time.Sleep(5* time.Second)
 }
}
func main() {
 conf,err := config.NewConfig("/Users/zhaofan/go_project/src/go_dev/13/config_test/config.conf")
 if err != nil{
  fmt.Println("parse config failed,err:",err)
  return
 }
 //打開文件獲取內(nèi)容后,將自己加入到被通知的切片中
 conf.AddNotifyer(appConfigMgr)
 var appConfig = AppConfig{}
 appConfig.port,err = conf.GetInt("server_port")
 if err != nil{
  fmt.Println("get port failed,err:",err)
  return
 }
 fmt.Println("port:",appConfig.port)
 appConfig.nginxAddr,err = conf.GetString("nginx_addr")
 if err != nil{
  fmt.Println("get nginx addr failed,err:",err)
  return
 }
 fmt.Println("nginx addr:",appConfig.nginxAddr)
 appConfigMgr.config.Store(appConfig)
 run()
}

上面代碼中有一段代碼非常重要:

func(a *AppconfigMgr)Callback(conf *config.Config){
 var appConfig = AppConfig{}
 port,err := conf.GetInt("server_port")
 if err != nil{
  fmt.Println("get port failed,err:",err)
  return
 }
 appConfig.port = port
 fmt.Println("port:",appConfig.port)
 nginxAddr,err := conf.GetString("nginx_addr")
 if err != nil{
  fmt.Println("get nginx addr failed,err:",err)
  return
 }
 appConfig.nginxAddr = nginxAddr
 fmt.Println("nginx addr :",appConfig.nginxAddr)
 appConfigMgr.config.Store(appConfig)
}

這里我們實現(xiàn)了Callback方法,同時就實現(xiàn)了我們在config包中定義的那個接口

測試效果如下,當(dāng)我們更改配置文件后,程序中的配置文件也被重新加載

完整的測試代碼地址:https://github.com/pythonsite/go_simple_code/tree/master/config_test

總結(jié)

以上所述是小編給大家介紹的使用Go語言實現(xiàn)配置文件熱加載功能,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!

您可能感興趣的文章:
  • MongoDB 3.4配置文件避免入坑的注意事項
  • MongoDB的安裝及配置文件選項全解
  • 在Django中同時使用多個配置文件的方法
  • python用ConfigObj讀寫配置文件的實現(xiàn)代碼

標(biāo)簽:泰安 阿壩 昭通 駐馬店 東營 滄州 瀘州 晉中

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《使用Go語言實現(xiàn)配置文件熱加載功能》,本文關(guān)鍵詞  使用,語言,實現(xiàn),配置文件,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《使用Go語言實現(xiàn)配置文件熱加載功能》相關(guān)的同類信息!
  • 本頁收集關(guān)于使用Go語言實現(xiàn)配置文件熱加載功能的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美亚洲动漫精品| 欧美aaaaaa午夜精品| 美女www一区二区| 丝袜美腿亚洲一区二区图片| 欧美亚一区二区| 免费亚洲电影在线| 波多野结衣亚洲| 国产91精品在线观看| 欧美视频中文字幕| 2014亚洲片线观看视频免费| 亚洲欧洲另类国产综合| 成人av午夜电影| 欧美日韩一区小说| 日韩av二区在线播放| 欧美色爱综合网| 成人免费在线观看入口| 免费人成网站在线观看欧美高清| 1000部国产精品成人观看| 美女一区二区三区在线观看| 欧美电影一区二区三区| 亚洲欧美一区二区久久 | 欧美国产1区2区| 国模少妇一区二区三区| 日韩欧美视频在线| 香蕉成人啪国产精品视频综合网 | 美女网站在线免费欧美精品| 欧美日韩在线电影| 成人黄色免费短视频| 亚洲视频免费看| 欧洲精品在线观看| 夜色激情一区二区| 欧美理论片在线| 三级久久三级久久久| 久久综合九色综合97婷婷| 一区二区三区在线影院| 欧美精品精品一区| 国产黄色91视频| 国产精品久久久久久一区二区三区| 国产乱码字幕精品高清av| 中文字幕欧美国产| 在线亚洲人成电影网站色www| 亚洲桃色在线一区| 99精品视频一区二区| 成人毛片视频在线观看| 亚洲欧洲日韩综合一区二区| 国内一区二区在线| 日本一区二区三区四区在线视频| 韩国精品免费视频| 国产精品免费丝袜| 欧美日韩免费高清一区色橹橹 | 久久久久国色av免费看影院| 中文字幕字幕中文在线中不卡视频| 亚洲女同女同女同女同女同69| 日韩女优av电影| 日本最新不卡在线| 亚洲在线视频免费观看| 一区二区三区在线不卡| 亚洲国产精品久久人人爱蜜臀 | 久久久久久久久伊人| 欧美日韩免费不卡视频一区二区三区 | 91玉足脚交白嫩脚丫在线播放| 久久这里只有精品首页| 欧美国产日韩在线观看| 国产成人在线视频网址| 国产成人无遮挡在线视频| 久久99精品国产.久久久久 | 亚洲九九爱视频| 亚洲图片欧美色图| 一本色道久久综合亚洲aⅴ蜜桃 | aaa国产一区| 天天影视涩香欲综合网| 亚洲精选在线视频| 老司机一区二区| 色婷婷综合激情| 久久一日本道色综合| 美女视频网站黄色亚洲| 国产资源精品在线观看| av一区二区三区在线| 欧美性生交片4| 亚洲影视在线播放| 久久99精品久久只有精品| 色婷婷综合视频在线观看| 国产视频不卡一区| 久久不见久久见免费视频1| aaa亚洲精品一二三区| 欧美丝袜丝交足nylons| av不卡免费在线观看| 91日韩精品一区| 日本aⅴ亚洲精品中文乱码| 久久99国内精品| 国产欧美va欧美不卡在线| 激情五月婷婷综合网| 精品国产伦一区二区三区观看体验 | 日韩国产精品91| 日韩国产欧美视频| 色婷婷国产精品综合在线观看| 欧美日韩国产一区| 亚洲欧美日韩国产综合| 亚洲成人一区二区| 99视频精品在线| 1024成人网色www| 欧美日高清视频| 精品综合久久久久久8888| 欧美日韩高清影院| 亚洲免费av网站| 国产xxx精品视频大全| 欧美一区二区免费视频| 精品一区二区在线视频| 国产一区二区三区在线观看免费视频| 夜夜嗨av一区二区三区四季av| 日韩伦理av电影| 玖玖九九国产精品| 久久精品亚洲麻豆av一区二区| 国产乱码精品一区二区三区五月婷 | 在线观看中文字幕不卡| 国产精品影音先锋| 日本美女一区二区三区视频| 日韩视频在线你懂得| 国产suv精品一区二区883| 欧美伦理视频网站| 激情都市一区二区| 久久久久久97三级| 麻豆成人91精品二区三区| 狠狠色狠狠色综合日日91app| 亚洲一区二区高清| 三级一区在线视频先锋 | 午夜视频在线观看一区二区| 成人性生交大片免费看在线播放| 日韩精品最新网址| 精品中文av资源站在线观看| 国产精品久久久久久久裸模| 欧美一级免费大片| 欧美一级午夜免费电影| 欧美高清一级片在线| 欧美日本免费一区二区三区| 另类的小说在线视频另类成人小视频在线| 一区二区三区四区蜜桃 | 欧美日韩一级片网站| 97久久精品人人做人人爽50路| 97精品视频在线观看自产线路二| 高清beeg欧美| 欧美专区亚洲专区| 91女厕偷拍女厕偷拍高清| 国产成人免费xxxxxxxx| 秋霞电影一区二区| 亚洲国产精品视频| 亚洲香肠在线观看| 国产自产高清不卡| 国产很黄免费观看久久| 在线播放欧美女士性生活| 精品粉嫩aⅴ一区二区三区四区| 在线观看91视频| 亚洲福利视频一区二区| 久久精品国产第一区二区三区| 国产iv一区二区三区| 91精品在线麻豆| 午夜久久久久久电影| 亚洲图片欧美综合| 国产精品一级黄| 在线精品观看国产| proumb性欧美在线观看| 99精品视频在线播放观看| 欧美日韩成人一区| 亚洲动漫第一页| 色狠狠一区二区| 国产精品视频在线看| 一区二区三区精品| 国产黑丝在线一区二区三区| 欧美成人性福生活免费看| 国产一区二区三区在线观看免费| 欧美精品一区二区精品网| jizzjizzjizz欧美| 热久久久久久久| 成人高清在线视频| 亚洲国产乱码最新视频| 精品美女被调教视频大全网站| 蜜臀va亚洲va欧美va天堂| 91精品国产综合久久精品麻豆 | 91极品美女在线| 亚洲欧洲av在线| 国产中文字幕精品| 久久九九99视频| 北条麻妃国产九九精品视频| 亚洲一区在线播放| 欧美国产国产综合| 99精品欧美一区二区三区小说| 精品一区二区三区在线观看国产| 国产精品国产三级国产普通话99| 婷婷久久综合九色综合伊人色| 国产偷国产偷精品高清尤物 | 国产精品欧美久久久久一区二区| 欧美午夜不卡视频| 亚洲视频资源在线| 日韩一区二区三区电影| 久久欧美中文字幕| 国产一区不卡精品| 国产精品嫩草久久久久| 久久―日本道色综合久久| 欧美三级日韩在线| 国产精品一二三区在线|