Dubbo註冊中心

Multicast 註冊中心

Multicast 註冊中心不須要啓動任何中心節點,只要廣播地址同樣,就能夠互相發現。html

/user-guide/images/multicast.jpg

  1. 提供方啓動時廣播本身的地址
  2. 消費方啓動時廣播訂閱請求
  3. 提供方收到訂閱請求時,單播本身的地址給訂閱者,若是設置了 unicast=false,則廣播給訂閱者
  4. 消費方收到提供方地址時,鏈接該地址進行 RPC 調用。

組播受網絡結構限制,只適合小規模應用或開發階段使用。組播地址段: 224.0.0.0 - 239.255.255.255git

配置github

<dubbo:registry address="multicast://224.5.6.7:1234" />

redis

<dubbo:registry protocol="multicast" address="224.5.6.7:1234" />

爲了減小廣播量,Dubbo 缺省使用單播發送提供者地址信息給消費者,若是一個機器上同時啓了多個消費者進程,消費者需聲明 unicast=false,不然只會有一個消費者能收到消息:spring

<dubbo:registry address="multicast://224.5.6.7:1234?unicast=false" />

數據庫

<dubbo:registry protocol="multicast" address="224.5.6.7:1234">
    <dubbo:parameter key="unicast" value="false" />
</dubbo:registry>

zookeeper 註冊中心

Zookeeper 是 Apacahe Hadoop 的子項目,是一個樹型的目錄服務,支持變動推送,適合做爲 Dubbo 服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用 1apache

/user-guide/images/zookeeper.jpg

流程說明:服務器

  • 服務提供者啓動時: 向 /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="*" />,可訂閱服務的全部分組和全部版本的提供者

使用數據結構

在 provider 和 consumer 中增長 zookeeper 客戶端 jar 包依賴:

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.3.3</version>
</dependency>

Dubbo 支持 zkclient 和 curator 兩種 Zookeeper 客戶端實現:

使用 zkclient 客戶端

從 2.2.0 版本開始缺省爲 zkclient 實現,以提高 zookeeper 客戶端的健狀性。zkclient 是 Datameer 開源的一個 Zookeeper 客戶端實現。

缺省配置:

<dubbo:registry ... client="zkclient" />

或:

dubbo.registry.client=zkclient

或:

zookeeper://10.20.153.10:2181?client=zkclient

需依賴或直接下載:

<dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
</dependency>

使用 curator 客戶端

從 2.3.0 版本開始支持可選 curator 實現。Curator 是 Netflix 開源的一個 Zookeeper 客戶端實現。

若是須要改成 curator 實現,請配置:

<dubbo:registry ... client="curator" />

或:

dubbo.registry.client=curator

或:

zookeeper://10.20.153.10:2181?client=curator

需依賴或直接下載:

<dependency>
    <groupId>com.netflix.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>1.1.10</version>
</dependency>

Zookeeper 單機配置:

<dubbo:registry address="zookeeper://10.20.153.10:2181" />

或:

<dubbo:registry protocol="zookeeper" address="10.20.153.10:2181" />

Zookeeper 集羣配置:

<dubbo:registry address="zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181,10.20.153.12:2181" />

或:

<dubbo:registry protocol="zookeeper" address="10.20.153.10:2181,10.20.153.11:2181,10.20.153.12:2181" />

同一 Zookeeper,分紅多組註冊中心:

<dubbo:registry id="chinaRegistry" protocol="zookeeper" address="10.20.153.10:2181" group="china" />
<dubbo:registry id="intlRegistry" protocol="zookeeper" address="10.20.153.10:2181" group="intl" />

zookeeper 安裝

安裝方式參見: Zookeeper安裝手冊,只需搭一個原生的 Zookeeper 服務器,並將 Quick Start 中 Provider 和 Consumer 裏的 conf/dubbo.properties 中的 dubbo.registry.addrss 的值改成 zookeeper://127.0.0.1:2181 便可使用。

可靠性聲明
阿里內部並無採用 Zookeeper 作爲註冊中心,而是使用本身實現的基於數據庫的註冊中心,即:Zookeeper 註冊中心並無在阿里內部長時間運行的可靠性保障,此 Zookeeper 橋接實現只爲開源版本提供,其可靠性依賴於 Zookeeper 自己的可靠性。

兼容性聲明
因 2.0.8 最初設計的 zookeeper 存儲結構不能擴充不一樣類型的數據,2.0.9 版本作了調整,因此不兼容,需所有改用 2.0.9 版本才行,之後的版本會保持兼容 2.0.9。2.2.0 版本改成基於 zkclient 實現,需增長 zkclient 的依賴包,2.3.0 版本增長了基於 curator 的實現,做爲可選實現策略。

Redis 註冊中心

基於 Redis(是一個高效的 KV 存儲服務器)實現的註冊中心(從 2.1.0 版本開始支持) 。

使用 Redis 的 Key/Map 結構存儲數據結構:

  • 主 Key 爲服務名和類型
  • Map 中的 Key 爲 URL 地址
  • Map 中的 Value 爲過時時間,用於判斷髒數據,髒數據由監控中心刪除 (Redis 過時數據經過心跳的方式檢測髒數據,服務器時間必須同步,而且對服務器有必定壓力,不然過時檢測會不許確)

使用 Redis 的 Publish/Subscribe 事件通知數據變動:

  • 經過事件的值區分事件類型:register, unregister, subscribe, unsubscribe
  • 普通消費者直接訂閱指定服務提供者的 Key,只會收到指定服務的 register, unregister 事件
  • 監控中心經過 psubscribe 功能訂閱 /dubbo/*,會收到全部服務的全部變動事件

調用過程:

  1. 服務提供方啓動時,向 Key:/dubbo/com.foo.BarService/providers 下,添加當前提供者的地址
  2. 並向 Channel:/dubbo/com.foo.BarService/providers 發送 register 事件
  3. 服務消費方啓動時,從 Channel:/dubbo/com.foo.BarService/providers 訂閱 register 和 unregister 事件
  4. 並向 Key:/dubbo/com.foo.BarService/providers 下,添加當前消費者的地址
  5. 服務消費方收到 register 和 unregister 事件後,從 Key:/dubbo/com.foo.BarService/providers 下獲取提供者地址列表
  6. 服務監控中心啓動時,從 Channel:/dubbo/* 訂閱 register 和 unregister,以及 subscribe 和unsubsribe事件
  7. 服務監控中心收到 register 和 unregister 事件後,從 Key:/dubbo/com.foo.BarService/providers 下獲取提供者地址列表
  8. 服務監控中心收到 subscribe 和 unsubsribe 事件後,從 Key:/dubbo/com.foo.BarService/consumers 下獲取消費者地址列表

配置

<dubbo:registry address="redis://10.20.153.10:6379" />

<dubbo:registry address="redis://10.20.153.10:6379?backup=10.20.153.11:6379,10.20.153.12:6379" />

<dubbo:registry protocol="redis" address="10.20.153.10:6379" />

<dubbo:registry protocol="redis" address="10.20.153.10:6379,10.20.153.11:6379,10.20.153.12:6379" />

選項

  • 可經過 <dubbo:registry group="dubbo" /> 設置 redis 中 key 的前綴,缺省爲 dubbo。
  • 可經過 <dubbo:registry cluster="replicate" /> 設置 redis 集羣策略,缺省爲 failover:
  • failover: 只寫入和讀取任意一臺,失敗時重試另外一臺,須要服務器端自行配置數據同步
  • replicate: 在客戶端同時寫入全部服務器,只讀取單臺,服務器端不須要同步,註冊中心集羣增大,性能壓力也會更大

可靠性聲明

阿里內部並無採用 Redis 作爲註冊中心,而是使用本身實現的基於數據庫的註冊中心,即:Redis 註冊中心並無在阿里內部長時間運行的可靠性保障,此 Redis 橋接實現只爲開源版本提供,其可靠性依賴於 Redis 自己的可靠性。

Simple 註冊中心

 Simple 註冊中心自己就是一個普通的 Dubbo 服務,能夠減小第三方依賴,使總體通信方式一致。

配置

將 Simple 註冊中心暴露成 Dubbo 服務:

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 當前應用信息配置 -->
    <dubbo:application name="simple-registry" />
    <!-- 暴露服務協議配置 -->
    <dubbo:protocol port="9090" />
    <!-- 暴露服務配置 -->
    <dubbo:service interface="com.alibaba.dubbo.registry.RegistryService" ref="registryService" registry="N/A" ondisconnect="disconnect" callbacks="1000">
        <dubbo:method name="subscribe"><dubbo:argument index="1" callback="true" /></dubbo:method>
        <dubbo:method name="unsubscribe"><dubbo:argument index="1" callback="false" /></dubbo:method>
    </dubbo:service>
    <!-- 簡單註冊中心實現,可自行擴展實現集羣和狀態同步 -->
    <bean id="registryService" class="com.alibaba.dubbo.registry.simple.SimpleRegistryService" />
</beans>

引用 Simple Registry 服務:

<dubbo:registry address="127.0.0.1:9090" />

或者:

<dubbo:service interface="com.alibaba.dubbo.registry.RegistryService" group="simple" version="1.0.0" ... >

或者:

<dubbo:registry address="127.0.0.1:9090" group="simple" version="1.0.0" />

適用性說明

此 SimpleRegistryService 只是簡單實現,不支持集羣,可做爲自定義註冊中心的參考,但不適合直接用於生產環境。

參考:

http://dubbo.io/books/dubbo-user-book/references/registry/introduction.html

相關文章
相關標籤/搜索