配置中心
go-zero 即将在新版本(v1.7.1)中支持配置中心功能, 本文提前介绍下配置中心的简单使用,使用注意事项和特点介绍。代码 https://github.com/zeromicro/go-zero/pull/3035.
使用demo
package main
import (
"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 subscriber
ss := subscriber.MustNewEtcdSubscriber(subscriber.EtcdConf{
Hosts: []string{"localhost:2379"}, // etcd 地址
Key: "test1", // 配置key
})
// 创建 configurator
cc := configurator.MustNewConfigCenter[TestSt](configurator.Config{
Type: "json", // 配置值类型:json,yaml,toml
}, ss)
// 获取配置
// 注意: 配置如果发生变更,调用的结果永远获取到最新的配置
v, err := cc.GetConfig()
if err != nil {
panic(err)
}
println(v.Name)
// 如果想监听配置变化,可以添加 listener
cc.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 subscriber
ss := subscriber.MustNewEtcdSubscriber(subscriber.EtcdConf{
Hosts: []string{"localhost:2379"}, // etcd 地址
Key: "test1", // 配置key
})
// 创建 configurator
cc := 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 main
import (
"sync"
"github.com/zeromicro/go-zero/core/configcenter"
)
type TestSt struct {
Name string `json:"name"`
}
// 自定义 Subscriber
type MySubscriber struct {
listeners []func()
lock sync.Mutex
}
// 实现自定义 AddListener
func (m *MySubscriber) AddListener(listener func()) error {
m.lock.Lock()
m.listeners = append(m.listeners, listener)
m.lock.Unlock()
return nil
}
// 实现自定义 Value
func (m *MySubscriber) Value() (string, error) {
return "", nil
}
func main() {
mySubscriber := &MySubscriber{}
cc := configurator.MustNewConfigCenter[TestSt](configurator.Config{
Type: "json",
}, mySubscriber) // 注入自定义 Subscriber
v, err := cc.GetConfig()
if err != nil {
panic(err)
}
println(len(v.Name))
}