Dubbo是常用的開源服務治理型RPC框架,在之前osgi框架下不同bundle之間的方法調用時用到過。其工作原理和框架設計值得開源技術愛好者學習和研究。
一、Dubbo的工作原理
調用關系說明
- 服務容器負責啟動,加載,運行服務提供者。
- 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
- 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
- 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數據給消費者。
- 服務消費者,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
- 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
二、Dubbo的框架分層
圖例說明:
- 圖中左邊淡藍背景的為服務消費方使用的接口,右邊淡綠色背景的為服務提供方使用的接口,位于中軸線上的為雙方都用到的接口。
- 圖中從下至上分為十層,各層均為單向依賴,右邊的黑色箭頭代表層之間的依賴關系,每一層都可以剝離上層被復用,其中,Service 和 Config 層為 API,其它各層均為 SPI。
- 圖中綠色小塊的為擴展接口,藍色小塊為實現類,圖中只顯示用于關聯各層的實現類。
- 圖中藍色虛線為初始化過程,即啟動時組裝鏈,紅色實線為方法調用過程,即運行時調時鏈,紫色三角箭頭為繼承,可以把子類看作父類的同一個節點,線上的文字為調用的方法。
各層說明
- config 配置層:對外配置接口,以?
ServiceConfig
,?ReferenceConfig
?為中心,可以直接初始化配置類,也可以通過 spring 解析配置生成配置類 - proxy 服務代理層:服務接口透明代理,生成服務的客戶端 Stub 和服務器端 Skeleton, 以?
ServiceProxy
?為中心,擴展接口為?ProxyFactory
- registry 注冊中心層:封裝服務地址的注冊與發現,以服務 URL 為中心,擴展接口為?
RegistryFactory
,?Registry
,?RegistryService
- cluster 路由層:封裝多個提供者的路由及負載均衡,并橋接注冊中心,以?
Invoker
?為中心,擴展接口為?Cluster
,?Directory
,?Router
,?LoadBalance
- monitor 監控層:RPC 調用次數和調用時間監控,以?
Statistics
?為中心,擴展接口為?MonitorFactory
,?Monitor
,?MonitorService
- protocol 遠程調用層:封裝 RPC 調用,以?
Invocation
,?Result
?為中心,擴展接口為?Protocol
,?Invoker
,?Exporter
- exchange 信息交換層:封裝請求響應模式,同步轉異步,以?
Request
,?Response
?為中心,擴展接口為?Exchanger
,?ExchangeChannel
,?ExchangeClient
,?ExchangeServer
- transport 網絡傳輸層:抽象 mina 和 netty 為統一接口,以?
Message
?為中心,擴展接口為?Channel
,?Transporter
,?Client
,?Server
,?Codec
- serialize 數據序列化層:可復用的一些工具,擴展接口為?
Serialization
,?ObjectInput
,?ObjectOutput
,?ThreadPool
嘗試試用可參考Dubbo安裝配置手冊
三、其它RPC框架
motan是和Dubbo類似的服務治理型RPC框架,是新浪2016年開源的RPC框架,總體設計和Dubbo類似,相當于Dubbo的精簡版,去掉了一些不常用的協議、注冊中心、通訊組件等的支持。
雖然Dubbo本身不支持多語言,但它可以很方便的集成其它多語言型RPC框架,如thrift等。