配置中心

go-zero 即将在新版本(v1.7.1)中支持配置中心功能, 本文提前介绍下配置中心的简单使用,使用注意事项和特点介绍。代码 https://github.com/zeromicro/go-zero/pull/3035.

使用demo

  1. package main
  2. import (
  3. "github.com/zeromicro/go-zero/core/configcenter"
  4. "github.com/zeromicro/go-zero/core/configcenter/subscriber"
  5. "github.com/zeromicro/go-zero/core/discov"
  6. )
  7. // 配置结构定义
  8. type TestSt struct {
  9. Name string `json:"name"`
  10. }
  11. func main() {
  12. // 创建 etcd subscriber
  13. ss := subscriber.MustNewEtcdSubscriber(subscriber.EtcdConf{
  14. Hosts: []string{"localhost:2379"}, // etcd 地址
  15. Key: "test1", // 配置key
  16. })
  17. // 创建 configurator
  18. cc := configurator.MustNewConfigCenter[TestSt](configurator.Config{
  19. Type: "json", // 配置值类型:json,yaml,toml
  20. }, ss)
  21. // 获取配置
  22. // 注意: 配置如果发生变更,调用的结果永远获取到最新的配置
  23. v, err := cc.GetConfig()
  24. if err != nil {
  25. panic(err)
  26. }
  27. println(v.Name)
  28. // 如果想监听配置变化,可以添加 listener
  29. cc.AddListener(func() {
  30. v, err := cc.GetConfig()
  31. if err != nil {
  32. panic(err)
  33. }
  34. println(v.Name)
  35. })
  36. select {}
  37. }

使用注意事项

  1. configurator 支持的模板类型: struct, string。

  2. 如果想使用更多配置类型([]struct,map,[]map…),可以使用 string 类型,获取到数据后,自行进行解析。

    1. func main() {
    2. // 创建 etcd subscriber
    3. ss := subscriber.MustNewEtcdSubscriber(subscriber.EtcdConf{
    4. Hosts: []string{"localhost:2379"}, // etcd 地址
    5. Key: "test1", // 配置key
    6. })
    7. // 创建 configurator
    8. cc := configurator.MustNewConfigCenter[string](configurator.Config{
    9. Type: "json", // 配置值类型:json,yaml,toml
    10. }, ss)
    11. // 获取配置
    12. // 注意: 配置如果发生变更,调用的结果永远获取到最新的配置
    13. v, err := cc.GetConfig()
    14. if err != nil {
    15. panic(err)
    16. }
    17. // 对 cc.GetConfig() 结果 自定义解析方式
    18. }
  3. 如果是 struct 模板类型,configurator 的解析器和静态配置方式是一样的,都会进行 config 的校验。详细规则请参考: 参数规则

  1. // 配置结构定义
  2. type TestSt struct {
  3. Name string `json:",optional"`
  4. age int `json:",default=20"`
  5. }

特点介绍

  1. configurator 内置快照数据,可以高性能提供能力。

  2. configurator 支持自定义 subscriber,可以根据自己的技术栈自定义扩展,go-zero 默认支持 etcd。

  1. package main
  2. import (
  3. "sync"
  4. "github.com/zeromicro/go-zero/core/configcenter"
  5. )
  6. type TestSt struct {
  7. Name string `json:"name"`
  8. }
  9. // 自定义 Subscriber
  10. type MySubscriber struct {
  11. listeners []func()
  12. lock sync.Mutex
  13. }
  14. // 实现自定义 AddListener
  15. func (m *MySubscriber) AddListener(listener func()) error {
  16. m.lock.Lock()
  17. m.listeners = append(m.listeners, listener)
  18. m.lock.Unlock()
  19. return nil
  20. }
  21. // 实现自定义 Value
  22. func (m *MySubscriber) Value() (string, error) {
  23. return "", nil
  24. }
  25. func main() {
  26. mySubscriber := &MySubscriber{}
  27. cc := configurator.MustNewConfigCenter[TestSt](configurator.Config{
  28. Type: "json",
  29. }, mySubscriber) // 注入自定义 Subscriber
  30. v, err := cc.GetConfig()
  31. if err != nil {
  32. panic(err)
  33. }
  34. println(len(v.Name))
  35. }