元数据中心概述

元数据中心为 Dubbo 中的两类元数据提供了存取能力:

  • 1 地址发现元数据
    • 1.1 ‘接口-应用’ 映射关系
    • 1.2 接口配置数据
  • 2 服务运维元数据
    • 2.1 接口定义描述数据
    • 2.2 消费者订阅关系数据

关于如何配置开启元数据中心请参考具体实现文档。

1 地址发现元数据

Dubbo3 中引入了 应用级服务发现机制 用来解决异构微服务体系互通与大规模集群实践的性能问题,应用级服务发现将全面取代 2.x 是时代的接口级服务发现。 同时为了保持 Dubbo 面向服务/接口的易用性、服务治理的灵活性,Dubbo 围绕应用级服务发现构建了一套元数据机制,即 接口 - 应用映射关系接口配置元数据

1.1 接口 - 应用映射关系

Dubbo 一直以来都能做到精确的地址发现,即只订阅 Consumer 声明要关心的服务及相关的地址列表,相比于拉取/订阅全量地址列表,这样做有很好的性能优势。 在应用级服务发现模型中,想做到精确地址订阅并不容易,因为 Dubbo Consumer 只声明了要消费的接口列表,Consumer 需要能够将接口转换为 Provider 应用名才能进行精准服务订阅,

为此,Dubbo 需要在元数据中心维护这一份 接口名->应用名 的对应关系,Dubbo3 中通过 provider 启动的时主动向元数据中心上报实现。 接口 (service name) - 应用 (Provider application name) 的映射关系可以是一对多的,即一个 service name 可能会对应多个不同的 application name。

以 zookeeper 为例,映射关系保存在以下位置:

  1. $ ./zkCli.sh
  2. $ get /dubbo/mapping/org.apache.dubbo.demo.DemoService
  3. $ demo-provider,two-demo-provider,dubbo-demo-annotation-provider
  1. 节点路径是 /dubbo/mapping/{interface name}
  2. 多个应用名通过英文逗号 , 隔开

1.2 接口配置元数据

接口级配置元数据是作为地址发现的补充,相比于 Spring Cloud 等地址发现模型只能同步 ip、port 信息,Dubbo 的服务发现机制可以同步接口列表、接口定义、接口级参数配置等信息。 这部分内容根据当前应用的自身信息、以及接口信息计算而来,并且从性能角度出发,还根据元数据生成 revision,以实现不同机器实例间的元数据聚合。

以 Zookeeper 为例,接口配置元数据保存在以下位置,如果多个实例生成的 revision 相同,则最终会共享同一份元数据配置:

/dubbo/metadata/{application name}/{revision}

  1. [zk: localhost:2181(CONNECTED) 33] get /dubbo/metadata/demo-provider/da3be833baa2088c5f6776fb7ab1a436
  1. {
  2. "app":"demo-provider",
  3. "revision":"da3be833baa2088c5f6776fb7ab1a436",
  4. "services":{
  5. "org.apache.dubbo.demo.DemoService:dubbo":{
  6. "name":"org.apache.dubbo.demo.DemoService",
  7. "protocol":"dubbo",
  8. "path":"org.apache.dubbo.demo.DemoService",
  9. "params":{
  10. "side":"provider",
  11. "release":"",
  12. "methods":"sayHello,sayHelloAsync",
  13. "deprecated":"false",
  14. "dubbo":"2.0.2",
  15. "pid":"38298",
  16. "interface":"org.apache.dubbo.demo.DemoService",
  17. "service-name-mapping":"true",
  18. "timeout":"3000",
  19. "generic":"false",
  20. "metadata-type":"remote",
  21. "delay":"5000",
  22. "application":"demo-provider",
  23. "dynamic":"true",
  24. "REGISTRY_CLUSTER":"registry1",
  25. "anyhost":"true",
  26. "timestamp":"1626887121829"
  27. }
  28. },
  29. "org.apache.dubbo.demo.RestDemoService:1.0.0:rest":{
  30. "name":"org.apache.dubbo.demo.RestDemoService",
  31. "version":"1.0.0",
  32. "protocol":"rest",
  33. "path":"org.apache.dubbo.demo.RestDemoService",
  34. "params":{
  35. "side":"provider",
  36. "release":"",
  37. "methods":"getRemoteApplicationName,sayHello,hello,error",
  38. "deprecated":"false",
  39. "dubbo":"2.0.2",
  40. "pid":"38298",
  41. "interface":"org.apache.dubbo.demo.RestDemoService",
  42. "service-name-mapping":"true",
  43. "version":"1.0.0",
  44. "timeout":"5000",
  45. "generic":"false",
  46. "revision":"1.0.0",
  47. "metadata-type":"remote",
  48. "delay":"5000",
  49. "application":"demo-provider",
  50. "dynamic":"true",
  51. "REGISTRY_CLUSTER":"registry1",
  52. "anyhost":"true",
  53. "timestamp":"1626887120943"
  54. }
  55. }
  56. }
  57. }

2 服务运维元数据

Dubbo 上报的服务运维元数据通常为各种运维系统所用,如服务测试、网关数据映射、服务静态依赖关系分析等。各种第三方系统可直接读取并使用这部分数据,具体对接方式可参见本章提及的几个第三方系统。

2.1 Provider 上报的元数据

provider端存储的元数据内容如下:

  1. {
  2. "parameters": {
  3. "side": "provider",
  4. "methods": "sayHello",
  5. "dubbo": "2.0.2",
  6. "threads": "100",
  7. "interface": "org.apache.dubbo.samples.metadatareport.configcenter.api.AnnotationService",
  8. "threadpool": "fixed",
  9. "version": "1.1.1",
  10. "generic": "false",
  11. "revision": "1.1.1",
  12. "valid": "true",
  13. "application": "metadatareport-configcenter-provider",
  14. "default.timeout": "5000",
  15. "group": "d-test",
  16. "anyhost": "true"
  17. },
  18. "canonicalName": "org.apache.dubbo.samples.metadatareport.configcenter.api.AnnotationService",
  19. "codeSource": "file:/Users/cvictory/workspace/work-mw/dubbo-samples/dubbo-samples-metadata-report/dubbo-samples-metadata-report-configcenter/target/classes/",
  20. "methods": [{
  21. "name": "sayHello",
  22. "parameterTypes": ["java.lang.String"],
  23. "returnType": "java.lang.String"
  24. }],
  25. "types": [{
  26. "type": "java.lang.String",
  27. "properties": {
  28. "value": {
  29. "type": "char[]"
  30. },
  31. "hash": {
  32. "type": "int"
  33. }
  34. }
  35. }, {
  36. "type": "int"
  37. }, {
  38. "type": "char"
  39. }]
  40. }

主要有两部分:

  • parameters 为服务配置与参数详情。
  • types 为服务定义信息。
Consumer 上报的元数据:
  1. {
  2. "valid": "true",
  3. "side": "consumer",
  4. "application": "metadatareport-configcenter-consumer",
  5. "methods": "sayHello",
  6. "default.timeout": "6666",
  7. "dubbo": "2.0.2",
  8. "interface": "org.apache.dubbo.samples.metadatareport.configcenter.api.AnnotationService",
  9. "version": "1.1.1",
  10. "revision": "1.1.1",
  11. "group": "d-test"
  12. }

Consumer 进程订阅时使用的配置元数据。

3 元数据上报工作机制

元数据上报默认是一个异步的过程,为了更好的控制异步行为,元数据配置组件 (metadata-report) 开放了两个配置项:

  • 失败重试
  • 每天定时重刷

3.1 retrytimes 失败重试

失败重试可以通过 retrytimes (重试次数,默认100),retryperiod(重试周期,默认3000ms)进行设置。

3.2 定时刷新

默认开启,可以通过设置 cycleReport=false 进行关闭。

3.3 完整的配置项

  1. dubbo.metadata-report.address=zookeeper://127.0.0.1:2181
  2. dubbo.metadata-report.username=xxx ##非必须
  3. dubbo.metadata-report.password=xxx ##非必须
  4. dubbo.metadata-report.retry-times=30 ##非必须,default值100
  5. dubbo.metadata-report.retry-period=5000 ##非必须,default值3000
  6. dubbo.metadata-report.cycle-report=false ##非必须,default值true
  7. dubbo.metadata-report.sync.report=false ##非必须,default值为false

如果元数据地址(dubbo.metadata-report.address)也不进行配置,会判断注册中心的协议是否支持元数据中心,如果支持,会使用注册中心的地址来用作元数据中心。

4 了解如何扩展

请参见 扩展 metadata-report 了解如何扩展自定义第三方实现。

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