1. 程式人生 > >Golang熱載入配置實踐

Golang熱載入配置實踐

前言

生產環境上所輸出的日誌級別較高不利於定位,會碰到這樣一種場景,我們改配置修改日誌級別,再重啟,以期望定位問題,然而問題重啟後不浮現了,所以熱載入配置有必要添進去。

實踐

直接上程式碼:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "os"
    "os/signal"
    "syscall"
    "time"
)

type Config struct {
    Mode string `json:"Mode"`
}

var (
    config     *Config
)

func
loadConfig() { f, err := ioutil.ReadFile("config.json") if err != nil { fmt.Println("[TEST_SIGUSR] Load config: ", err) } err = json.Unmarshal(f, &config) if err != nil { fmt.Println("[TEST_SIGUSR] Para config failed: ", err) } } func init() { loadConfig() fmt.Println("[TEST_SIGUSR] Load config;Mode: "
, config.Mode) s := make(chan os.Signal, 1) signal.Notify(s, syscall.SIGUSR2) go func() { for { <-s loadConfig() fmt.Println("[TEST_SIGUSR] ReLoad config;Mode: ", config.Mode) } }() } func main() { q := make(chan os.Signal, 1
) signal.Notify(q, syscall.SIGINT) for { select { case <-q: fmt.Println("[TEST_SIGUSR] ---ibye----") os.Exit(1) default: } fmt.Println("[TEST_SIGUSR] ---waiting to reload----") time.Sleep(time.Second * 2) } }

檔案目錄如下:

wenhao-MA:test_sigusr wenhao$ ll
total 4944
-rw-r--r--  1 wenhao  staff       18 11 22 13:39 config.json
-rwxr-xr-x  1 wenhao  staff  2520352 11 22 13:41 sigusr
-rw-r--r--  1 wenhao  staff      973 11 22 13:47 sigusr.go
wenhao-MA:test_sigusr wenhao$ cat config.json
{"Mode":"Debug"}

編譯啟動後,修改config.jsonMode值,kill -USR2 $(pidof sigusr)
結果:

wenhao-MA:test_sigusr wenhao$./sigusr 
[TEST_SIGUSR] Load config;Mode:  Debug
[TEST_SIGUSR] ---waiting to reload----
[TEST_SIGUSR] ---waiting to reload----
[TEST_SIGUSR] ReLoad config;Mode:  ERROR