Golang 配置文件热加载

使用 github.com/fsnotify/fsnotify,监听 CreateRemoveWriteChmodRename 等事件,实现对文件状态的实时监听,当文件有变化时执行已注册的回调函数(如下),实现对配置的重新加载。

1
2
3
// CallbackFunc 配置回调函数
// filename:文件相对路径
type CallbackFunc func(filename string) error

以读取配置为例,来说明如何实现热加载:

定义配置文件对应结构体

配置文件 config.json 内容:

1
2
3
{
"model":"aaaaa"
}

为配置文件定义结构:

1
2
3
type Config struct {
trueModel string `json:"model"`
}

定义读取配置文件的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var cnf Config

func loadConfig(filename string) error {
truefile, err := ioutil.ReadFile(filename)
trueif err != nil {
truetruelog.Fatalln(err)
true}

trueerr = jsoniter.Unmarshal(file, &cnf)
trueif err != nil {
truetruelog.Fatalln(err)
true}

truefmt.Printf("config:%+v\n", cnf)

truereturn nil
}

注册回调

1
2
// 1. 注册配置文件监听及回调
hotreload.Register("conf/config.json", loadConfig)

启动监听

1
2
// 2. 启动监听
hotreload.Watcher()

完整 demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package main

import (
true"fmt"
true"io/ioutil"
true"log"

true"github.com/LeungGeorge/grit/lib/hotreload"
true"github.com/gin-gonic/gin"
true"github.com/json-iterator/go"
)

type Config struct {
trueModel string `json:"model"`
}

var cnf Config

func loadConfig(filename string) error {
truefile, err := ioutil.ReadFile(filename)
trueif err != nil {
truetruelog.Fatalln(err)
true}

trueerr = jsoniter.Unmarshal(file, &cnf)
trueif err != nil {
truetruelog.Fatalln(err)
true}

truefmt.Printf("config:%+v\n", cnf)

truereturn nil
}

func main() {
truer := gin.Default()

// 1. 注册配置文件监听及回调
truehotreload.Register("conf/config.json", loadConfig)
// 2. 启动监听
truehotreload.Watcher()

truer.Run()
}

输出(可以看到 demo 读取到 conf/config.json 的内容):

1
config:{Model:aaaaa}

Golang 配置文件热加载


来源:https://leunggeorge.github.io/

0%