1. 程式人生 > >dubbo多註冊中心

dubbo多註冊中心

多註冊中心

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://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <dubbo:application name="world"  />
    <!-- 多註冊中心配置 -->
    <dubbo:registry id="hangzhouRegistry" address="10.20.141.150:9090" />
    <dubbo:registry id="chengdouRegistry" address="10.20.141.151:9010" default="false" />
    <!-- 向多個註冊中心註冊 -->
    <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="hangzhouRegistry,chengdouRegistry" />
</beans>

不同服務使用不同註冊中心

比如:CRM 有些服務是專門為國際站設計的,有些服務是專門為中文站設計的

<?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://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <dubbo:application name="world"  />
    <!-- 多註冊中心配置 -->
    <dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" />
    <dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" />
    <!-- 向中文站註冊中心註冊 -->
    <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="chinaRegistry" />
    <!-- 向國際站註冊中心註冊 -->
    <dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" registry="intlRegistry" />
</beans>

多註冊中心引用

比如:CRM 需同時呼叫中文站和國際站的 PC2 服務,PC2 在中文站和國際站均有部署,介面及版本號都一樣,但連的資料庫不一樣。

<?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://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <dubbo:application name="world"  />
    <!-- 多註冊中心配置 -->
    <dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" />
    <dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" />
    <!-- 引用中文站服務 -->
    <dubbo:reference id="chinaHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="chinaRegistry" />
    <!-- 引用國際站站服務 -->
    <dubbo:reference id="intlHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="intlRegistry" />
</beans>

如果只是測試環境臨時需要連線兩個不同註冊中心,使用豎號分隔多個不同註冊中心地址

<?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://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <dubbo:application name="world"  />
    <!-- 多註冊中心配置,豎號分隔表示同時連線多個不同註冊中心,同一註冊中心的多個叢集地址用逗號分隔 -->
    <dubbo:registry address="10.20.141.150:9090|10.20.154.177:9010" />
    <!-- 引用服務 -->
    <dubbo:reference id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" />
</beans>

dubbo支援的註冊中心

(1)Multicast 註冊中心

Multicast 註冊中心不需要啟動任何中心節點,只要廣播地址一樣,就可以互相發現。

在這裡插入圖片描述

提供方啟動時廣播自己的地址 消費方啟動時廣播訂閱請求 提供方收到訂閱請求時,單播自己的地址給訂閱者,如果設定了 unicast=false,則廣播給訂閱者 消費方收到提供方地址時,連線該地址進行 RPC 呼叫。

配置

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

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

為了減少廣播量,Dubbo 預設使用單播發送提供者地址資訊給消費者,如果一個機器上同時啟了多個消費者程序,消費者需宣告 unicast=false,否則只會有一個消費者能收到訊息:

<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>

(2)zookeeper 註冊中心

Zookeeper 是 Apacahe Hadoop 的子專案,是一個樹型的目錄服務,支援變更推送,適合作為 Dubbo 服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用 在這裡插入圖片描述

流程說明:

服務提供者啟動時: 向 /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>

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 下獲取消費者地址列表

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://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/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" />