本文寫做時,dubbo最高版本是V2.6.0。 寫這篇文章主要想回答如下4個問題:spring
1、dubbo是什麼?完成了哪些主要需求?服務器
2、dubbo適用於什麼場景?網絡
3、dubbo的整體架構是什麼樣的?架構
4、dubbo調用的過程是什麼樣的?負載均衡
下面就一一道來。框架
1、dubbo是什麼?完成了哪些主要需求?異步
dubbo是一個面向服務治理(SOA)的分佈式RPC框架。分佈式
它主要實現瞭如下一些需求:ide
RPC方面:微服務
實現了基本的RPC過程,開發了DubboProtocol做爲默認的實現,並集成了Hession,RMI,HTTP,WebService,Thrift(被改造,與原Thrift不兼容),Rest等遠程過程調用框架。基本組成爲:Protocol(默認dubbo),Invoker,Transporter(默認netty),Codec2(默認Hession2編碼)。
編解碼方面提供了Hession2(默認,阿里修改過的hessian lite)、dubbo、Java、JSON、Thrift(與原Thrift不兼容)、Kryo、FST序列化。
DubboProtocol實現了同步調用、異步請求、回調方法設置、本地調用等等靈活的調用特性。
服務治理方面:
一、實現了集羣、容錯、負載均衡及路由策略
二、實現了註冊功能,完成提供者、消費者註冊、訂閱通知策略等;
三、對外提供了服務提供者、消費者配置信息、調用鏈、依賴關係的展示接口,並能夠對服務提權、降級,配置路由信息等針對服務的治理手段;
四、開發了服務管理控制檯dubbo-admin,能夠在此查看服務相關注冊信息,對服務實施治理;
五、開發了服務監控臺dubbo-monitor,可查看服務實時調用狀況,包括調用次數,調用時間,吞吐量等統計信息,實時查看服務的健康情況,做爲服務治理手段的依據。
2、dubbo適用於什麼場景?
一、業務中須要高吞吐量、複雜的RPC調用,有服務治理需求的場景;
二、有輕量級微服務化需求的場景;
下面引用dubbo用戶手冊的需求描述來講明什麼狀況下須要用到dubbo:
在大規模服務化以前,應用可能只是經過 RMI 或 Hessian 等工具,簡單的暴露和引用遠程服務,經過配置服務的URL地址進行調用,經過 F5 等硬件進行負載均衡。
當服務愈來愈多時,服務 URL 配置管理變得很是困難,F5 硬件負載均衡器的單點壓力也愈來愈大。 此時須要一個服務註冊中心,動態的註冊和發現服務,使服務的位置透明。並經過在消費方獲取服務提供方地址列表,實現軟負載均衡和 Failover,下降對 F5 硬件負載均衡器的依賴,也能減小部分紅本。
當進一步發展,服務間依賴關係變得錯蹤複雜,甚至分不清哪一個應用要在哪一個應用以前啓動,架構師都不能完整的描述應用的架構關係。 這時,須要自動畫出應用間的依賴關係圖,以幫助架構師理清理關係。
接着,服務的調用量愈來愈大,服務的容量問題就暴露出來,這個服務須要多少機器支撐?何時該加機器? 爲了解決這些問題,第一步,要將服務如今天天的調用量,響應時間,都統計出來,做爲容量規劃的參考指標。其次,要能夠動態調整權重,在線上,將某臺機器的權重一直加大,並在加大的過程當中記錄響應時間的變化,直到響應時間到達閥值,記錄此時的訪問量,再以此訪問量乘以機器數反推總容量。
以上是 Dubbo 最基本的幾個需求。
3、dubbo的整體架構是什麼樣的?
調用關係說明:
0、服務容器在啓動時啓動、加載服務提供者;
一、啓動時,服務提供者向註冊中心註冊服務;
二、啓動時,服務消費者向註冊中心訂閱服務;
三、註冊中心給消費者返回服務提供者的地址列表,的提供者服務有什麼變更,將用長鏈接推送變更數據給訂閱者;
四、服務消費者發起對提供者服務的調用,提供者返回調用結果給消費者;
五、服務消費者和提供者在內存中累計調用次數和調用時間,每分鐘發送一次統計數據給監控中心Monitor,供監控中心統計查詢。
Dubbo 架構具備如下幾個特色,分別是連通性、健壯性、伸縮性、以及向將來架構的升級性。
整體設計:
此圖在學習源碼前看的眼花繚亂,學習以後看一目瞭然。
圖例說明:
各層說明:
ServiceConfig
, ReferenceConfig
爲中心,能夠直接初始化配置類,也能夠經過 spring 解析配置生成配置類ServiceProxy
爲中心,擴展接口爲 ProxyFactory
RegistryFactory
, Registry
, RegistryService
Invoker
爲中心,擴展接口爲 Cluster
, Directory
, Router
, LoadBalance
Statistics
爲中心,擴展接口爲MonitorFactory
, Monitor
, MonitorService
Invocation
, Result
爲中心,擴展接口爲 Protocol
,Invoker
, Exporter
Request
, Response
爲中心,擴展接口爲 Exchanger
, ExchangeChannel
, ExchangeClient
, ExchangeServer
Message
爲中心,擴展接口爲 Channel
,Transporter
, Client
, Server
, Codec
Serialization
, ObjectInput
,ObjectOutput
, ThreadPool
關係說明:
模塊分包:
模塊說明:
總體上按照分層結構進行分包,與分層的不一樣點在於:
4、dubbo調用的過程是什麼樣的?
調用鏈:
展開總設計圖的紅色調用鏈,以下:
暴露服務時序圖:
展開總設計圖左邊服務提供方暴露服務的藍色初始化鏈,時序圖以下:
引用服務時序圖:
展開總設計圖右邊服務消費方引用服務的藍色初始化鏈,時序圖以下:
注:以上大量引用了dubbo的develop手冊的文字和圖片內容。