配置中心
go-zero 即将在新版本(v1.7.1)中支持配置中心功能, 本文提前介绍下配置中心的简单使用,使用注意事项和特点介绍。代码 https://github.com/zeromicro/go-zero/pull/3035.
使用demo
package mainimport ("github.com/zeromicro/go-zero/core/configcenter""github.com/zeromicro/go-zero/core/configcenter/subscriber""github.com/zeromicro/go-zero/core/discov")// 配置结构定义type TestSt struct {Name string `json:"name"`}func main() {// 创建 etcd subscriberss := subscriber.MustNewEtcdSubscriber(subscriber.EtcdConf{Hosts: []string{"localhost:2379"}, // etcd 地址Key: "test1", // 配置key})// 创建 configuratorcc := configurator.MustNewConfigCenter[TestSt](configurator.Config{Type: "json", // 配置值类型:json,yaml,toml}, ss)// 获取配置// 注意: 配置如果发生变更,调用的结果永远获取到最新的配置v, err := cc.GetConfig()if err != nil {panic(err)}println(v.Name)// 如果想监听配置变化,可以添加 listenercc.AddListener(func() {v, err := cc.GetConfig()if err != nil {panic(err)}println(v.Name)})select {}}
使用注意事项
configurator 支持的模板类型: struct, string。
如果想使用更多配置类型([]struct,map,[]map…),可以使用 string 类型,获取到数据后,自行进行解析。
func main() {// 创建 etcd subscriberss := subscriber.MustNewEtcdSubscriber(subscriber.EtcdConf{Hosts: []string{"localhost:2379"}, // etcd 地址Key: "test1", // 配置key})// 创建 configuratorcc := configurator.MustNewConfigCenter[string](configurator.Config{Type: "json", // 配置值类型:json,yaml,toml}, ss)// 获取配置// 注意: 配置如果发生变更,调用的结果永远获取到最新的配置v, err := cc.GetConfig()if err != nil {panic(err)}// 对 cc.GetConfig() 结果 自定义解析方式}
如果是 struct 模板类型,configurator 的解析器和静态配置方式是一样的,都会进行 config 的校验。详细规则请参考: 参数规则
// 配置结构定义type TestSt struct {Name string `json:",optional"`age int `json:",default=20"`}
特点介绍
configurator 内置快照数据,可以高性能提供能力。
configurator 支持自定义 subscriber,可以根据自己的技术栈自定义扩展,go-zero 默认支持 etcd。
package mainimport ("sync""github.com/zeromicro/go-zero/core/configcenter")type TestSt struct {Name string `json:"name"`}// 自定义 Subscribertype MySubscriber struct {listeners []func()lock sync.Mutex}// 实现自定义 AddListenerfunc (m *MySubscriber) AddListener(listener func()) error {m.lock.Lock()m.listeners = append(m.listeners, listener)m.lock.Unlock()return nil}// 实现自定义 Valuefunc (m *MySubscriber) Value() (string, error) {return "", nil}func main() {mySubscriber := &MySubscriber{}cc := configurator.MustNewConfigCenter[TestSt](configurator.Config{Type: "json",}, mySubscriber) // 注入自定义 Subscriberv, err := cc.GetConfig()if err != nil {panic(err)}println(len(v.Name))}