加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[转载] Golang hot configuration reload

发布时间:2020-12-16 18:46:34 所属栏目:大数据 来源:网络整理
导读:原文:http://openmymind.net/Golang-Hot-Configuration-Reload/ Like most,I've always appreciated a software package that lets me hot-reload the configuration without having to restart. Nginx immediately comes to mind,as does Postgresql (not

原文:http://openmymind.net/Golang-Hot-Configuration-Reload/

Like most,I've always appreciated a software package that lets me hot-reload the configuration without having to restart. Nginx immediately comes to mind,as does Postgresql (not for all settings,but most). This is something I've never done; so I was pretty happy when the opportunity presented itself.

I'm not sure how anyone else does this,but it's pretty basic stuff. When you get past the meaningless fact that you're reloading a configuration,it's just about providing concurrent read and write access to a shared object. There are a lot of ways to do that and a lot will depend on your language/framework. In Go,our approach was to use a read/write mutex.

First,our basic configuration structure,a global (to the package) variable and a similar lock:

goimport (
  "os"
  "log"
  "sync"
  "syscall"
  "os/signal"
  "io/ioutil"
  "encoding/json"
)

type Config struct {
  Mode string
  CacheSize int
}

var (
  config *Config
  configLock = new(sync.RWMutex)
)

Next we need a function that loads our config:

gofunc loadConfig(fail bool){
  file,err := ioutil.ReadFile("config.json")
  if err != nil {
    log.Println("open config: ",err)
    if fail { os.Exit(1) }
  }

  temp := new(Config)
  if err = json.Unmarshal(file,temp); err != nil {
    log.Println("parse config: ",err)
    if fail { os.Exit(1) }
  }
  configLock.Lock()
  config = temp
  configLock.Unlock()
}

Whether we exit on failure depends on whether this is the first time loading the configuration or if it's a reload. We use a temp variable to hold our new reference so that we can minimize the duration of our write lock to the simplist possible code.

Next we need is a way to access the current configuration:

gofunc GetConfig() *Config {
  configLock.RLock()
  defer configLock.RUnlock()
  return config
}

Finally we need to do an initial load as well as be able to cause a reload. To do this,we listen for a signal:

go// go calls init on start
func init() {
  loadConfig(true)
  s := make(chan os.Signal,1)
  signal.Notify(s,syscall.SIGUSR2)
  go func() {
    for {
      <-s
      loadConfig(false)
      log.Println("Reloaded")
    }
  }()
}

Like I said,not hard but at least a little neat.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读