配置檔案熱更新是伺服器程式的乙個基本功能,通過熱更新可以不停機調整程式的配置,特別是在生產環境可以提供極大的便利,比如發現log打得太多了可以動態調高日誌等級,業務邏輯引數變化,甚至某個功能模組的開關等都可以動態調整。
每種語言都有自己的熱更新實現方式,在golang裡面我看到了有人採用了一種錯誤的實現方式,如下:
type config struct
var (
config *config
)func loadconfig()
err = json.unmarshal(f, &config)
if err != nil
}func init()
}()}
這種方式,的問題就在於config可能被多個routine同時訪問,那麼loadcofig的時候直接在config上做解析是有問題的。在上面例子中,還是用的最簡單的json配置,如果是其他更複雜的配置形式,如xml,需要自己寫解析函式(而不是乙個json.unmarshal)的時候更容易放大問題。
可以採用更新的時候對config加鎖來解決這個問題:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"
"os/signal"
"sync"
"syscall"
)//用json配置測試
type config struct
var (
config *config
configlock = new(sync.rwmutex)
)func loadconfig() bool
//不同的配置規則,解析複雜度不同
temp := new(config)
err = json.unmarshal(f, &config)
if err != nil
configlock.lock()
config = temp
configlock.unlock()
return true
}func getconfig() *config
func init()
//熱更新配置可能有多種觸發方式,這裡使用系統訊號量sigusr1實現
s := make(chan os.signal, 1)
signal.notify(s, syscall.sigusr1)
go func()
}()}func main()
}
因為熱載入的時候,可能有很多未知的routine在使用config,通過切換配置的時候加鎖可以保證多個routine對config的正確操作,不過需要注意的是,獲取配置檔案的時候也需要加鎖。
不知道在golang裡面,有沒有不加鎖的方案可以實現配置熱更新?
golang配置檔案熱更新
type config struct var config config func loadconfig err json.unmarshal f,config if err nil func init package main import encoding json fmt io ioutil ...
golang讀取配置檔案
在專案中往往將一些配置資訊放到配置檔案中,這樣在不同的執行環境中,只需修改配置檔案即可。以下介紹兩種通過第三方包獲取配置檔案的方式 一 通過gopkg.in ini.v1 go get gopkg.in ini.v11.配置檔案 test.conf mqtt mqtt hostname 127.0....
golang 讀取配置檔案vipper
讀取配置檔案的,有toml和vipper兩種好用的方法,toml的方法見 最大的特點就是要為配置檔案構建相對應的結構體,有點囧,現在講乙個vipper。init 初始化配置 func init v viper.new v.setconfigtype yaml v.setconfigname env ...