元資料中心概述

Metadata 中心提供 Dubbo 中兩種類型的 Metadata 存取

  • 1. 位址發現 Metadata
    • 1.1 「介面-應用程式」映射關係
    • 1.2 介面配置資料
  • 2. 服務維運 Metadata
    • 2.1 介面定義描述資料
    • 2.2 消費者訂閱關係資料

關於如何配置和開啟 Metadata 中心,請參考具體的實作文件。

1. 位址發現 Metadata

Dubbo 3 引入了[應用程式級服務發現機制](/en/docs3-v2/java-sdk/concepts-and-architecture/service-discovery/#Application-level service discovery introduction) 以解決異構微服務系統互通性的問題,以及大規模叢集實務中的效能問題。應用程式級服務發現將完全取代 2.x 時代的介面級服務發現。同時,為了保持 Dubbo 的服務/介面導向的易用性和服務治理的彈性,Dubbo 圍繞應用程式級服務發現構建了一套 Metadata 機制,即`介面-應用程式映射關係`和`介面配置 Metadata`。

1.1 介面 - 應用程式映射關係

Dubbo 一直以來都能夠實現精準的位址發現,也就是只訂閱 Consumer 宣告關心的服務和相關位址列表。與拉取/訂閱完整的位址列表相比,這具有良好的效能優勢。在應用程式級服務發現模型中,要訂閱精準位址並不容易,因為 Dubbo Consumer 只宣告了要消費的介面列表,Consumer 需要能夠將介面轉換為 Provider 應用程式名稱才能訂閱精準的服務。

因此,Dubbo 需要在 Metadata 中心維護`介面名稱->應用程式名稱`的對應關係,Dubbo 3 在啟動時會透過 Provider 主動回報給 Metadata 中心。介面(服務名稱)和應用程式(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. 服務維運 Metadata

Dubbo 上報的服務運維中繼資料通常被各類運維系統使用,例如服務測試、閘道器資料映射、服務靜態依賴分析等,各類第三方系統可以直接讀取和使用這部分資料。具體的連接方式請參考本章節提到的第三方系統。

2.1 提供者上報的中繼資料

儲存在提供者端的中繼資料內容如下

{
 "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 定義服務的相關資訊。
消費者上報的中繼資料
{
 "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"
}

消費者進程在訂閱時使用的配置中繼資料。

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 學習如何擴充

有關如何擴充自訂第三方實作的資訊,請參閱 擴充 metadata-report


上次修改時間:2023 年 1 月 2 日:增強英文文件 (#1798) (95a9f4f6c1c)