元資料中心概述
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
- 節點路徑為
/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. 服務維運 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。