dubbo源碼解析-router

前言

估算了一下,dubbo里面涉及的東西還是比較多的.比如談到框架的時候,設(shè)計模式都是一個老生常談的話題,再比如我們開發(fā)中我們不常用的一些概念,spi汰具、javassist,以及和zookeeper相關(guān)的一些知識,比如ZKClient的使用,這些和dubbo關(guān)系很密切,但是這些假如我不做一些前戲鋪墊就直接把源碼貼出來,那真的沒啥意義.因為看源碼還是要有一些基礎(chǔ),所以我的目標(biāo)是,即使看不懂源碼,但是看我的分析思路和穿插的一些面試題,都能有一些收獲.

從標(biāo)題就知道,這次我講的是集群容錯中的第二個關(guān)鍵詞Router,中文意思就是路由,這個路由是個很有意思的詞匯.因為前端的路由和后端的路由他們是不同的,但是思想是基本一致的.鑒于很多技術(shù)文章都有一個詬病,就是只講概念,卻不講應(yīng)用場景,其實Router應(yīng)用隔離,讀寫分離,灰度發(fā)布中都有它的影子.因此本篇用灰度發(fā)布的例子來做前期的鋪墊

灰度發(fā)布

先看看百度百科的概念

灰度發(fā)布是指在黑與白之間扑眉,能夠平滑過渡的一種發(fā)布方式续镇。AB test就是一種灰度發(fā)布方式下隧,讓一部分用戶繼續(xù)用A赖舟,一部分用戶開始用B蘑秽,如果用戶對B沒有什么反對意見宠能,那么逐步擴大范圍亚隙,把所有用戶都遷移到B上面來∥コ纾灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定阿弃,在初始灰度的時候就可以發(fā)現(xiàn)、調(diào)整問題羞延,以保證其影響度渣淳。

說人話就是,你發(fā)布應(yīng)用的時候,不停止對外的服務(wù),也就是讓用戶感覺不到你在發(fā)布.那么下面演示一下灰度發(fā)布

1.首先在192.168.56.2192.168.56.3兩臺機器上啟動Provider,然后啟動Consumer,如下圖

2.假設(shè)我們要升級192.168.56.2服務(wù)器上的服務(wù),接著我們?nèi)ubbo的控制臺配置路由,切斷192.168.56.2的流量,配置完成并且啟動之后,就看到此時只調(diào)用192.168.56.3的服務(wù)

3.假設(shè)此時你在192.168.56.2服務(wù)器升級服務(wù),升級完成后再次將啟動服務(wù).

4.由于服務(wù)已經(jīng)升級完成,那么我們此時我們要把剛才的禁用路由取消點,于是點了禁用,但是此時dubbo的這個管理平臺就出現(xiàn)了bug,如下圖所示

驚奇的發(fā)現(xiàn)點了禁用,數(shù)據(jù)就變兩條了,繼續(xù)點禁用,還是兩條,而且刪除還刪除不了,這樣就很蛋疼了...但是一直刪不了也不是辦法,解決辦法也是有的,那就是去zookeeper上刪除節(jié)點

5.由于我之前是從事iOS開發(fā)的,所以一直用的是Mac電腦,Mac上好像沒有特別好用的zookeeper可視化客戶端工具,于是我就用了這個idea的zookeeper插件,只要將這個zookeeper節(jié)點刪除

然后刷新控制臺的界面,如下圖那么就只剩下一條了

6.那么此時我們再看控制臺的輸出,已經(jīng)恢復(fù)正常,整個灰度發(fā)布流程結(jié)束

直入主題

我們先來看看Router的繼承體系圖

從圖中可以看出,他有三個實現(xiàn)類,分別是ConditionRouter,MockInvokersSelector,ScriptRouter

MockInvokersSelectordubbo源碼解析-集群容錯架構(gòu)設(shè)計中提到這里就暫時不多做敘述

ScriptRouterdubbo的測試用例中就有用到,這個類的源碼不多,也就124行.引用官網(wǎng)的描述

腳本路由規(guī)則 支持 JDK 腳本引擎的所有腳本,比如:javascript, jruby, groovy 等伴箩,通過 type=javascript 參數(shù)設(shè)置腳本類型入愧,缺省為 javascript。

當(dāng)然看到這里可能你可能還是沒有感覺出這個類有什么不可替代的作用,你注意一下這個類中有個ScriptEngine的屬性,那么我可以舉一個應(yīng)用場景給你

假如有這么個表達式如下:

double d = (1+1-(2-4)*2)/24;//沒有問題 

"(1+1-(2-4)*2)/24"http://但是假如這個表達式是這樣的字符串格式,或者更復(fù)雜的運算,那么你就不好處理了,然后這個ScriptEngine類的eval方法就能很好處理這類字符串表達式的問題

本篇主要講講ConditionRouter(條件路由),條件路由主要就是根據(jù)dubbo管理控制臺配置的路由規(guī)則來過濾相關(guān)的invoker,當(dāng)我們對路由規(guī)則點擊啟用的時候,就會觸發(fā)RegistryDirectory類的notify方法

其實我覺得看技術(shù)類文章更重要的是看分析的思路,看的是思考過程,比如為什么這個notify方法傳入的是List<URL>呢?如果看過我前兩篇dubbo源碼解析dubbo源碼解析-集群容錯架構(gòu)設(shè)計dubbo源碼解析-directory就明白,我的分析過程都是以官方文檔為依據(jù),所以這個問題的答案自然也在官方文檔.下面引用一段官網(wǎng)文檔的描述

所有配置最終都將轉(zhuǎn)換為 URL 表示嗤谚,并由服務(wù)提供方生成棺蛛,經(jīng)注冊中心傳遞給消費方,各屬性對應(yīng) URL 的參數(shù)巩步,參見配置項一覽表中的 "對應(yīng)URL參數(shù)" 列

其實對于Router來說,我們最關(guān)心的就是他是怎么過濾的.所以下面這些流程代碼我們先走一遍

這個條件路由有一個特點,就是他的getUrl是有值的,同時這里分享一個IDEAdebug查看表達式內(nèi)容的技巧,比如router.getUrl()表達式的值,如下圖所示

從這里我們看到,此時實現(xiàn)類是ConditionRouter,由于接下來的邏輯如果直接讓大家看源碼圖可能不夠清晰,所以我又把這個核心的篩選過程用了一個高清無碼圖,并且用序號標(biāo)注

最后的篩選結(jié)果如下,因為我們在管理后臺配置了禁用192.168.56.2,所以最后添加進invokers的就只有192.168.56.3

寫在末尾

這篇文章準(zhǔn)備了好久,因為每天加班回到家都是11點多,但是我認(rèn)為越是時間緊張,才能越看出一個人做事的決心,無論加班多忙,或者過年放假,每周一篇的承諾始終不變,鑒于本人才疏學(xué)淺,不對的地方還望斧正.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旁赊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子椅野,更是在濱河造成了極大的恐慌终畅,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竟闪,死亡現(xiàn)場離奇詭異声离,居然都是意外死亡,警方通過查閱死者的電腦和手機瘫怜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門蝗柔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人式廷,你說我怎么就攤上這事休偶。” “怎么了暗挑?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵笋除,是天一觀的道長。 經(jīng)常有香客問我炸裆,道長垃它,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮国拇,結(jié)果婚禮上洛史,老公的妹妹穿的比我還像新娘。我一直安慰自己酱吝,他們只是感情好也殖,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著务热,像睡著了一般忆嗜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崎岂,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天捆毫,我揣著相機與錄音,去河邊找鬼冲甘。 笑死冻璃,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的损合。 我是一名探鬼主播省艳,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嫁审!你這毒婦竟也來了跋炕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤律适,失蹤者是張志新(化名)和其女友劉穎辐烂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捂贿,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡纠修,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了厂僧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扣草。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖颜屠,靈堂內(nèi)的尸體忽然破棺而出辰妙,到底是詐尸還是另有隱情,我是刑警寧澤甫窟,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布密浑,位于F島的核電站,受9級特大地震影響粗井,放射性物質(zhì)發(fā)生泄漏尔破。R本人自食惡果不足惜街图,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望懒构。 院中可真熱鬧餐济,春花似錦、人聲如沸痴脾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赞赖。三九已至,卻和暖如春冤灾,著一層夾襖步出監(jiān)牢的瞬間前域,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工韵吨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匿垄,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓归粉,卻偏偏與公主長得像椿疗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子糠悼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理届榄,服務(wù)發(fā)現(xiàn),斷路器倔喂,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • Dubbo是什么 Dubbo是Alibaba開源的分布式服務(wù)框架铝条,它最大的特點是按照分層的方式來架構(gòu),使用這種方式...
    Coselding閱讀 17,220評論 3 196
  • 概述 在介紹LOOM之前, 說一下我對一個互聯(lián)網(wǎng)公司多語言開發(fā)環(huán)境的感受. 現(xiàn)在互聯(lián)網(wǎng)高速發(fā)展的時代,產(chǎn)品快速迭代...
    Kungfu貓熊閱讀 4,941評論 3 49
  • Codis 3.2 部署配置匯總 概念總結(jié) 集群配置前需要了解架構(gòu)席噩,集群分片主要分三種: 客戶端分片:這個需要自己...
    三杯水Plus閱讀 6,003評論 0 11
  • 每年的三月十七日是愛爾蘭的國慶節(jié)悼枢,也叫St. Patrick's Day 埠忘。這個節(jié)日的起源是:在公元432年, S...
    嬌嬌貓閱讀 359評論 2 7