当我们使用配置中心时,我们希望配置热更。一般的实现方式是,读取配置初始化并增加变更监听。这种方式可以实现,但需要我们维护配置变更逻辑,不友好。
在大多数场景下,我们想要的其实是一个func()
,每次调用返回最新的结构化配置。Go 1.18增加了泛型,可以很优雅地解决配置热更问题。
我以nacos为例,写了一个动态绑定库bind_nacos_cfg。
接口如下
1 2 3 4 5 6 7 8
| type Supplier[T any] func() T func (sup Supplier[T]) Get() T { return sup() }
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 dataID := "abc" group := "def" var GetConf = bind_nacos_cfg.MustBind(cli, dataID, group, &ConfigStruct{})
c := GetConf() c = GetConf() c = GetConf()
fmt.Println(c) }
|