配置文件热更新是服务器程序的一个基本功能,通过热更新可以不停机调整程序的配置,特别是在生产环境可以提供极大的便利,比如发现log打得太多了可以动态调高日志等级,业务逻辑参数变化,甚至某个功能模块的开关等都可以动态调整。 - package main
- import (
- "encoding/json"
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "os/signal"
- "sync"
- "syscall"
- )
-
- //用json配置测试
- type Config struct {
- Test1 string `json:"Test1:`
- Test2 int `json:"Test1:`
- }
-
- var (
- config *Config
- configLock = new(sync.RWMutex)
- )
-
- func loadConfig() bool {
- f, err := ioutil.ReadFile("config.json")
- if err != nil {
- fmt.Println("load config error: ", err)
- return false
- }
-
- //不同的配置规则,解析复杂度不同
- temp := new(Config)
- err = json.Unmarshal(f, &config)
- if err != nil {
- fmt.Println("Para config failed: ", err)
- return false
- }
-
- configLock.Lock()
- config = temp
- configLock.Unlock()
- return true
- }
-
- func GetConfig() *Config {
- configLock.RLock()
- defer configLock.RUnlock()
- return config
- }
-
- func init() {
- if !loadConfig() {
- os.Exit(1)
- }
-
- //热更新配置可能有多种触发方式,这里使用系统信号量sigusr1实现
- s := make(chan os.Signal, 1)
- signal.Notify(s, syscall.SIGUSR1)
- go func() {
- for {
- <-s
- log.Println("Reloaded config:", loadConfig())
- }
- }()
- }
-
- func main() {
- select {}
- }
复制代码以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持晓枫资讯。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |