Dubbogo 3.0 配置中心和配置监听

1. 配置中心概念

配置中心即为在分布式场景下,无法将最新的框架配置文件和应用程序绑定在一起,可以指定好配置中心的信息,例如配置中心类型和地址,并在框架启动时从配置中心拉取相应配置进行启动。

2. 配置中心的配置

参考仓库:dubbo-go-samples/configcenter

dubbogo.yml

  1. dubbo:
  2. config-center:
  3. protocol: nacos
  4. address: 127.0.0.1:8848
  5. data-id: dubbo-go-samples-configcenter-nacos-server
  6. namespace: myNamespaceID # 可选配置 nacos namespace ID, 默认是 public
  7. group: mygroup # 可选配置 nacos group, 默认是 DEFAULT_GROUP

配置中心 nacos 内

group 默认为 dubbo

dataID 为指定的id:dubbo-go-samples-configcenter-nacos-server

写入框架配置例如下面,即可正常启动。

  1. dubbo:
  2. registries:
  3. demoZK:
  4. protocol: zookeeper
  5. timeout: 3s
  6. address: 127.0.0.1:2181
  7. protocols:
  8. triple:
  9. name: tri
  10. port: 20000
  11. provider:
  12. services:
  13. GreeterProvider:
  14. interface: com.apache.dubbo.sample.basic.IGreeter

3. Dubbogo 动态配置 API

Config API 为 dubbogo 3.0 用来操作配置结构的 API。可使用框架提供的 Config API 进行配置结构的初始化,获取组件实例并使用。一个例子如下,包含了动态配置实例的初始化、发布配置、读取配置、订阅配置操作。

  1. const configCenterNacosServerConfig = `# set in config center, group is 'dubbo', dataid is 'dubbo-go-samples-configcenter-nacos-server', namespace is default 'public'
  2. dubbo:
  3. registries:
  4. demoZK:
  5. protocol: zookeeper
  6. address: 127.0.0.1:2181
  7. protocols:
  8. triple:
  9. name: tri
  10. port: 20000
  11. provider:
  12. services:
  13. GreeterProvider:
  14. interface: com.apache.dubbo.sample.basic.IGreeter # must be compatible with grpc or dubbo-java`
  15. type GreeterProvider struct {
  16. api.GreeterProviderBase
  17. }
  18. func (s *GreeterProvider) SayHello(ctx context.Context, in *api.HelloRequest) (*api.User, error) {
  19. logger.Infof("Dubbo3 GreeterProvider get user name = %s\n", in.Name)
  20. return &api.User{Name: "Hello " + in.Name, Id: "12345", Age: 21}, nil
  21. }
  22. // There is no need to export DUBBO_GO_CONFIG_PATH, as you are using config api to set config
  23. func main() {
  24. // 获取动态配置实例 dynamicConfig
  25. dynamicConfig, err := config.NewConfigCenterConfigBuilder().
  26. SetProtocol("nacos").
  27. SetAddress("127.0.0.1:8848").
  28. SetGroup("dubbo").
  29. Build().GetDynamicConfiguration()
  30. if err != nil {
  31. panic(err)
  32. }
  33. // 使用 dynamicConfig 结构来发布配置
  34. if err := dynamicConfig.PublishConfig("dubbo-go-samples-configcenter-nacos-server", "dubbo", configCenterNacosServerConfig); err != nil {
  35. panic(err)
  36. }
  37. // 使用 dynamicConfig 结构来读取配置
  38. data, err := dynamicConfig.GetRule("dubbo-go-samples-configcenter-nacos-server", config_center.WithGroup("dubbo"))
  39. if err != nil{
  40. panic(err)
  41. }
  42. logger.Infof("get config = %s", data)
  43. // 使用 dynamicConfig 结构, 通过自定义listener来订阅配置更新事件
  44. l := &listener{}
  45. dynamicConfig.AddListener("dubbo-go-samples-configcenter-nacos-server", l)
  46. time.Sleep(time.Second * 10)
  47. config.SetProviderService(&GreeterProvider{})
  48. // 以 API 的形式来启动框架
  49. rootConfig := config.NewRootConfigBuilder().
  50. SetConfigCenter(config.NewConfigCenterConfigBuilder().
  51. SetProtocol("nacos").SetAddress("127.0.0.1:8848"). // 根据配置结构,设置配置中心
  52. SetDataID("dubbo-go-samples-configcenter-nacos-server"). // 设置配置ID
  53. SetGroup("dubbo").
  54. Build()).
  55. Build()
  56. if err := rootConfig.Init(); err != nil { // 框架启动
  57. panic(err)
  58. }
  59. select {}
  60. }
  61. type listener struct {
  62. }
  63. func (l listener) Process(event *config_center.ConfigChangeEvent) {
  64. logger.Infof("listener get config = %s", event.Value)
  65. }

当然,以 API 的形式来启动框架时,可以直接以API的形式来启动框架。参考基本概念模块的 Dubbogo 框架配置

4. Dubbogo 配置热更新

// todo

正在开发中ing

下一章: 【Filter】

最后修改 December 16, 2022: Fix check (#1736) (97972c1)