元数据中心概述
元数据中心提供对 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
- 节点路径为
/dubbo/mapping/{接口名称}
- 多个应用名称用英文逗号
,
分隔
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 学习如何扩展
有关如何扩展自定义第三方实现,请参阅扩展元数据报告。