Dubbo-框架設(shè)計(1)

本文摘自于Dubbo官網(wǎng),詳情以官網(wǎng)最新文檔為準(zhǔn)擎淤。

整體設(shè)計

框架整體設(shè)計

圖例說明:

  • 圖中左邊淡藍(lán)背景的為服務(wù)消費方使用的接口肮砾,右邊淡綠色背景的為服務(wù)提供方使用的接口,位于中軸線上的為雙方都用到的接口髓抑。
  • 圖中從下至上分為十層咙崎,各層均為單向依賴,右邊的黑色箭頭代表層之間的依賴關(guān)系吨拍,每一層都可以剝離上層被復(fù)用褪猛,其中,Service 和 Config 層為 API羹饰,其它各層均為 SPI伊滋。
  • 圖中綠色小塊的為擴(kuò)展接口,藍(lán)色小塊為實現(xiàn)類队秩,圖中只顯示用于關(guān)聯(lián)各層的實現(xiàn)類笑旺。
  • 圖中藍(lán)色虛線為初始化過程,即啟動時組裝鏈馍资,紅色實線為方法調(diào)用過程筒主,即運行時調(diào)時鏈,紫色三角箭頭為繼承,可以把子類看作父類的同一個節(jié)點乌妙,線上的文字為調(diào)用的方法使兔。

各層說明

  • config 配置層:對外配置接口,以 ServiceConfig, ReferenceConfig 為中心藤韵,可以直接初始化配置類虐沥,也可以通過 spring 解析配置生成配置類
  • proxy 服務(wù)代理層:服務(wù)接口透明代理,生成服務(wù)的客戶端 Stub 和服務(wù)器端 Skeleton, 以 ServiceProxy 為中心泽艘,擴(kuò)展接口為 ProxyFactory
  • registry 注冊中心層:封裝服務(wù)地址的注冊與發(fā)現(xiàn)置蜀,以服務(wù) URL 為中心,擴(kuò)展接口為 RegistryFactory, Registry, RegistryService
  • cluster 路由層:封裝多個提供者的路由及負(fù)載均衡悉盆,并橋接注冊中心盯荤,以 Invoker 為中心,擴(kuò)展接口為 Cluster, Directory, Router, LoadBalance
  • monitor 監(jiān)控層:RPC 調(diào)用次數(shù)和調(diào)用時間監(jiān)控焕盟,以 Statistics 為中心秋秤,擴(kuò)展接口為 MonitorFactory, Monitor, MonitorService
  • protocol 遠(yuǎn)程調(diào)用層:封裝 RPC 調(diào)用,以 Invocation, Result 為中心脚翘,擴(kuò)展接口為 Protocol, Invoker, Exporter
  • exchange 信息交換層:封裝請求響應(yīng)模式灼卢,同步轉(zhuǎn)異步,以 Request, Response 為中心来农,擴(kuò)展接口為 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer
  • transport 網(wǎng)絡(luò)傳輸層:抽象 mina 和 netty 為統(tǒng)一接口鞋真,以 Message 為中心,擴(kuò)展接口為 Channel, Transporter, Client, Server, Codec
  • serialize 數(shù)據(jù)序列化層:可復(fù)用的一些工具沃于,擴(kuò)展接口為 Serialization, ObjectInput, ObjectOutput, ThreadPool

關(guān)系說明

  • 在 RPC 中涩咖,Protocol 是核心層,也就是只要有 Protocol + Invoker + Exporter 就可以完成非透明的 RPC 調(diào)用繁莹,然后在 Invoker 的主過程上 Filter 攔截點檩互。
  • 圖中的 Consumer 和 Provider 是抽象概念,只是想讓看圖者更直觀的了解哪些類分屬于客戶端與服務(wù)器端咨演,不用 Client 和 Server 的原因是 Dubbo 在很多場景下都使用 Provider, Consumer, Registry, Monitor 劃分邏輯拓普節(jié)點闸昨,保持統(tǒng)一概念。
  • 而 Cluster 是外圍概念薄风,所以 Cluster 的目的是將多個 Invoker 偽裝成一個 Invoker饵较,這樣其它人只要關(guān)注 Protocol 層 Invoker 即可,加上 Cluster 或者去掉 Cluster 對其它層都不會造成影響遭赂,因為只有一個提供者時循诉,是不需要 Cluster 的。
  • Proxy 層封裝了所有接口的透明化代理嵌牺,而在其它層都以 Invoker 為中心打洼,只有到了暴露給用戶使用時龄糊,才用 Proxy 將 Invoker 轉(zhuǎn)成接口,或?qū)⒔涌趯崿F(xiàn)轉(zhuǎn)成 Invoker募疮,也就是去掉 Proxy 層 RPC 是可以 Run 的炫惩,只是不那么透明,不那么看起來像調(diào)本地服務(wù)一樣調(diào)遠(yuǎn)程服務(wù)阿浓。
  • 而 Remoting 實現(xiàn)是 Dubbo 協(xié)議的實現(xiàn)他嚷,如果你選擇 RMI 協(xié)議,整個 Remoting 都不會用上芭毙,Remoting 內(nèi)部再劃為 Transport 傳輸層和 Exchange 信息交換層筋蓖,Transport 層只負(fù)責(zé)單向消息傳輸,是對 Mina, Netty, Grizzly 的抽象退敦,它也可以擴(kuò)展 UDP 傳輸粘咖,而 Exchange 層是在傳輸層之上封裝了 Request-Response 語義。
  • Registry 和 Monitor 實際上不算一層侈百,而是一個獨立的節(jié)點瓮下,只是為了全局概覽,用層的方式畫在一起钝域。

模塊分包

/dev-guide/images/dubbo-modules.jpg

模塊說明:

  • dubbo-common 公共邏輯模塊:包括 Util 類和通用模型讽坏。
  • dubbo-remoting 遠(yuǎn)程通訊模塊:相當(dāng)于 Dubbo 協(xié)議的實現(xiàn),如果 RPC 用 RMI協(xié)議則不需要使用此包例证。
  • dubbo-rpc 遠(yuǎn)程調(diào)用模塊:抽象各種協(xié)議路呜,以及動態(tài)代理,只包含一對一的調(diào)用织咧,不關(guān)心集群的管理胀葱。
  • dubbo-cluster 集群模塊:將多個服務(wù)提供方偽裝為一個提供方,包括:負(fù)載均衡, 容錯烦感,路由等巡社,集群的地址列表可以是靜態(tài)配置的,也可以是由注冊中心下發(fā)手趣。
  • dubbo-registry 注冊中心模塊:基于注冊中心下發(fā)地址的集群方式,以及對各種注冊中心的抽象肥荔。
  • dubbo-monitor 監(jiān)控模塊:統(tǒng)計服務(wù)調(diào)用次數(shù)绿渣,調(diào)用時間的,調(diào)用鏈跟蹤的服務(wù)燕耿。
  • dubbo-config 配置模塊:是 Dubbo 對外的 API中符,用戶通過 Config 使用Dubbo,隱藏 Dubbo 所有細(xì)節(jié)誉帅。
  • dubbo-container 容器模塊:是一個 Standlone 的容器淀散,以簡單的 Main 加載 Spring 啟動右莱,因為服務(wù)通常不需要 Tomcat/JBoss 等 Web 容器的特性,沒必要用 Web 容器去加載服務(wù)档插。

整體上按照分層結(jié)構(gòu)進(jìn)行分包慢蜓,與分層的不同點在于:

  • container 為服務(wù)容器,用于部署運行服務(wù)郭膛,沒有在層中畫出晨抡。
  • protocol 層和 proxy 層都放在 rpc 模塊中,這兩層是 rpc 的核心则剃,在不需要集群也就是只有一個提供者時耘柱,可以只使用這兩層完成 rpc 調(diào)用。
  • transport 層和 exchange 層都放在 remoting 模塊中棍现,為 rpc 調(diào)用的通訊基礎(chǔ)调煎。
  • serialize 層放在 common 模塊中,以便更大程度復(fù)用己肮。

依賴關(guān)系

/dev-guide/images/dubbo-relation.jpg

圖例說明:

  • 圖中小方塊 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表層或模塊士袄,藍(lán)色的表示與業(yè)務(wù)有交互,綠色的表示只對 Dubbo 內(nèi)部交互朴肺。
  • 圖中背景方塊 Consumer, Provider, Registry, Monitor 代表部署邏輯拓?fù)涔?jié)點窖剑。
  • 圖中藍(lán)色虛線為初始化時調(diào)用,紅色虛線為運行時異步調(diào)用戈稿,紅色實線為運行時同步調(diào)用西土。
  • 圖中只包含 RPC 的層,不包含 Remoting 的層鞍盗,Remoting 整體都隱含在 Protocol 中需了。

調(diào)用鏈

展開總設(shè)計圖的紅色調(diào)用鏈,如下:

/dev-guide/images/dubbo-extension.jpg

暴露服務(wù)時序

展開總設(shè)計圖左邊服務(wù)提供方暴露服務(wù)的藍(lán)色初始化鏈般甲,時序圖如下:

/dev-guide/images/dubbo-export.jpg

引用服務(wù)時序

展開總設(shè)計圖右邊服務(wù)消費方引用服務(wù)的藍(lán)色初始化鏈肋乍,時序圖如下:

/dev-guide/images/dubbo-refer.jpg

領(lǐng)域模型

在 Dubbo 的核心領(lǐng)域模型中:

  • Protocol 是服務(wù)域,它是 Invoker 暴露和引用的主功能入口敷存,它負(fù)責(zé) Invoker 的生命周期管理墓造。
  • Invoker 是實體域,它是 Dubbo 的核心模型锚烦,其它模型都向它靠擾觅闽,或轉(zhuǎn)換成它,它代表一個可執(zhí)行體涮俄,可向它發(fā)起 invoke 調(diào)用蛉拙,它有可能是一個本地的實現(xiàn),也可能是一個遠(yuǎn)程的實現(xiàn)彻亲,也可能一個集群實現(xiàn)孕锄。
  • Invocation 是會話域吮廉,它持有調(diào)用過程中的變量,比如方法名畸肆,參數(shù)等宦芦。

基本設(shè)計原則

  • 采用 Microkernel + Plugin 模式,Microkernel 只負(fù)責(zé)組裝 Plugin恼除,Dubbo 自身的功能也是通過擴(kuò)展點實現(xiàn)的踪旷,也就是 Dubbo 的所有功能點都可被用戶自定義擴(kuò)展所替換。
  • 采用 URL 作為配置信息的統(tǒng)一格式豁辉,所有擴(kuò)展點都通過傳遞 URL 攜帶配置信息令野。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市徽级,隨后出現(xiàn)的幾起案子气破,更是在濱河造成了極大的恐慌,老刑警劉巖餐抢,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件现使,死亡現(xiàn)場離奇詭異,居然都是意外死亡旷痕,警方通過查閱死者的電腦和手機(jī)碳锈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欺抗,“玉大人售碳,你說我怎么就攤上這事〗食剩” “怎么了贸人?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長佃声。 經(jīng)常有香客問我艺智,道長,這世上最難降的妖魔是什么圾亏? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任十拣,我火速辦了婚禮,結(jié)果婚禮上志鹃,老公的妹妹穿的比我還像新娘父晶。我一直安慰自己,他們只是感情好弄跌,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尝苇,像睡著了一般铛只。 火紅的嫁衣襯著肌膚如雪埠胖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天淳玩,我揣著相機(jī)與錄音直撤,去河邊找鬼。 笑死蜕着,一個胖子當(dāng)著我的面吹牛谋竖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播承匣,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼蓖乘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了韧骗?” 一聲冷哼從身側(cè)響起嘉抒,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袍暴,沒想到半個月后些侍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡政模,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年岗宣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淋样。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡耗式,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出习蓬,到底是詐尸還是另有隱情纽什,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布躲叼,位于F島的核電站芦缰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏枫慷。R本人自食惡果不足惜让蕾,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望或听。 院中可真熱鬧探孝,春花似錦、人聲如沸誉裆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽足丢。三九已至粱腻,卻和暖如春庇配,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绍些。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工捞慌, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柬批。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓啸澡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親氮帐。 傳聞我的和親對象是個殘疾皇子嗅虏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348