Dubbo源码解析(十四) Dubbo 2.7.x 新功能之元数据中心
元数据
元数据是什么?
元数据定义为描述数据的数据,在服务治理中,例如服务接口名,重试次数,版本号等等都可以理解为元数据。
在 2.7 之前,元数据一股脑丢在了注册中心之中,这造成了一系列的问题:
推送量大 -> 存储数据量大 -> 网络传输量大 -> 延迟严重
生产者端注册 30+ 参数,有接近一半是不需要作为注册中心进行传递;消费者端注册 25+ 参数,只有个别需要传递给注册中心。有了以上的理论分析,Dubbo 2.7 进行了大刀阔斧的改动,只将真正属于服务治理的数据发布到注册中心之中,大大降低了注册中心的负荷。
同时,将全量的元数据发布到另外的组件中:元数据中心。
----------------------------------以上摘自http://dubbo.apache.org/zh-cn/blog/dubbo-27-features.html----------------------------------------
首先在之前的时候,虽然他们说是把很多的注册信息都注册到了注册中心,但是远远还不满足于我们的需求,以至于我们在开发dubbo网关的时候,不能直接从注册中心中读取到这个东西。从而网关对泛化调用也无能为力(当然后续我们经过扫描的做了这个处理,但是不太优雅)。
现在有了元数据中心之后,首先由两个问题,怎么使用以及使用后的带来的价值?
ps: 上次在杭州的 dubbo Meetup 讲的三大中心时并没有什么感觉这些功能的应用场景,今天探析了它的实现方式之后,感觉异常的强大。
使用方式
目前支持redis和 Zookeeper 两种,下面示例使用的是Zookeeper
配置项 | 解释 |
---|---|
address | 注册地址 |
username | 用户名 |
password | 密码 |
timeout | 超时时间 |
group | 分组 |
retryTimes | 重试次数 |
retryPeriod | 重试间隔 |
cycleReport | 周期,默认每天 |
syncReport | 是否异步,默认异步 |
- xml 配置
<dubbo:metadata-report address="zookeeper://127.0.0.1:2181"/>
- java config 方式
ServiceConfig<GreetingService> serviceConfig = new ServiceConfig<GreetingService>();
serviceConfig.setApplication(new ApplicationConfig("first-dubbo-provider"));
serviceConfig.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
// 设置元数据中心
MetadataReportConfig mrc = new MetadataReportConfig("zookeeper://127.0.0.1:2181");
serviceConfig.setMetadataReportConfig(mrc);
//....
serviceConfig.export();
详细信息及应用场景
以下是使用官网的demo示例provider生成的(zookeeper 演示)
路径是/dubbo/metadata/服务名/provider/应用名/service.data
详细信息
{
"parameters": {
"side": "provider",
"release": "2.7.1",
"methods": "sayHello",
"deprecated": "false",
"dubbo": "2.0.2",
"default.dynamic": "false",
"interface": "com.wuhulala.dubbo.gateway.GreetingService",
"generic": "false",
"default.deprecated": "false",
"application": "first-dubbo-provider",
"default.register": "true",
"dynamic": "false",
"register": "true",
"anyhost": "true"
},
"canonicalName": "com.wuhulala.dubbo.gateway.GreetingService",
"codeSource": "file:/D:/code/github/2019-up/dubbo-gateway/dubbo-gateway-core/target/classes/",
"methods": [
{
"name": "sayHello",
"parameterTypes": [
"java.lang.String"
],
"returnType": "java.lang.String"
}
],
"types": [
{
"type": "int"
},
{
"type": "java.lang.String",
"properties": {
"value": {
"type": "char[]"
},
"hash": {
"type": "int"
}
}
},
{
"type": "char"
}
]
}
有了以上的完整的信息,
- 可以做服务网关进行泛化调用
- 可以做服务监控
- 可以做服务测试框架
- …
自定义信息
未完待续…