当前位置 博文首页 > golang使用信号量热更新的实现示例

    golang使用信号量热更新的实现示例

    作者:wshelly 时间:2021-06-25 18:26

    配置文件热更新是服务器程序的一个基本功能,通过热更新可以不停机调整程序的配置,特别是在生产环境可以提供极大的便利,比如发现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 {} 
    } 
    js
    下一篇:没有了