Dubbo剖析-整體架構(gòu)分析

一、前言

工欲善其事,必先利其器,前面通過(guò)幾篇文章簡(jiǎn)單的介紹了如何使用Dubbo搭建一個(gè)簡(jiǎn)單的分布式系統(tǒng),在接下來(lái)的的一段時(shí)間就來(lái)研究Dubbo原理設(shè)計(jì)卧斟,本文作為原理設(shè)計(jì)的開篇先整體介紹下dubbo的架構(gòu)殴边。

二、整體架構(gòu)

image.png

dubbo官方的這個(gè)圖很復(fù)雜珍语,但是一開始沒有必要深入細(xì)節(jié)锤岸,下面我們簡(jiǎn)單講解主要模塊。

  • 其中Service 和 Config 層為 API板乙,對(duì)應(yīng)服務(wù)提供方來(lái)說(shuō)是使用ServiceConfig來(lái)代表一個(gè)要發(fā)布的服務(wù)配置對(duì)象是偷,對(duì)應(yīng)服務(wù)消費(fèi)方來(lái)說(shuō)ReferenceConfig代表了一個(gè)要消費(fèi)的服務(wù)的配置對(duì)象∧汲眩可以直接初始化配置類蛋铆,也可以通過(guò) spring 解析配置生成配置類。

  • 其它各層均為 SPI放接,SPI意味著下面各層都是組件化可以被替換的刺啦,這也是dubbo比較好的一點(diǎn),主要功能組件都可以插件化替換纠脾。dubbo增強(qiáng)了JDK中的SPI功能玛瘸,在dubbo中其它各層都是使用擴(kuò)展點(diǎn)進(jìn)行提供服務(wù)的蜕青,dubbo增強(qiáng)的SPI增加了對(duì)擴(kuò)展點(diǎn) IoC 和 AOP 的支持,一個(gè)擴(kuò)展點(diǎn)可以直接 setter 注入其它擴(kuò)展點(diǎn)糊渊;并且不會(huì)一次性實(shí)例化擴(kuò)展點(diǎn)的所有實(shí)現(xiàn)類右核,這避免了有擴(kuò)展實(shí)現(xiàn)初始化很耗時(shí),但如果沒用上也加載渺绒,會(huì)很浪費(fèi)資源的情況贺喝,增強(qiáng)的SPI是在具體用某一個(gè)實(shí)現(xiàn)類時(shí)候才進(jìn)行實(shí)例化绎巨。后續(xù)會(huì)具體講解增強(qiáng)的SPI的實(shí)現(xiàn)原理缝其。

  • proxy 服務(wù)代理層:擴(kuò)展接口為 ProxyFactory,dubbo實(shí)現(xiàn)的SPI主要JavassistProxyFactory(默認(rèn)使用)和JdkProxyFactory瓶竭,用來(lái)對(duì)服務(wù)提供方和服務(wù)消費(fèi)方的服務(wù)進(jìn)行代理针炉。

  • registry 注冊(cè)中心層:封裝服務(wù)地址的注冊(cè)與發(fā)現(xiàn)挠他,擴(kuò)展接口為 Registry , RegistryService,Dubbo提供的擴(kuò)展接口實(shí)現(xiàn)為ZookeeperRegistry,RedisRegistry篡帕,MulticastRegistry殖侵,DubboRegistry。
    擴(kuò)展接口RegistryFactory镰烧,dubbo提供的擴(kuò)展接口實(shí)現(xiàn)DubboRegistryFactory拢军,DubboRegistryFactory,RedisRegistryFactory怔鳖,ZookeeperRegistryFactory茉唉。

  • cluster 路由層:封裝多個(gè)提供者的路由及負(fù)載均衡,并橋接注冊(cè)中心结执,
    擴(kuò)展接口為 Cluster , Directory , Router ,LoadBalance度陆。

  • monitor 監(jiān)控層:RPC 調(diào)用次數(shù)和調(diào)用時(shí)間監(jiān)控,擴(kuò)展接口為 MonitorFactory , Monitor , MonitorService献幔。

  • protocol 遠(yuǎn)程調(diào)用層:封將 RPC 調(diào)用懂傀,擴(kuò)展接口為 Protocol , Invoker , Exporter。

  • exchange 信息交換層:封裝請(qǐng)求響應(yīng)模式蜡感,同步轉(zhuǎn)異步蹬蚁,擴(kuò)展接口為 Exchanger , ExchangeChannel ,ExchangeClient , ExchangeServer

  • transport 網(wǎng)絡(luò)傳輸層:抽象 mina 和 netty 為統(tǒng)一接口擴(kuò)展接口為 Channel , Transporter , Client , Server , Codec

  • serialize 數(shù)據(jù)序列化層:可復(fù)用的一些工具,擴(kuò)展接口為 Serialization ,
    ObjectInput , ObjectOutput , ThreadPool

關(guān)于dubbo擴(kuò)展點(diǎn)一個(gè)簡(jiǎn)單的例子:
以擴(kuò)展 Dubbo 的協(xié)議為例郑兴,在協(xié)議的實(shí)現(xiàn) jar 包內(nèi)放置文本文件: METAINF/dubbo/com.alibaba.dubbo.rpc.Protocol 犀斋,內(nèi)容為:

myprotocol=com.alibaba.user.MyProtocol

MyProtocol內(nèi)容如下:

package com.alibaba.user;
import com.alibaba.dubbo.rpc.Protocol;
public class MyProtocol implemenets Protocol {
// ...
}

配置模塊中的配置
Dubbo 配置模塊中,擴(kuò)展點(diǎn)均有對(duì)應(yīng)配置屬性或標(biāo)簽情连,通過(guò)配置指定使用哪個(gè)擴(kuò)展
實(shí)現(xiàn)闪水。比如:

<dubbo:protocol name="myprotocol" />

三、遠(yuǎn)程調(diào)用細(xì)節(jié)

3.1 服務(wù)提供者暴露一個(gè)服務(wù)的詳細(xì)過(guò)程

image.png
  • 首先 ServiceConfig 類拿到對(duì)外提供服務(wù)的實(shí)際類 ref(如:UserServiceImpl),然后通過(guò) ProxyFactory 類的 getInvoker 方法使用 ref 生成一個(gè)
    AbstractProxyInvoker 實(shí)例,到這一步就完成具體服務(wù)到 Invoker 的轉(zhuǎn)化球榆。
    接下來(lái)就是 Invoker 轉(zhuǎn)換到 Exporter 的過(guò)程朽肥。Dubbo 處理服務(wù)暴露的關(guān)鍵就在 Invoker 轉(zhuǎn)換到 Exporter 的過(guò)程,上圖中的紅色部分持钉。

  • Dubbo 協(xié)議的 Invoker 轉(zhuǎn)為 Exporter 發(fā)生在 DubboProtocol 類的
    export 方法衡招,它主要是打開創(chuàng)建一個(gè)Netty Server 偵聽服務(wù),并接收客戶端發(fā)來(lái)的各種請(qǐng)求每强,通訊細(xì)節(jié)由 Dubbo 自己實(shí)現(xiàn)始腾,然后注冊(cè)服務(wù)到服務(wù)注冊(cè)中心。

3.2 服務(wù)消費(fèi)者消費(fèi)一個(gè)服務(wù)的詳細(xì)過(guò)程

image.png
  • 首先 ReferenceConfig 類的 init 方法調(diào)用 Protocol 的 refer 方法生
    成 Invoker 實(shí)例(如上圖中的紅色部分)空执,這是服務(wù)消費(fèi)的關(guān)鍵浪箭。接下來(lái)把
    Invoker 轉(zhuǎn)換為客戶端需要的接口(如:UserServiceBo)。
  • dubbo協(xié)議的invoker轉(zhuǎn)換為客戶端需要的接口是發(fā)生在DubboProtocol的refer方法辨绊,他主要是創(chuàng)建一個(gè)netty client 鏈接服務(wù)提供者奶栖,通訊細(xì)節(jié)由 Dubbo 自己實(shí)現(xiàn)。

四门坷、總結(jié)

本文簡(jiǎn)單的介紹了dubbo整體架構(gòu)宣鄙,后續(xù)具體介紹,dubbo增強(qiáng)的spi的實(shí)現(xiàn)默蚌,服務(wù)提供方如何發(fā)布服務(wù)冻晤,比如何時(shí)如何創(chuàng)建netty Server來(lái)監(jiān)聽服務(wù)消費(fèi)者的鏈接,何時(shí)如何注冊(cè)服務(wù)到服務(wù)治理中心绸吸;dubbo的filter鏈如何構(gòu)建鼻弧;服務(wù)消費(fèi)方如何消費(fèi)服務(wù),何時(shí)創(chuàng)建netty client....

歡迎大家加入知識(shí)星球锦茁,在知識(shí)星球里面我們會(huì)深入討論Java并發(fā)編程攘轩,以及JUC包源碼;Java類加載器原理;Spring,Springboot,Tomcat蜻势,Dubbo等開源框架的使用以及源碼剖析撑刺;分享作者從畢業(yè)到現(xiàn)在一路走來(lái)的學(xué)習(xí)經(jīng)驗(yàn)鹉胖,如何高效學(xué)習(xí)握玛,如何閱讀源碼;討論職業(yè)面試時(shí)候會(huì)經(jīng)常遇到的問(wèn)題以及如何作答甫菠,讀者可以識(shí)別下面二維碼加入:

121挠铲、.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寂诱,隨后出現(xiàn)的幾起案子拂苹,更是在濱河造成了極大的恐慌,老刑警劉巖痰洒,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓢棒,死亡現(xiàn)場(chǎng)離奇詭異浴韭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)脯宿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門念颈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人连霉,你說(shuō)我怎么就攤上這事榴芳。” “怎么了跺撼?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵窟感,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我歉井,道長(zhǎng)柿祈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任酣难,我火速辦了婚禮谍夭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘憨募。我一直安慰自己紧索,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布菜谣。 她就那樣靜靜地躺著珠漂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尾膊。 梳的紋絲不亂的頭發(fā)上媳危,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音冈敛,去河邊找鬼待笑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛抓谴,可吹牛的內(nèi)容都是我干的暮蹂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼癌压,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼仰泻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起滩届,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤集侯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棠枉,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浓体,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辈讶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汹碱。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荞估,靈堂內(nèi)的尸體忽然破棺而出咳促,到底是詐尸還是另有隱情,我是刑警寧澤勘伺,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布跪腹,位于F島的核電站,受9級(jí)特大地震影響飞醉,放射性物質(zhì)發(fā)生泄漏冲茸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一缅帘、第九天 我趴在偏房一處隱蔽的房頂上張望轴术。 院中可真熱鬧,春花似錦钦无、人聲如沸逗栽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)彼宠。三九已至,卻和暖如春弟塞,著一層夾襖步出監(jiān)牢的瞬間凭峡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工决记, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摧冀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓系宫,卻偏偏與公主長(zhǎng)得像索昂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子笙瑟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355