Dubbo目前支持4種注冊中心,(multicast zookeeper redis simple)
推薦使用Zookeeper注冊中心,
Multicast注冊中心
不需要啟動任何中心節點,只要廣播地址一樣,就可以互相發現
組播受網絡結構限制,只適合小規模應用或開發階段使用。
組播地址段: 224.0.0.0 - 239.255.255.255
相關概念解析:
提供方啟動時廣播自己的地址。
消費方啟動時廣播訂閱請求。
提供方收到訂閱請求時,單播自己的地址給訂閱者,如果設置了unicast=false,則廣播給訂閱者。
消費方收到提供方地址時,連接該地址進行RPC調用。
配置multicast 注冊中心
<dubbo:registryaddress="multicast://224.5.6.7:1234"/>
Or:
<dubbo:registryprotocol="multicast"address="224.5.6.7:1234"/>
為了減少廣播量,Dubbo缺省使用單播發送提供者地址信息給消費者,
如果一個機器上同時啟了多個消費者進程,消費者需聲明unicast=false,否則只會有一個消費者能收到消息:
<dubbo:registryaddress="multicast://224.5.6.7:1234?unicast=false"/>
Or:
<dubbo:registryprotocol="multicast"address="224.5.6.7:1234">
<dubbo:parameterkey="unicast"value="false"/>
</dubbo:registry>
Zookeeper注冊中心
建議使用dubbo-2.3.3以上版本的zookeeper注冊中心客戶端
Zookeeper說明
Zookeeper是Apacahe Hadoop的子項目,是一個樹型的目錄服務,支持變更推送,適合作為Dubbo服務的注冊中心,工業強度較高,
可用於生產環境,並推薦使用,參見:http://zookeeper.apache.org
Zookeeper安裝
安裝方式參見: Zookeeper安裝手冊,只需搭一個原生的Zookeeper服務器,並將Quick Start中Provider和Consumer里的
conf/dubbo.properties中的dubbo.registry.addrss的值改為zookeeper://127.0.0.1:2181即可使用
可靠性聲明
阿里內部並沒有采用Zookeeper做為注冊中心(阿里巴巴為什么不用 ZooKeeper 做服務發現?http://jm.taobao.org/2018/06/13/%E5%81%9A%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0%EF%BC%9F/),而是使用自己實現的基於數據庫的注冊中心,即:Zookeeper注冊中心並沒有在阿里
內部長時間運行的可靠性保障,此Zookeeper橋接實現只為開源版本提供,其可靠性依賴於Zookeeper本身的可靠性。
流程說明:
服務提供者啟動時
向/dubbo/com.foo.BarService/providers目錄下寫入自己的URL地址。
服務消費者啟動時
訂閱/dubbo/com.foo.BarService/providers目錄下的提供者URL地址。
並向/dubbo/com.foo.BarService/consumers目錄下寫入自己的URL地址。
監控中心啟動時
訂閱/dubbo/com.foo.BarService目錄下的所有提供者和消費者URL地址。
支持以下功能:
當提供者出現斷電等異常停機時,注冊中心能自動刪除提供者信息。
當注冊中心重啟時,能自動恢復注冊數據,以及訂閱請求。
當會話過期時,能自動恢復注冊數據,以及訂閱請求。
當設置<dubbo:registry check="false" />時,記錄失敗注冊和訂閱請求,后台定時重試。
可通過<dubbo:registry username="admin" password="1234" />設置zookeeper登錄信息。
可通過<dubbo:registry group="dubbo" />設置zookeeper的根節點,不設置將使用無根樹。
支持*號通配符<dubbo:reference group="*" version="*" />,可訂閱服務的所有分組和所有版本的提供者
Redis注冊中心
Redis說明
Redis是一個高效的KV存儲服務器,參見:http://redis.io
Redis安裝
安裝方式參見: Redis安裝手冊,只需搭一個原生的Redis服務器,並將Quick Start中Provider和Consumer里的conf/dubbo.properties中的dubbo.registry.addrss的值改為redis://127.0.0.1:6379即可使用
Redis過期數據
通過心跳的方式檢測臟數據,服務器時間必須相同,並且對服務器有一定壓力。
可靠性聲明
阿里內部並沒有采用Redis做為注冊中心,而是使用自己實現的基於數據庫的注冊中心,即:Redis注冊中心並沒有在阿里內部長時間運行的可靠性保障,此Redis橋接實現只為開源版本提供,其可靠性依賴於Redis本身的可靠性。
數據結構:
使用Redis的Key/Map結構存儲數據。
主Key為服務名和類型。
Map中的Key為URL地址。
Map中的Value為過期時間,用於判斷臟數據,臟數據由監控中心刪除。(注意:服務器時間必需同步,否則過期檢測會不准確)
使用Redis的Publish/Subscribe事件通知數據變更。
通過事件的值區分事件類型:register, unregister, subscribe, unsubscribe。
普通消費者直接訂閱指定服務提供者的Key,只會收到指定服務的register, unregister事件。
監控中心通過psubscribe功能訂閱/dubbo/*,會收到所有服務的所有變更事件。
調用過程:
服務提供方啟動時,向Key:/dubbo/com.foo.BarService/providers下,添加當前提供者的地址。
並向Channel:/dubbo/com.foo.BarService/providers發送register事件。
服務消費方啟動時,從Channel:/dubbo/com.foo.BarService/providers訂閱register和unregister事件。
並向Key:/dubbo/com.foo.BarService/providers下,添加當前消費者的地址。
服務消費方收到register和unregister事件后,從Key:/dubbo/com.foo.BarService/providers下獲取提供者地址列表。
服務監控中心啟動時,從Channel:/dubbo/*訂閱register和unregister,以及subscribe和unsubsribe事件。
服務監控中心收到register和unregister事件后,從Key:/dubbo/com.foo.BarService/providers下獲取提供者地址列表。
服務監控中心收到subscribe和unsubsribe事件后,從Key:/dubbo/com.foo.BarService/consumers下獲取消費者地址列表。
選項:
可通過<dubbo:registry group="dubbo" />設置redis中key的前綴,缺省為dubbo。
可通過<dubbo:registry cluster="replicate" />設置redis集群策略,缺省為failover。
failover: 只寫入和讀取任意一台,失敗時重試另一台,需要服務器端自行配置數據同步。
replicate: 在客戶端同時寫入所有服務器,只讀取單台,服務器端不需要同步,注冊中心集群增大,性能壓力也會更大。
Simple注冊中心
Dogfooding
注冊中心本身就是一個普通的Dubbo服務,可以減少第三方依賴,使整體通訊方式一致。
適用性說明
此SimpleRegistryService只是簡單實現,不支持集群,可作為自定義注冊中心的參考,但不適合直接用於生產環境。
https://blog.csdn.net/u011659172/article/details/51491518