七、元数据中心
1. 元数据中心概览
元数据中心为Dubbo中的两类元数据提供了存取能力:
• 地址发现元数据。地址发现详情请参考【服务发现】一章。
。 接口-应用映射关系
。 接口配置数据
• 服务运维元数据
。 接口定义描述数据
。 消费者订阅关系数据
关于如何配置开启元数据中心请参考具体实现文档。
1) 地址发现元数据
Dubbo3中引入了应用级服务发现机制,用来解决异构微服务体系互通与大规模集群实践的性能问题,应用级服务发现将全面取代2.x是时代的接口级服务发现。
同时为了保持Dubbo面向服务/接口的易用性、服务治理的灵活性,Dubbo围绕应用级服务发现构建了一套元数据机制,即接口-应用映射关系与接口配置元数据。
a) 接口-应用映射关系
Dubbo一直以来都能做到精确的地址发现,即只订阅Consumer声明要关心的服务及相关的地址列表,相比于拉取/订阅全量地址列表,这样做有很好的性能优势。
在应用级服务发现模型中,想做到精确地址订阅并不容易,因为Dubbo Consumer只声明了要消费的接口列表,Consumer需要能够将接口转换为Provider应用名才能进行精准服务订阅,
为此,Dubbo需要在元数据中心维护这一份接口名->应用名的对应关系,Dubbo3中通过provider启动的时主动向元数据中心上报实现。
接口(service name)-应用(Provider application name)的映射关系可以是一对多的,即一个service name可能会对应多个不同的application name。
以zookeeper为例,映射关系保存在以下位置:
• 节点路径是/dubbo/mapping/{interface name}
• 多个应用名通过英文逗号,隔开
b) 接口配置元数据
接口级配置元数据`是作为地址发现的补充,相比于Spring Cloud等地址发现模型只能同步IP、port信息,Dubbo的服务发现机制可以同步接口列表、接口定义、接口级参数配置等信息。
这部分内容根据当前应用的自身信息、以及接口信息计算而来,并且从性能角度出发,还根据元数据生成revision,以实现不同机器实例间的元数据聚合。
以Zookeeper为例,接口配置元数据保存在以下位置,如果多个实例生成的revision相同,则最终会共享同一份元数据配置:
/dubbo/metadata/{application name}/{revision}
{ "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" } } } }
《Apache Dubbo微服务开发从入门到精通》——服务治理与生态——七、元数据中心(2):https://developer.aliyun.com/article/1223684