1. 程式人生 > >【Dubbo】Dubbo入門

【Dubbo】Dubbo入門

一、Dubbo是什麼

  • 分散式服務框架

  • 高效能和透明化的RPC遠端服務呼叫方案

  • SOA服務治理方案

二、如何使用Dubbo

本地服務

  <bean id=“xxxService” class=“com.xxx.XxxServiceImpl” />
  <bean id=“xxxAction” class=“com.xxx.XxxAction”>
      <property name=“xxxService” ref=“xxxService” />
  </bean>

遠端服務

  <!-- 和本地服務一樣實現遠端服務 -->
  <bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /> 
  <!-- 增加暴露遠端服務配置 -->
  <dubbo:service interface=“com.xxx.XxxService” ref=“xxxService” /> 
  <!-- 增加引用遠端服務配置 -->
  <dubbo:reference id=“xxxService” interface=“com.xxx.XxxService” />
  <!-- 和本地服務一樣使用遠端服務 -->
  <bean id=“xxxAction” class=“com.xxx.XxxAction”> 
      <property name=“xxxService” ref=“xxxService” />
  </bean>

三、Dubbo能做什麼

  1. 透明化的遠端方法呼叫

    • 就像呼叫本地方法一樣呼叫遠端方法

    • 只需簡單配置,沒有任何API侵入

  2. 軟負載均衡及容錯機制

    • 可在內網替代F5等硬體負載均衡器

  3. 服務自動註冊與發現

    • 不再需要寫死服務提供方地址,註冊中心基於介面名查詢服務提 供者的IP地址,並且能夠平滑新增或刪除服務提供者

四、Dubbo基本原理

 

 

節點角色說明

節點 角色說明
Provider 暴露服務的服務提供方
Consumer 呼叫遠端服務的服務消費方
Registry 服務註冊與發現的註冊中心
Monitor 統計服務的呼叫次數和呼叫時間的監控中心
Container 服務執行容器

呼叫關係說明

  1. 服務容器負責啟動,載入,執行服務提供者。

  2. 服務提供者在啟動時,向註冊中心註冊自己提供的服務。

  3. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。

  4. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。

  5. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。

  6. 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心。

特點

  • 連通性

  • 健壯性

  • 伸縮性

  • 升級性

五、Dubbo-RPC功能

1、配置

  • 方法級優先,介面級次之,全域性配置再次之。

  • 如果級別一樣,則消費方優先,提供方次之。

  • 服務提供方配置,通過 URL 經由註冊中心傳遞給消費方。

 

2、服務匹配

  • 服務分組、多版本

當一個介面有多種實現時,可以用group區分。

  //服務提供者
  <dubbo:service group="feedback" interface="com.xxx.IndexService" />
  <dubbo:service group="member" interface="com.xxx.IndexService" />
      
  //服務消費者
  <dubbo:reference id=“fservice" group="feedback" interface="com.xxx.IndexService" />
  <dubbo:reference id=“mservice" group="member" interface="com.xxx.IndexService" />

 

當一個介面實現,出現不相容升級時,可以用版本號過渡, 版本號不同的服務相互間不引用。

  //服務提供者
  <dubbo:service interface="com.foo.BarService" version="1.0.0" />
  <dubbo:service interface="com.foo.BarService" version="2.0.0" />
      
  //服務消費者
  <dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" />
  <dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />

 

  • 只訂閱

    共用註冊中心, 開發人員機器上的服務提供者被誤 調, 影響其他開發人員(開發、 測試環境)

      <dubbo:registry register="false" />

 

  • 只註冊

如果有兩個註冊中心A,B,a服務只在其中A註冊中心有部署,B註冊中心沒有a服務,其它應用都需要依賴a服務。此時,可以讓服務提供者方只註冊服務到A註冊中心。

  <dubbo:registry id="aRegistry" address="10.20.153.10:9090" />
  <dubbo:registry id="bRegistry" address="10.20.141.150:9090" subscribe="false" />

 

3、叢集容錯

  • 叢集原理

在叢集呼叫失敗時,Dubbo 提供了多種容錯方案,預設為 failover 重試。

 

各節點關係:

  • 這裡的 InvokerProvider 的一個可呼叫 Service 的抽象,Invoker 封裝了 Provider 地址及 Service 介面資訊

  • Directory 代表多個 Invoker,可以把它看成 List<Invoker> ,但與 List 不同的是,它的值可能是動態變化的,比如註冊中心推送變更

  • ClusterDirectory 中的多個 Invoker 偽裝成一個 Invoker,對上層透明,偽裝過程包含了容錯邏輯,呼叫失敗後,重試另一個

  • Router 負責從多個 Invoker 中按路由規則選出子集,比如讀寫分離,應用隔離等

  • LoadBalance 負責從多個 Invoker 中選出具體的一個用於本次呼叫,選的過程包含了負載均衡演算法,呼叫失敗後,需要重選

模式 說明
Failfast Cluster 快速失敗,只發起一次呼叫,失敗立即報錯。通常用於非冪等性的寫操作,比如新增記錄。
Failsafe Cluster 失敗安全,出現異常時,直接忽略。通常用於寫入審計日誌等操作。
Failback Cluster 失敗自動恢復,後臺記錄失敗請求,定時重發。通常用於訊息通知操作。
Forking Cluster 並行呼叫多個伺服器,只要一個成功即返回。通常用於實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks="2" 來設定最大並行數。
Broadcast Cluster 廣播呼叫所有提供者,逐個呼叫,任意一臺報錯則報錯 [2]。通常用於通知所有提供者更新快取或日誌等本地資源資訊。

4、協議

dubbo://

Dubbo 預設協議,採用單一長連線和 NIO 非同步通訊

適用場景

  • 適合:常規遠端服務方法呼叫,小資料量(< 100K)大併發的服務呼叫,以及服務消費者機器數遠大於服務提供者機器數的情況

  • 不適合:傳送大資料量的服務,比如傳檔案,傳視訊等,除非請求量很低。

特性

  1. 單連線 、長連線 、TCP協議

  2. NIO非同步傳輸 、 Hessian二進位制序列化

 

rmi://

RMI 協議,採用 JDK 標準的 java.rmi.* 實現,採用阻塞式短連線和 JDK 標準序列化方式

適用場景

  • 常規遠端服務方法呼叫,與原生RMI服務互操作

  • 傳入傳出引數資料包大小混合,消費者與提供者個數差不多,可傳檔案

特性

  1. 多連線 、 短連線 、TCP協議

  2. 同步傳輸 、 Java標準二進位制序列化

 

hessian://

Hessian協議,用於整合 Hessian 的服務,Hessian 底層採用 Http 通訊,採用 Servlet 暴露服務,Dubbo 預設內嵌 Jetty 作為伺服器實現。

適用場景

  • 傳入傳出引數資料包較大,提供者比消費者個數多,提供者壓力較大,可傳檔案

  • 頁面傳輸,檔案傳輸,或與原生hessian服務互操作

特性

  1. 多連線 、 短連線 、 HTTP協議

  2. 同步傳輸 、 Hessian二進位制序列化

 

http://

基於 HTTP 表單的遠端呼叫協議,採用 Spring 的 HttpInvoker 實現

適用場景

  • 傳入傳出引數資料包大小混合,提供者比消費者個數多,可用瀏覽器檢視,可用表單或URL傳入引數,暫不支援傳檔案

  • 需同時給應用程式和瀏覽器 JS 使用的服務

特性

  1. 多連線 、 短連線 、HTTP協議

  2. 同步傳輸 、 表單序列化

 

webservice://

基於 WebService 的遠端呼叫協議,基於 Apache CXF 的 frontend-simple 和 transports-http 實現

適用場景

  • 系統整合,跨語言呼叫

特性

  1. 多連線 、 短連線 、 HTTP協議

  2. 同步傳輸 、 SOAP文字序列化

 

thrift://

當前 dubbo 支援的thrift 協議是對 thrift 原生協議的擴充套件,在原生協議的基礎上添加了一些額外的頭資訊

 

memcached://

基於 memcached 實現的 RPC 協議

 

redis://

基於 Redis [1] 實現的 RPC 協議

 

rest://

基於標準的Java REST API——JAX-RS 2.0 實現的REST呼叫支援

 

Dubbo預設通訊協議是dubbo,是單一長連線NIO非同步傳輸的,解決了大併發小資料量的常規服務呼叫,防止C10K問題。

如果需要傳檔案,可以用Hessian;需要頁面也呼叫的,用http;需要跨語言呼叫的,用webservice;這幾個都是多連線短連線形式的。

5、多協議

  • 不同服務不同協議

不同服務在效能上適用不同協議進行傳輸,比如大資料用短連線協議,小資料大併發用長連線協議。

  <?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="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
      <!-- 多協議配置 -->
      <dubbo:protocol name="dubbo" port="20880" />
      <dubbo:protocol name="rmi" port="1099" />
      <!-- 使用dubbo協議暴露服務 -->
      <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" protocol="dubbo" />
      <!-- 使用rmi協議暴露服務 -->
      <dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" protocol="rmi" /> 
  </beans>

 

  • 同一服務多協議暴露

比如:需要與http客戶端互操作

  <?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="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
      <!-- 多協議配置 -->
      <dubbo:protocol name="dubbo" port="20880" />
      <dubbo:protocol name="hessian" port="8080" />
      <!-- 使用多個協議暴露服務 -->
      <dubbo:service id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" protocol="dubbo,hessian" />
  </beans>

 

六、 註冊中心

 

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="*" />,可訂閱服務的所有分組和所有版本的提供者

 

其他註冊中心 說明
Multicast 註冊中心 Multicast 註冊中心不需要啟動任何中心節點,只要廣播地址一樣,就可以互相發現。 <dubbo:registry address="multicast://224.5.6.7:1234" />
Redis 註冊中心 使用 Redis 的 Key/Map 結構儲存資料結構, Publish/Subscribe 事件通知資料變更。 <dubbo:registry address="redis://10.20.153.10:6379" />
Simple 註冊中心 Simple 註冊中心本身就是一個普通的 Dubbo 服務,可以減少第三方依賴,使整體通訊方式一致。簡單實現,不支援叢集。