golang配置檔案熱更新

2021-08-03 07:46:37 字數 1475 閱讀 8525

配置檔案熱更新是伺服器程式的乙個基本功能,通過熱更新可以不停機調整程式的配置,特別是在生產環境可以提供極大的便利,比如發現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 ...