幾個你不知道的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

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


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