dubbo 大白話系列-擴(kuò)展點(diǎn)機(jī)制

1. 問題的由來

條條大路通羅馬芭逝,實(shí)現(xiàn)相同的功能可以使用不同的方案氏身,比如說dubbo代理生成的方案,有人喜歡用JDK動態(tài)代理含滴,有人喜歡用javasist生成字節(jié)碼的方式來生成代理痰哨。RPC協(xié)議可以使用dubbo協(xié)議胶果,也可以使用RMI協(xié)議。那么問題來了斤斧,既然實(shí)現(xiàn)同樣的功能有多種方案早抠,而dubbo又不能強(qiáng)行用戶必須要使用哪一種方案,總不能寫死在代碼里吧撬讽,那么如何做到在運(yùn)行時根據(jù)我的需要自由切換呢蕊连?

2. 解決過程

dubbo想達(dá)到的效果就是根據(jù)用戶傳入的參數(shù)來自動找到合適的方案。

2.1 我能想到最簡單的方法就是:
if(參數(shù)==“dubbo”){
      return new DubboProtocol();
 }else if(參數(shù) == "rmi"){
     return new RMIProtocol();
 }

...... .......
這樣也可以解決問題啊游昼,用戶參數(shù)里指定啥協(xié)議甘苍,我返回給你啥協(xié)議

2.2 能不寫if else嗎?

萬一哪天又出了一種牛逼的rpc協(xié)議叫做NBProtocol烘豌,難道要去改代碼多加個if else嗎载庭?
那好吧,那我使用設(shè)計模式之 -- 策略模式廊佩,不就解決了囚聚?對外暴露的接口都是一樣的,只是內(nèi)部的一小部分算法我可以自由替換标锄,也就是說顽铸,啟動的時候把所有協(xié)議統(tǒng)統(tǒng)掃描進(jìn)來,最終的效果就是策略模式內(nèi)部維護(hù)一個這樣的map:

name className
dubbo com.xxx.xxx.DubboProtocol
rmi com.xxx.xxx.RMIProtocol
nb com.xxx.xxx.NBProtocol

如果用戶外邊傳一個參數(shù)叫“rmi”料皇,我就map.get("rmi"),這樣就得到了RMIProtocol谓松。

2.3 鳥不拉屎的位置

感覺好像已經(jīng)解決了,但是好像有點(diǎn)不對践剂,上面說啟動的時候把所有協(xié)議統(tǒng)統(tǒng)掃描進(jìn)來毒返,咋掃描?去哪掃描舷手?你的這個牛逼的NBProtocol協(xié)議有可能是在哪個旮旯的jar里拧簸,也有可能是在哪個鳥不拉屎的package下面,也有可能在文件系統(tǒng)里男窟,也有可能在遙遠(yuǎn)的網(wǎng)絡(luò)上盆赤,你讓dubbo去哪找你哪個牛逼的NBProtocol?

那這也好辦歉眷,我dubbo就規(guī)定了牺六,你自己寫的擴(kuò)展的協(xié)議都要放在xxx.xxxx這個classpath下,不放不加載汗捡,到時候找不到可別怪我沒跟你說過淑际。恩畏纲,就這樣,按照事先約定好的約定春缕,就可以解決加載位置的問題盗胀。

2.4 尋找優(yōu)越感

按理說已經(jīng)解決了之前說動態(tài)加載的問題了,但是呢锄贼,作為一個牛逼的框架票灰,總得寫點(diǎn)別人看不懂的代碼吧,不然優(yōu)越感哪里來宅荤?
好吧屑迂,之前java 1.6 就引入了一種叫做spi的東西,主要就是為了做到服務(wù)發(fā)現(xiàn)和動態(tài)擴(kuò)展冯键,SPI英文為Service Provider Interface惹盼。 但是呢,如果直接就用spi雖然也勉強(qiáng)可以惫确,但不改點(diǎn)東西豈不是太low了逻锐,我dubbo的優(yōu)越感哪里找?雕薪?何況原生的spi確實(shí)有點(diǎn)小問題昧诱,那就是他一上來就把你要的類全都實(shí)例化了(我只是多放幾個在哪里裝裝逼,壓根沒想去用所袁,別那么較真)盏档。于是乎dubbo就搞出來一個,而且是按需實(shí)例化燥爷。人家java spi里有serviceloader蜈亩,dubbo就來個extensionloader,意思都一樣前翎,都是負(fù)責(zé)去加載自定義的擴(kuò)展點(diǎn)的稚配。人家java spi 規(guī)定了自己 寫的擴(kuò)展點(diǎn)必須要在 /META-INF/services/ 下邊有一個文件(文件名是接口完全限定名,內(nèi)容是接口實(shí)現(xiàn)類)港华,dubbo也來個規(guī)定道川,必須在

源碼截圖

這3個文件夾(任意一個)下有一些特殊文件(文件名為接口名,內(nèi)容是key=value形式的擴(kuò)展點(diǎn)配置)立宜,總言而之冒萄,原理是和java spi的原理一毛一樣 。

3. 最后讓我們來舉個栗子橙数,使用咱自定義的NBProtocol來暴露服務(wù)尊流。#####

  1. 弄一個jar包,jar結(jié)構(gòu)如下


    Paste_Image.png
  2. 新建一個dubbo provider的工程灯帮,pom里依賴上面的jar崖技,里面的spring xml 配置加上這個

Paste_Image.png

3.首先在一開始加載的時候會掃描到我們自定義的協(xié)議逻住,


Paste_Image.png

在往下走,運(yùn)行到了斷點(diǎn)這個位置迎献,說明開始暴露服務(wù)了瞎访,說明咱的牛逼協(xié)議流程可以通了


Paste_Image.png

總結(jié)

上面就是我的一些關(guān)于擴(kuò)展點(diǎn)加載機(jī)制的了解,最直觀的感受是忿晕,有了擴(kuò)展點(diǎn)明顯感覺生活質(zhì)量明顯提高了不少装诡,因?yàn)椴还芎锬犟R月银受,不管你是蹲在那個陰暗的角落践盼,只要按照規(guī)范弄個jar包丟到classpath中,你可以直接替換原來的功能了宾巍,讓我們看下dubbo自帶哪些擴(kuò)展點(diǎn)

源碼

哇咕幻!這幫人真能寫啊,也就是說這些東東我們統(tǒng)統(tǒng)能換掉顶霞,學(xué)習(xí)了上面的知識肄程,讓我們分分鐘把dubbo改的面目全非吧!选浑!

阿里云服務(wù)器限時打折蓝厌!點(diǎn)擊獲取

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市古徒,隨后出現(xiàn)的幾起案子拓提,更是在濱河造成了極大的恐慌,老刑警劉巖隧膘,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件代态,死亡現(xiàn)場離奇詭異,居然都是意外死亡疹吃,警方通過查閱死者的電腦和手機(jī)蹦疑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萨驶,“玉大人歉摧,你說我怎么就攤上這事∏晃兀” “怎么了判莉?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長育谬。 經(jīng)常有香客問我券盅,道長,這世上最難降的妖魔是什么膛檀? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任锰镀,我火速辦了婚禮娘侍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泳炉。我一直安慰自己憾筏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布花鹅。 她就那樣靜靜地躺著氧腰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刨肃。 梳的紋絲不亂的頭發(fā)上古拴,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音真友,去河邊找鬼黄痪。 笑死,一個胖子當(dāng)著我的面吹牛盔然,可吹牛的內(nèi)容都是我干的桅打。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愈案,長吁一口氣:“原來是場噩夢啊……” “哼挺尾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起站绪,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤遭铺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后崇众,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掂僵,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年顷歌,在試婚紗的時候發(fā)現(xiàn)自己被綠了锰蓬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡眯漩,死狀恐怖芹扭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赦抖,我是刑警寧澤舱卡,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站队萤,受9級特大地震影響轮锥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜要尔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一舍杜、第九天 我趴在偏房一處隱蔽的房頂上張望新娜。 院中可真熱鬧,春花似錦既绩、人聲如沸概龄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽私杜。三九已至,卻和暖如春救欧,著一層夾襖步出監(jiān)牢的瞬間衰粹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工颜矿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寄猩,地道東北人嫉晶。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓骑疆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親替废。 傳聞我的和親對象是個殘疾皇子箍铭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前面我們了解過了Java的SPI擴(kuò)展機(jī)制,對于Java擴(kuò)展機(jī)制的原理以及優(yōu)缺點(diǎn)也有了大概的了解椎镣,這里繼續(xù)深入一下D...
    加大裝益達(dá)閱讀 5,059評論 2 20
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理诈火,服務(wù)發(fā)現(xiàn),斷路器状答,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • Dubbo是什么 Dubbo是Alibaba開源的分布式服務(wù)框架冷守,它最大的特點(diǎn)是按照分層的方式來架構(gòu),使用這種方式...
    Coselding閱讀 17,212評論 3 196
  • FIREFOXJS閱讀 247評論 0 0
  • 作文教學(xué)最大的問題是惊科,我們對什么是真正的“好的兒童作文”拍摇,發(fā)生了根本性的偏差。諸如“童年的事情多如天上的星星馆截,在向...
    風(fēng)塵海馬泉閱讀 271評論 0 0