天天看點

dubbo架構

Dubbo分布式服務架構

基于java的rpc架構(遠端過程調用)是一個soa治理方案

(SOA是Service-Oriented Architecture的首字母簡稱它是一種支援面向服務的架構樣式

Dubbo提供了很多協定,Dubbo協定、RMI協定、Hessian協定,等等

其核心部分包含:

1. 遠端通訊: 提供對多種基于長連接配接的NIO架構抽象封裝,包括多種線程模型,序列化,以及“請求-響應”模式的資訊交換方式。

 2. 叢集容錯: 提供基于接口方法的透明遠端過程調用,包括多協定支援,以及軟負載均衡,失敗容錯,位址路由,動态配置等叢集支援。

 3. 自動發現: 基于注冊中心目錄服務,使服務消費方能動态的查找服務提供方,使位址透明,使服務提供方可以平滑增加或減少機器。           

Dubbo能做什麼?

1.透明化的遠端方法調用,就像調用本地方法一樣調用遠端方法,隻需簡單配置,沒有任何API侵入。      

2.軟負載均衡及容錯機制,可在内網替代F5等硬體負載均衡器,降低成本,減少單點。

3. 服務自動注冊與發現,不再需要寫死服務提供方位址,注冊中心基于接口名查詢服務提供者的IP位址,并且能夠平滑添加或删除服務提供者。

Dubbo采用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,隻需用Spring加載Dubbo的配置即可,Dubbo基于Spring的Schema擴充進行加載。           

Doubbox 特性:

(1) 連通性:

注冊中心負責服務位址的注冊與查找,相當于目錄服務,服務提供者和消費者隻在啟動時與注冊中心互動,注冊中心不轉發請求,壓力較小

監控中心負責統計各服務調用次數,調用時間等,統計先在記憶體彙總後每分鐘一次發送到監控中心伺服器,并以報表展示

服務提供者向注冊中心注冊其提供的服務,并彙報調用時間到監控中心,此時間不包含網絡開銷

服務消費者向注冊中心擷取服務提供者位址清單,并根據負載算法直接調用提供者,同時彙報調用時間到監控中心,此時間包含網絡開銷

注冊中心,服務提供者,服務消費者三者之間均為長連接配接,監控中心除外

注冊中心通過長連接配接感覺服務提供者的存在,服務提供者當機,注冊中心将立即推送事件通知消費者

注冊中心和監控中心全部當機,不影響已運作的提供者和消費者,消費者在本地緩存了提供者清單

注冊中心和監控中心都是可選的,服務消費者可以直連服務提供者

(2) 健狀性:

監控中心宕掉不影響使用,隻是丢失部分采樣資料

資料庫宕掉後,注冊中心仍能通過緩存提供服務清單查詢,但不能注冊新服務

注冊中心對等叢集,任意一台宕掉後,将自動切換到另一台

注冊中心全部宕掉後,服務提供者和服務消費者仍能通過本地緩存通訊

服務提供者無狀态,任意一台宕掉後,不影響使用

服務提供者全部宕掉後,服務消費者應用将無法使用,并無限次重連等待服務提供者恢複

(3) 伸縮性:

注冊中心為對等叢集,可動态增加機器部署執行個體,所有用戶端将自動發現新的注冊中心

服務提供者無狀态,可動态增加機器部署執行個體,注冊中心将推送新的服務提供者資訊給消費者

(4) 更新性:

當服務叢集規模進一步擴大,帶動IT治理結構進一步更新,需要實作動态部署,進行流動計算,現有分布式服務架構不會帶來阻力

Provider

暴露服務方稱之為“服務提供者”。

Consumer

調用 遠端服務方稱之為“服務消費者”。

Registry

服務注冊與發現的中心目錄服務稱之為“服務注冊中心”。

Monitor

統計服務的調用次數和調用時間的日志服務稱之為“服務監控中心”。

dubbo注冊中心

Dubbo目前支援4種注冊中心,(multicast zookeeper redis simple)

Zookeeper作為Dubbo服務的注冊中心,Dubbo原先基于資料庫的注冊中心,沒采用Zookeeper,Zookeeper一個分布式的服務架構,是樹型的目錄服務的資料存儲,能做到叢集管理資料 ,這裡能很好的作為Dubbo服務的注冊中心,Dubbo能與Zookeeper做到叢集部署,當提供者出現斷電等異常停機時,Zookeeper注冊中心能自動删除提供者資訊,當提供者重新開機時,能自動恢複注冊資料,以及訂閱請求           

調用

  1. 服務容器負責啟動,加載,運作服務提供者。
  2. 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
  3. 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
  4. 注冊中心傳回服務提供者位址清單給消費者,如果有變更,注冊中心将基于長連接配接推送變更資料給消費者。
  5. 服務消費者,從提供者位址清單中,基于軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
  6. 服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次統計資料到監控中心。

    Dubbo提供了很多協定,Dubbo協定、RMI協定、Hessian協定

負載均衡:

• 随機,按權重設定随機機率。

• 在一個截面上碰撞的機率高,但調用量越大分布越均勻,而且按機率使用權重後也比較均勻,有利于動态調整提供者權重。

  RoundRobin LoadBalance

• 輪循,按公約後的權重設定輪循比率。

• 存在慢的提供者累積請求的問題,比如:第二台機器很慢,但沒挂,當請求調到第二台時就卡在那,久而久之,所有請求都卡在調到第二台上。

  LeastActive LoadBalance

• 最少活躍調用數,相同活躍數的随機,活躍數指調用前後計數差。

• 使慢的提供者收到更少請求,因為越慢的提供者的調用前後計數差會越大。

  ConsistentHash LoadBalance

• 一緻性 Hash,相同參數的請求總是發到同一提供者。

• 當某一台提供者挂時,原本發往該提供者的請求,基于虛拟節點,平攤到其它提供者,不會引起劇烈變動。

Dubbo的叢集容錯機制分為6種,分别是:FailOver,FailFast,FailSafe,FailBack,Forking,Broadcast。

1.FailOver:

• 失敗自動切換,當出現失敗,重試其它伺服器。(預設)

• 通常用于讀操作,但重試會帶來更長延遲。

.FailFast

• 快速失敗,隻發起一次調用,失敗立即報錯。

• 通常用于非幂等性的寫操作,比如新增記錄。

3.FailSafe

• 失敗安全,出現異常時,直接忽略。

• 通常用于寫入審計日志等操作。

4.FailBack

• 失敗自動恢複,背景記錄失敗請求,定時重發。

• 通常用于消息通知操作

5.Forking

• 并行調用多個伺服器,隻要一個成功即傳回。

• 通常用于實時性要求較高的讀操作,但需要浪費更多服務資源

6.Broadcast

• 廣播調用所有提供者,逐個調用,任意一台報錯則報錯。(2.1.0開始支援)

• 通常用于通知所有提供者更新緩存或日志等本地資源資訊。