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