Zookeeper
1 準備工作
- 了解 Dubbo 基本開發步驟
- 安裝並啟動 Zookeeper
2 使用說明
2.1 添加 Maven 依賴
如果項目已啟用 Zookeeper 作為註冊中心,則無需額外配置。
如果未使用 Zookeeper 註冊中心,請參考 為註冊中心添加 Zookeeper 相關依賴。
2.2 啟用 Zookeeper 配置中心
<dubbo:metadata-report address="zookeeper://127.0.0.1:2181"/>
或
dubbo
metadata-report
address: zookeeper://127.0.0.1:2181
或
dubbo.metadata-report.address=zookeeper://127.0.0.1:2181
或
MetadataReportConfig metadataConfig = new MetadataReportConfig();
metadataConfig.setAddress("zookeeper://127.0.0.1:2181");
關於 address
格式,請參考 [zookeeper 註冊中心 - 啟用配置](../../registry/zookeeper/#22-配置與啟用-zookeeper)
3 高級配置
完整配置參數請參考 metadata-report-config。
4 工作原理
4.1 [服務運維元數據](../overview/#2-服務運維元數據)
Zookeeper 基於樹形結構存儲數據,其元數據信息位於以下節點
Provider: /dubbo/metadata/{interface name}/{version}/{group}/provider/{application name}
Consumer: /dubbo/metadata/{interface name}/{version}/{group}/consumer/{application name}
當版本或群組不存在時,會取消版本路徑和群組路徑,路徑如下
Provider: /dubbo/metadata/{interface name}/provider/{application name}
Consumer: /dubbo/metadata/{interface name}/consumer/{application name}
通過 zkCli get 操作查看數據。
提供者節點
[zk: localhost:2181(CONNECTED) 8] get /dubbo/metadata/org.apache.dubbo.demo.DemoService/provider/demo-provider
{"parameters":{"side":"provider","interface":"org.apache.dubbo.demo.DemoService","metadata-type":"remote","application":"demo-provider", "dubbo":"2.0.2","release":"","anyhost":"true","delay":"5000","methods":"sayHello,sayHelloAsync","deprecated":"false" ,"dynamic":"true","timeout":"3000","generic":"false"},"canonicalName":"org.apache.dubbo.demo.DemoService","codeSource":"file:/ Users/apple/IdeaProjects/dubbo/dubbo-demo/dubbo-demo-interface/target/classes/","methods":[{"name":"sayHelloAsync","parameterTypes":["java.lang.String" ],"returnType":"java.util.concurrent.CompletableFuture"},{"name":"sayHello","parameterTypes":["java.lang.String"],"returnType":"java.lang.String "}],"types":[{"type":"java.util.concurrent.CompletableFuture","properties":{"result":"java.lang.Object","stack":"java.util. concurrent.CompletableFuture.Completion"}},{"type":"java.lang.Object"},{"type":"java.lang.String"},{"type":"java.util.concurrent.CompletableFuture .Completion","properties":{"next":"java.util.concurrent.Co mpletableFuture. Completion", "status": "int"}}, {"type": "int"}]}
cZxid = 0x25a9b1
ctime = Mon Jun 28 21:35:17 CST 2021
mZxid = 0x25a9b1
mtime = Mon Jun 28 21:35:17 CST 2021
pZxid = 0x25a9b1
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 1061
numChildren = 0
消費者節點
[zk: localhost:2181(CONNECTED) 10] get /dubbo/metadata/org.apache.dubbo.demo.DemoService/consumer/demo-consumer
{"side":"consumer","interface":"org.apache.dubbo.demo.DemoService","metadata-type":"remote","application":"demo-consumer","dubbo":" 2.0.2","release":"","sticky":"false","check":"false","methods":"sayHello,sayHelloAsync"}
cZxid = 0x25aa24
ctime = Mon Jun 28 21:57:43 CST 2021
mZxid = 0x25aa24
mtime = Mon Jun 28 21:57:43 CST 2021
pZxid = 0x25aa24
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 219
numChildren = 0
4.2 [地址發現 - 接口-應用名稱映射](../overview/#11-接口—應用映射關係)
在 Dubbo 3.0 中,默認使用服務自省機制實現服務發現。關於服務自省,請參考 服務自省
簡而言之,服務自省機制需要能夠通過接口名稱找到對應的應用程序名稱。 這種關係可以是一對多的,即一個服務名稱可能對應多個不同的應用程序名稱。 在 3.0 中,元數據中心提供了這種映射功能。
Zookeeper
如上所述,服務名稱和應用程序名稱可能是一對多的。 在 zookeeper 中,使用單個鍵值對進行存儲,多個應用程序名稱用英文逗號,
分隔。 由於使用單個鍵值對保存數據,因此在多個客戶端的情況下可能會出現併發覆蓋的問題。 因此,我們使用 zookeeper 中的版本機制版本來解決這個問題。 在 zookeeper 中,每次修改數據時,dataVersion 都會增加。 我們可以使用版本機制來解決多個客戶端同時更新映射的併發問題。 在更新之前,不同的客戶端檢查一次版本並將其用作本地證書。 更新時,將憑證版本傳遞給服務器以比較版本。 如果不一致,則表示在此期間已被其他客戶端修改。 重新獲取憑證並重試(CAS)。 目前,如果 6 次重試失敗,則放棄更新映射行為。
Curator api。
CuratorFramework client = ...
client.setData().withVersion(ticket).forPath(path, dataBytes);
映射信息位於
/dubbo/mapping/{service name}
通過 zkCli get 操作查看數據。
[zk: localhost:2181(CONNECTED) 26] get /dubbo/mapping/org.apache.dubbo.demo.DemoService
demo-provider, two-demo-provider, dubbo-demo-annotation-provider
cZxid = 0x25a80f
ctime = Thu Jun 10 01:36:40 CST 2021
mZxid = 0x25a918
mtime = Fri Jun 11 18:46:40 CST 2021
pZxid = 0x25a80f
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 62
numChildren = 0
4.3 [地址發現 - 接口配置元數據](../overview/#12-Interface Configuration Metadata)
要啟用遠程接口配置元數據註冊,需要將以下配置添加到應用程序中,因為默認情況下 Dubbo3 應用程序級服務發現將啟用服務自省模式並且不會將數據註冊到元數據中心。
dubbo.application.metadata-type=remote
或者,仍然在自省模式下啟用集中式元數據註冊
dubbo.application.metadata-type=local
dubbo.metadata-report.report-metadata=true
Zookeeper 的應用程序級元數據位於 /dubbo/metadata/{application name}/{revision}
[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"}}}}
cZxid = 0x25b336
ctime = Thu Jul 22 01:05:55 CST 2021
mZxid = 0x25b336
mtime = Thu Jul 22 01:05:55 CST 2021
pZxid = 0x25b336
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 1286
numChildren = 0