幾個你不知道的dubbo注冊中心細節


你會正確配置backup地址嗎?

在配置dubbo注冊中心時,一般會這樣寫

dubbo.registry.protocol=zookeeper
dubbo.registry.address=127.0.0.1:2181

也會簡單地寫成

dubbo.registry.address=zookeeper://127.0.0.1:2181

當zookeeper地址不止一個,需要配置backup地址時,會這樣寫

dubbo.registry.protocol=zookeeper
dubbo.registry.address=127.0.0.1:2181,127.0.0.1:2182

這時候如果你簡寫成這樣

dubbo.registry.address=zookeeper://127.0.0.1:2181,127.0.0.1:2182

那就啟動報錯了~看下報錯日志

java.lang.IllegalStateException: Failed to receive INITIALIZED event from zookeeper, pls. check if url zookeeper://127.0.0.1:2181,127.0.0.1:2182/org.apache.dubbo.metadata.report.MetadataReport?client=&dubbo.config-center.root-path=/ is correct

為什么會這樣?

image

從源碼上能看出,當address中包含://時就認為address配置的是一個URL,此時如果要配置backup地址必須在URL參數中指定backup參數才行;

dubbo.registry.address=zookeeper://127.0.0.1:2181?backup=127.0.0.1:2182

但當address中不包含://時,dubbo認為你配置的第一個地址是主,逗號后的地址都是backup。

多注冊中心有什么貓膩?

多注冊中心可以這樣配置

dubbo.registries.zk1.address=zookeeper://127.0.0.1:2181
dubbo.registries.zk2.address=disf://127.0.0.1:2182

這樣配置dubbo的默認行為是雙注冊都消費

雙注冊不用說,就是會將服務注冊到這兩個注冊中心上去,應用啟動耗時增加

都消費指的是針對每個provider,consumer都會和它建立連接,消費時按注冊中心順序挑選一個可用的invoker進行調用,也就是說將兩個注冊中心中提供的服務merge起來進行調用。假設這兩個注冊中心提供了相同的服務,consumer會和每個provider建立2條長鏈接

設置默認消費注冊中心怎么這么難?

接上條,如果消費了兩個注冊中心,兩個注冊中心都提供了相同的服務,我想設置個默認消費的注冊中心怎么設置呢?一般是這么設置

dubbo.registries.zk1.default=true

但是經過實踐你會發現,有可能不生效,追一下源碼

image

可以看到當注冊中心帶了default是會被優先選中的,但為什么有時候這么配置又不行呢?

這是因為dubbo的版本問題,上圖是2.7.3版本的代碼,到2.7.5以后RegistryAwareClusterInvoker被換成了ZoneAwareClusterInvoker,看下這個類

image

default參數被換成了preferred,所以我們的配置需要改成

dubbo.registries.zookeeper.preferred=true

如果不放心,可以兩個配置都加上,以防萬一。


關於作者:專注后端的中間件開發,公眾號"捉蟲大師"作者,關注我,給你最純粹的技術干貨


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM