元数据中心概述

元数据中心提供对 Dubbo 中两种类型元数据的访问

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

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

1 地址发现元数据

Dubbo3 中引入了[应用级服务发现机制](/zh-cn/docs3-v2/java-sdk/concepts-and-architecture/service-discovery/#应用级服务发现简介),以解决异构微服务系统互操作性和大规模集群实践中的性能问题。应用级服务发现将完全取代 2.x 时代的面向接口的服务发现。同时,为了保持 Dubbo 面向服务/接口的易用性和服务治理的灵活性,Dubbo 围绕应用级服务发现构建了一套元数据机制,即 接口-应用映射关系接口配置元数据

1.1 接口-应用映射关系

Dubbo 一直能够实现精确的地址发现,即只订阅 Consumer 声明关心的服务和相关地址列表。与拉取/订阅完整地址列表相比,这具有良好的性能优势。在应用级服务发现模型中,订阅精确地址并不容易,因为 Dubbo Consumer 只声明要消费的接口列表,而 Consumer 需要能够将接口转换为 Provider 应用名称才能订阅精确的服务。

为此,Dubbo 需要在元数据中心维护 接口名称->应用名称 的对应关系,Dubbo3 在启动时通过 Provider 主动上报到元数据中心。接口(服务名称)和应用(Provider 应用名称)之间的映射关系可以是一对多的,即一个服务名称可能对应多个不同的应用名称。

以 Zookeeper 为例,映射关系存储在以下位置

$ ./zkCli.sh
$ get /dubbo/mapping/org.apache.dubbo.demo.DemoService
$ demo-provider, two-demo-provider, dubbo-demo-annotation-provider
  1. 节点路径为 /dubbo/mapping/{接口名称}
  2. 多个应用名称用英文逗号 , 分隔

1.2 接口配置元数据

接口级配置元数据 是对地址发现的补充。与 Spring Cloud 等只能同步 ip 和端口信息的地址发现模型相比,Dubbo 的服务发现机制可以同步接口列表、接口定义、接口级参数配置等信息。这部分内容是根据当前应用自身信息和接口信息计算得出的,从性能角度考虑,还会根据元数据生成修订版本,以实现不同机器实例之间的元数据聚合。

以 Zookeeper 为例,接口配置元数据存储在以下位置。如果多个实例生成相同的修订版本,它们最终将共享相同的元数据配置

/dubbo/metadata/{应用名称}/{修订版本}

[zk: localhost:2181(CONNECTED) 33] get /dubbo/metadata/demo-provider/da3be833baa2088c5f6776fb7ab1a436
{
    "app": "demo-provider",
    "revision": "da3be833baa2088c5f6776fb7ab1a436",
    "services": {
        "org.apache.dubbo.demo.DemoService:dubbo":{
            "name": "org.apache.dubbo.demo.DemoService",
            "protocol": "dubbo",
            "path": "org.apache.dubbo.demo.DemoService",
            "params": {
                "side": "provider",
                "release": "",
                "methods": "sayHello, sayHelloAsync",
                "deprecated": "false",
                "dubbo": "2.0.2",
                "pid": "38298",
                "interface": "org.apache.dubbo.demo.DemoService",
                "service-name-mapping": "true",
                "timeout": "3000",
                "generic": "false",
                "metadata-type": "remote",
                "delay": "5000",
                "application": "demo-provider",
                "dynamic": "true",
                "REGISTRY_CLUSTER": "registry1",
                "anyhost": "true",
                "timestamp":"1626887121829"
            }
        },
        "org.apache.dubbo.demo.RestDemoService:1.0.0:rest":{
            "name": "org.apache.dubbo.demo.RestDemoService",
            "version": "1.0.0",
            "protocol": "rest",
            "path": "org.apache.dubbo.demo.RestDemoService",
            "params": {
                "side": "provider",
                "release": "",
                "methods": "getRemoteApplicationName, sayHello, hello, error",
                "deprecated": "false",
                "dubbo": "2.0.2",
                "pid": "38298",
                "interface": "org.apache.dubbo.demo.RestDemoService",
                "service-name-mapping": "true",
                "version": "1.0.0",
                "timeout": "5000",
                "generic": "false",
                "revision": "1.0.0",
                "metadata-type": "remote",
                "delay": "5000",
                "application": "demo-provider",
                "dynamic": "true",
                "REGISTRY_CLUSTER": "registry1",
                "anyhost": "true",
                "timestamp": "1626887120943"
            }
        }
    }
}

2 服务运维元数据

Dubbo 上报的服务运维元数据通常被各种运维系统使用,例如服务测试、网关数据映射、服务静态依赖分析等。各种第三方系统可以直接读取和使用这部分数据。有关具体的连接方法,请参考本章提到的第三方系统。

2.1 Provider 上报的元数据

Provider 端存储的元数据内容如下

{
 "parameters": {
  "side": "provider",
  "methods": "sayHello",
  "dubbo": "2.0.2",
  "threads": "100",
  "interface": "org.apache.dubbo.samples.metadatareport.configcenter.api.AnnotationService",
  "threadpool": "fixed",
  "version": "1.1.1",
  "generic": "false",
  "revision": "1.1.1",
  "valid": "true",
  "application": "metadatareport-configcenter-provider",
  "default.timeout": "5000",
  "group": "d-test",
  "anyhost": "true"
 },
 "canonicalName": "org.apache.dubbo.samples.metadatareport.configcenter.api.AnnotationService",
 "codeSource": "file:/Users/cvictory/workspace/work-mw/dubbo-samples/dubbo-samples-metadata-report/dubbo-samples-metadata-report-configcenter/target/classes/",
 "methods": [{
  "name": "sayHello",
  "parameterTypes": ["java. lang. String"],
  "returnType": "java.lang.String"
 }],
 "types": [{
  "type": "java. lang. String",
  "properties": {
   "value": {
    "type": "char[]"
   },
   "hash": {
    "type": "int"
   }
  }
 }, {
  "type": "int"
 }, {
  "type": "char"
 }]
}

主要有两部分

  • parameters 是服务配置和参数详情。
  • types 定义服务的相关信息。
Consumer 上报的元数据
{
 "valid": "true",
 "side": "consumer",
 "application": "metadatareport-configcenter-consumer",
 "methods": "sayHello",
 "default.timeout": "6666",
 "dubbo": "2.0.2",
 "interface": "org.apache.dubbo.samples.metadatareport.configcenter.api.AnnotationService",
 "version": "1.1.1",
 "revision": "1.1.1",
 "group": "d-test"
}

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

3 元数据上报机制

默认情况下,元数据报告是一个异步过程。为了更好地控制异步行为,元数据配置组件(metadata-report)开放了两个配置项

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

3.1 失败重试 retrytimes

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

3.2 定时刷新

默认情况下启用,可以通过设置 cycleReport=false 禁用。

3.3 完整配置项

dubbo.metadata-report.address=zookeeper://127.0.0.1:2181
dubbo.metadata-report.username=xxx ##Not required
dubbo.metadata-report.password=xxx ##Not required
dubbo.metadata-report.retry-times=30 ##Non-required, default value 100
dubbo.metadata-report.retry-period=5000 ##Not required, default value is 3000
dubbo.metadata-report.cycle-report=false ##Not required, default value is true
dubbo.metadata-report.sync.report=false ##Not required, the default value is false

如果没有配置元数据地址(dubbo.metadata-report.address),则会判断注册中心的协议是否支持元数据中心。如果支持,则会将注册中心的地址作为元数据中心。

4 学习如何扩展

有关如何扩展自定义第三方实现,请参阅扩展元数据报告


上次修改时间:2023 年 1 月 2 日:增强英文文档 (#1798) (95a9f4f6c1c)