你會正確配置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
為什麼會這樣?
從原始碼上能看出,當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
但是經過實踐你會發現,有可能不生效,追一下原始碼
可以看到當註冊中心帶了default
是會被優先選中的,但為什麼有時候這麼配置又不行呢?
這是因為dubbo的版本問題,上圖是2.7.3
版本的程式碼,到2.7.5
以後RegistryAwareClusterInvoker
被換成了ZoneAwareClusterInvoker
,看下這個類
default
引數被換成了preferred
,所以我們的配置需要改成
dubbo.registries.zookeeper.preferred=true
如果不放心,可以兩個配置都加上,以防萬一。
關於作者:專注後端的中介軟體開發,公眾號"捉蟲大師"作者,關注我,給你最純粹的技術乾貨