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 是否异步,默认异步
  1. xml 配置
    <dubbo:metadata-report address="zookeeper://127.0.0.1:2181"/>
  1. 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源码解析(十四) Dubbo 2.7.x 新功能之元数据中心
路径是/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"
    }
  ]
}

有了以上的完整的信息,

  1. 可以做服务网关进行泛化调用
  2. 可以做服务监控
  3. 可以做服务测试框架

自定义信息

未完待续…