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

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

使用Go語言實現配置文件熱加載功能

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

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

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

配置文件熱加載包的是實現

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

實現的config 包的文件結構為:

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

config.go:代碼的主要處理邏輯
config_notify.go:主要定義了一個接口,用于當文件修改時間變化的時候執行回調

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

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

這樣當我們實現了Callback這個方法的時候,我們就實現了Notifyer這個接口,具體的調用在后面會說

在config.go中我們頂一個了一個結構體:

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

結構體中主要包含幾個字段:

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

關于讀取配置文件中的內容并存儲到map中,這里定義了一個方法實現:

func (c *Config) parse()(m map[string]string,err error){
 // 讀文件并或將文件中的數據以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] == ';'{
   // 當前行為空行或者是注釋行等
   continue
  }
  arr := strings.Split(line,"=") // 通過=進行切割取出k/v結構
  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
}

而最后我們就需要一個定時器,每隔一段時間判斷配置文件的最后修改時間是否變化,如果變化則重新讀取一次文件并將文件內容存儲到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
   }
  }()
 }

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

一個演示上述包的例子

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

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

測試代碼的主要結構如下:

├── 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秒打印一次數據,查看自己更改配置文件后是否可以熱刷新
  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
 }
 //打開文件獲取內容后,將自己加入到被通知的切片中
 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)
}

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

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

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

總結

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

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

標簽:泰安 阿壩 昭通 駐馬店 東營 滄州 瀘州 晉中

巨人網絡通訊聲明:本文標題《使用Go語言實現配置文件熱加載功能》,本文關鍵詞  使用,語言,實現,配置文件,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用Go語言實現配置文件熱加載功能》相關的同類信息!
  • 本頁收集關于使用Go語言實現配置文件熱加載功能的相關信息資訊供網民參考!
  • 推薦文章
    国产a网| 日日夜夜婷婷| 在线观看导航| 日本特黄特色aa大片免费| 日韩男人天堂| 久久99中文字幕| 亚洲第一页乱| 99久久精品费精品国产一区二区| 日日夜夜婷婷| 国产不卡高清在线观看视频| 亚州视频一区二区| 国产亚洲精品aaa大片| 国产一区二区精品久久| 久久久久久久网| 一级片片| 精品视频在线观看视频免费视频 | 国产成人欧美一区二区三区的| 久久国产影院| 日本在线www| 国产a免费观看| 国产视频一区二区在线播放| 日韩免费片| 国产成人啪精品| 国产激情一区二区三区| 国产一区二区精品久久| 精品国产一区二区三区精东影业| 国产伦精品一区二区三区无广告| 国产高清在线精品一区二区| 国产亚洲精品aaa大片| 精品久久久久久中文字幕一区| 午夜在线影院| 久久99中文字幕久久| 999精品视频在线| 麻豆午夜视频| 麻豆午夜视频| 韩国三级视频网站| 国产视频久久久久| 国产视频在线免费观看| 欧美a级片视频| 久久精品大片| 久久99中文字幕| 国产伦精品一区二区三区无广告| 国产伦理精品| 日本在线不卡免费视频一区| 日韩专区第一页| 四虎影视精品永久免费网站| 精品国产一区二区三区免费| 麻豆网站在线免费观看| 99热精品在线| 日韩avdvd| 日韩欧美一及在线播放| 国产精品自拍亚洲| 国产91丝袜高跟系列| 亚洲 激情| 国产精品自拍在线观看| 日本伦理黄色大片在线观看网站| 99久久网站| 深夜做爰性大片中文| 99久久精品国产麻豆| 欧美国产日韩在线| 亚欧成人毛片一区二区三区四区| 国产视频一区在线| 欧美18性精品| 精品视频免费在线| 欧美一区二区三区在线观看| 日韩综合| 国产伦久视频免费观看 视频| 亚洲 欧美 成人日韩| 日韩在线观看免费| 日本伦理黄色大片在线观看网站| 色综合久久天天综合观看| 日本伦理片网站| 99久久精品国产高清一区二区 | 国产不卡在线播放| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 你懂的在线观看视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 午夜在线亚洲男人午在线| 亚洲精品中文一区不卡 | 免费的黄色小视频| a级精品九九九大片免费看| 人人干人人草| 高清一级淫片a级中文字幕 | 国产高清在线精品一区二区| 欧美电影免费| 色综合久久天天综线观看| 亚洲爆爽| 欧美激情伊人| 青青久热| 日日日夜夜操| 国产一区二区福利久久| 日韩女人做爰大片| 一本高清在线| 久久久成人网| 亚欧成人毛片一区二区三区四区| 日韩男人天堂| 四虎影视库国产精品一区| 超级乱淫黄漫画免费| 成人高清视频在线观看| 青青久久精品| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久久久久久久综合影视网| 精品国产三级a| 日韩avdvd| 四虎久久影院| 欧美激情影院| 99久久精品国产麻豆| 欧美另类videosbestsex视频 | 欧美一级视频免费观看| 91麻豆国产| 精品视频免费在线| 国产美女在线观看| 精品视频在线观看免费| 亚洲 男人 天堂| 精品毛片视频| 日日日夜夜操| 91麻豆精品国产自产在线| 国产不卡精品一区二区三区| 九九热精品免费观看| 日韩免费在线| 九九热精品免费观看| 久久99爰这里有精品国产| 精品视频在线观看免费| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美另类videosbestsex高清| 国产精品1024永久免费视频 | 成人在激情在线视频| 黄视频网站在线观看| 国产极品白嫩美女在线观看看| 欧美激情在线精品video| 国产美女在线观看| 欧美a级片免费看| 香蕉视频久久| 亚洲不卡一区二区三区在线| 欧美激情一区二区三区在线| 午夜在线亚洲| 美女免费精品高清毛片在线视| 国产a视频| 国产原创中文字幕| 久久国产影院| 国产伦精品一区三区视频| 日韩av成人| 天天色成人| 二级片在线观看| 97视频免费在线观看| 国产极品白嫩美女在线观看看| 国产视频网站在线观看| 欧美激情影院| 国产不卡精品一区二区三区| 欧美激情伊人| 99热热久久| 韩国毛片免费| 久久久久久久网| 精品视频在线看| 91麻豆精品国产自产在线| 成人a大片高清在线观看| 国产亚洲精品aaa大片| 青青久久精品| 久久国产精品永久免费网站| 亚洲女初尝黑人巨高清在线观看| 一级女性全黄久久生活片| 九九精品影院| 欧美另类videosbestsex| 九九久久国产精品大片| 99热精品在线| 日韩字幕在线| 99久久网站| 日本伦理片网站| 成人影院久久久久久影院| 你懂的在线观看视频| 中文字幕97| 四虎影视库国产精品一区| 亚洲 欧美 成人日韩| 青青久久精品国产免费看| 国产伦久视频免费观看视频| 久久精品大片| 亚洲第一色在线| 日韩男人天堂| 久久99这里只有精品国产| 成人免费一级纶理片| 久久精品免视看国产成人2021| 国产不卡在线观看| 精品国产香蕉在线播出 | 欧美另类videosbestsex高清| 久久99中文字幕久久| 青青久久精品国产免费看| 99久久精品费精品国产一区二区| 高清一级毛片一本到免费观看| 欧美国产日韩在线| 精品美女| 国产视频一区二区三区四区| 日韩免费在线视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久99爰这里有精品国产| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 午夜欧美成人香蕉剧场| 国产精品自拍亚洲| 国产网站麻豆精品视频| 日韩一级黄色大片|