Go配置热更——动态绑定

当我们使用配置中心时,我们希望配置热更。一般的实现方式是,读取配置初始化并增加变更监听。这种方式可以实现,但需要我们维护配置变更逻辑,不友好。

在大多数场景下,我们想要的其实是一个func(),每次调用返回最新的结构化配置。Go 1.18增加了泛型,可以很优雅地解决配置热更问题。

我以nacos为例,写了一个动态绑定库bind_nacos_cfg

接口如下

1
2
3
4
5
6
7
8
// Supplier 获取最新配置
type Supplier[T any] func() T
func (sup Supplier[T]) Get() T {
return sup()
}

// MustBind 绑定某配置项
func MustBind[T any](cli config_client.IConfigClient, dataID, group string, typ T) Supplier[T] {}

使用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
type ConfigStruct struct {
Name string `json:"name" yaml:"name"`
City string `json:"city" yaml:"city"`
}

func main() {
var cli config_client.IConfigClient // TODO 初始化
dataID := "abc"
group := "def"
var GetConf = bind_nacos_cfg.MustBind(cli, dataID, group, &ConfigStruct{})
// 也支持原生结构类型
// var GetConf = bind_nacos_cfg.MustBind(cli, dataID, group, ConfigStruct{})
// var GetConf = bind_nacos_cfg.MustBind(cli, dataID, group, map[string]string{})
// var GetConf = bind_nacos_cfg.MustBind(cli, dataID, group, []string{})
// 绑定并监听变更。考虑到存在需要监听配置做额外操作的场景,增加的可选Listner[T]参数
// var GetConf = bind_nacos_cfg.MustBind(cli, dataID, group, &ConfigStruct{}, func(v *ConfigStruct) {
// fmt.Println(v)
// })

// c.(type) == *ConfigStruct
c := GetConf() // 获取最新配置
c = GetConf()
c = GetConf() // 配置变更自动监听更新

fmt.Println(c)
}

Go配置热更——动态绑定
https://a3d21.github.io/2022/11/15/2022-11-15-bind-nacos-config/
作者
a3d21
发布于
2022年11月15日
许可协议