1. 程式人生 > >Dubbo(x)相關(分散式服務框架)

Dubbo(x)相關(分散式服務框架)

Dubbo

Dubbo是阿里的分散式服務框架,基於zookeeper實現,已於12年底停止維護升級

Dubbox是噹噹團隊基於dubbo升級的一個版本

與zookeeper的關係:Dubbo將註冊中心進行抽象,使得它可以外接不同的儲存媒介給註冊中心提供服務,有ZooKeeper,Memcached,Redis等。

 

Dubbo各種各樣的RPC、支援自定義協議、統一管理、統一監控、資源整合

 

dubbo,服務治理工具。實現系統之間通訊。

       1)服務提供者:啟動時在指定埠上暴露服務,並將服務地址和埠註冊到註冊中心上。

       2)服務消費者:啟動時向註冊中心訂閱自己感興趣的服務,以便獲得服務提供方的地址列表。

       3)註冊中心,使用zookeeper實現,相當於房產中介。服務提供者和消費者只在啟動時與註冊中心互動,註冊中心不轉發請求,壓力較小,負責服務的註冊和發現,負責儲存服務提供方上報的地址資訊,並向服務消費方推送。

       4)監控中心:負責收集服務提供方和消費方的執行狀態,比如服務呼叫次數、延遲等,用於監控。將dubbo的war工程部署到tomcat,進行一些配置,即可檢視dubbo

       5)執行容器:負責服務提供方的初始化、載入以及執行的生命週期管理。

部署階段

       服務提供者在指定埠暴露服務,並向註冊中心註冊服務資訊。

       服務消費者向註冊中心發起服務地址列表的訂閱。

執行階段

       註冊中心向服務消費者推送地址列表資訊。

       服務消費者收到地址列表後,從其中選取一個向目標服務發起呼叫。

       呼叫過程服務消費者和服務提供者的執行狀態上報給監控中心。

 

 

 

Dubbo超時的實現原理

dubbo預設採用了netty作為網路元件,它屬於一種NIO的模式。消費端發起遠端請求後,執行緒不會阻塞等待服務端的返回,而是馬上得到一個ResponseFuture,消費端通過不斷的輪詢機制判斷是否有返回結果。因為是通過輪詢,輪詢有個需要特別注要的就是避免死迴圈,所以為了解決這個問題就引入了超時機制,只在一定時間範圍內做輪詢,如果超時就返回超時異常。

 

 

Dubbo超時重試機制帶來的資料重複問題

常見的應用場景故障:  1、傳送郵件(重複) ;2、賬戶註冊(重複).。

解決方案:

1.對於核心的服務中心,去除dubbo超時重試機制,並重新評估設定超時時間。

        (1)、去掉超時重試機制  

             <dubbo:provider delay="-1" timeout="6000"  retries="0"/> 

       (2)、重新評估設定超時時間

          <dubbo:service interface="*.*" ref="*"  timeout="延長服務時間"/>

 2.業務處理程式碼必須放在服務端,客戶端只做引數驗證和服務呼叫,不涉及業務流程處理

 

 

Dubbo的優勢

  1. 服務註冊中心
  2. 叢集多種容錯方案(ZK會通過心跳確認dubbo是否宕機)

    • Failover Cluster(預設)

    失敗自動切換,當出現失敗,重試其它伺服器。通常用於讀操作,但重試會帶來更長延遲。可通過 retries="2" 來設定重試次數(不含第一次)。

    <dubbo:service retries="2" />

    <dubbo:reference retries="2" />

<dubbo:reference> <dubbo:method name="findFoo" retries="2" /> </dubbo:reference>

    • Failfast Cluster

    快速失敗,只發起一次呼叫,失敗立即報錯。通常用於非冪等性的寫操作,比如新增記錄。

    • Failsafe Cluster

安全失敗,出現異常時,直接忽略。通常用於寫入審計日誌等操作。

    • Failback Cluster

    失敗自動恢復,後臺記錄失敗請求,定時重發。通常用於訊息通知操作。

    • Forking Cluster

    並行呼叫多個伺服器,只要一個成功即返回。通常用於實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks="2" 來設定最大並行數

    • Broadcast Cluster

    廣播呼叫所有提供者,逐個呼叫,任意一臺報錯則報錯 。通常用於通知所有提供者更新快取或日誌等本地資源資訊

 

    3. 直連提供者

在開發階段為了方便測試,通常系統客戶端能指定呼叫某個服務提供者,那麼可以在引用服務時加一個url引數去指定服務提供者

    4. 負載均衡:當有多個提供者在提供服務時,能夠使用多種方案選擇提供者

      Random  隨機選提供者,並可以給提供者設定權重

      RoundRobin 輪詢選擇提供者

      LeastActive 最少活躍呼叫數,相同活躍數的隨機,活躍數指呼叫前後計數差。使慢的提供者收到更少請求,因為越慢的提供者的呼叫前後計數差會越大。

      ConsistentHash 一致性hash,相同引數的請求發到同一臺機器上

       服務端服務級別

    <dubbo:service interface="..." loadbalance="roundrobin" />

  客戶端服務級別

    <dubbo:reference interface="..." loadbalance="roundrobin" />

  服務端方法級別

<dubbo:service interface="..."> <dubbo:method name="..." loadbalance="roundrobin"/></dubbo:service>

  客戶端方法級別

<dubbo:reference interface="..."> <dubbo:method name="..." loadbalance="roundrobin"/></dubbo:reference>

 

5、服務版本、服務分組

       通過服務版本可以控制服務的不相容升級,當同一個服務有多種實現時,可以使用服務分組進行區分

6、多協議

dubbo提供了多種協議給使用者選擇,如dubbo、hessian、rmi。並可為每個服務指定不同的傳輸協議,粒度可以細化到方法,不同服務在效能上適用不同協議進行傳輸,比如大資料用短連線協議,小資料大併發用長連線協議

 

分散式服務框架、RPC框架

分散式服務框架有:Dubbo、RMI 、Hessian、Webservice、Thrift、grpc(google)、motan、Spring Cloud…

  • rpcx: 基於Go的服務治理的rpc框架、客戶端支援跨語言
  • grpc: Google 出品的跨語言rpc框架,很弱的(實驗性的)負載均衡, 測試使用的是grpc-go
  • go std rpc: Go標準庫的rpc, 不支援跨語言(jsonrpc支援json rpc 1.0)
  • thrift: 跨語言的rpc框架,facebook貢獻
  • dubbo: 國內較早開源的服務治理的Java rpc框架,雖然在阿里巴巴內部競爭中落敗於HSF,沉寂了幾年,但是在國內得到了廣泛的應用,目前dubbo專案又獲得了支援,並且dubbo 3.0也開始開發
  • motan: 微博內部使用的rpc框架,底層支援java,生態圈往service mesh發展以支援多語言
  • hprose: 國內開發人員開發的一個跨語言的rpc框架,非服務治理但是效能高效
  • twirp: twitch.tv剛剛開源的一個restful風格的rpc框架
  • go-micro: Go語言的一個服務治理rpc框架, 在測試中發現效能不太好,所以沒有繼續測試,相關的測試程式碼已在github庫中
  • go kit:
  • 騰訊 Tars:騰訊公司的rpc框架
  • 百度 brpc: 百度公司的rpc框架
  • spring cloud:

 

 

發展歷史:

1、為了不同語言構造的系統之間能夠互相呼叫

出現了webservice :不同系統之間互動資料的時候,採用同一種資料格式xml,這種協議稱為soap,soap 協議可以基於http協議傳輸資料,也可以基於ftp smtp 等其他協議傳遞資料,但是大多數都是基於http 。

2、客戶端不知道該傳遞什麼引數,不知道遠端伺服器有提供哪些服務

出現了webservice的介面說明文件wsdl,用這種文件來說明介面的詳情

 

3、除了webservice 的思想,還有一部分的思想是,不同的語言之間可以建立一種第三方語言,大家可以建立自己對第三方語言的對映

  • PHPRPC,Hessian,JSON-RPC
  • 框架:
  • Microsoft WCF,WebAPI
  • ZeroC Ice,Thrift,GRPC protocol buffer
  • Hprose

 

兩種思想的優缺點比較:

首先,都實現了跨語言,這是可以稱讚的。

webservice 的缺點: soap 協議 訊息封裝太複雜,採用xml 傳輸資料,網路消耗和 cpu 解析消耗都特別大,不適合傳遞大量資料,客戶端需要生成很多stub 類。

rpc 框架 :  傳輸資料多采用二進位制格式 ,訊息序列化和反序列化都比較快,網路消耗小,缺點是客戶端和服務端都要生成很多stub類。

如果 idl 做了修改, 還要重新生成一遍 stub 類。

 

參考連結:

https://mp.weixin.qq.com/s/pQyPaqx5tu2mQ2VG7uijAQ