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注冊中心能自動删除提供者資訊,當提供者重新開機時,能自動恢複注冊資料,以及訂閱請求
)
調用
- 服務容器負責啟動,加載,運作服務提供者。
- 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
- 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
- 注冊中心傳回服務提供者位址清單給消費者,如果有變更,注冊中心将基于長連接配接推送變更資料給消費者。
- 服務消費者,從提供者位址清單中,基于軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
-
服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次統計資料到監控中心。
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開始支援)
• 通常用于通知所有提供者更新緩存或日志等本地資源資訊。