阿里巴巴Dubbo Rpc框架的原理

–高性能和透明化的RPC遠程服務調用方案 –SOA服務治理方案

-Apache MINA 框架基于Reactor模型通信框架,基于tcp長連接

Dubbo缺省協(xié)議采用單一長連接和NIO異步通訊

基本原理如圖:

在 我們的系統(tǒng)中懈费,經常會有一些跨系統(tǒng)的調用葛家,如在A系統(tǒng)中要調用B系統(tǒng)的一個服務呜投,我們可能會使用RMI直接來進行,B系統(tǒng)發(fā)布一個RMI接口服務,然后A 系統(tǒng)就來通過RMI調用這個接口姻成,為了解決容災也祠,擴展昙楚,負載均衡的問題,我們可能會想很多辦法诈嘿,alibaba的這個辦法感覺不錯堪旧。

本文只說dubbo,原理如下:

ConfigServer

配置中心奖亚,和每個Server/Client之間會作一個實時的心跳檢測(因為它們都是建立的Socket長連接)淳梦,比如幾秒鐘檢測一次。收集每個Server提供的服務的信息昔字,每個Client的信息爆袍,整理出一個服務列表,如:

serviceNameserverAddressListclientAddressList

UserService192.168.0.1作郭,192.168.0.2陨囊,192.168.0.3,192.168.0.4172.16.0.1夹攒,172.16.0.2

ProductService192.168.0.3蜘醋,192.168.0.4,192.168.0.5咏尝,192.168.0.6172.16.0.2压语,172.16.0.3

OrderService192.168.0.10,192.168.0.12状土,192.168.0.5无蜂,192.168.0.6172.16.0.3,172.16.0.4

當某個Server不可用蒙谓,那么就更新受影響的服務對應的serverAddressList斥季,即把這個Server從serverAddressList中踢出去(從地址列表中刪除),同時將推送serverAddressList給這些受影響的服務的clientAddressList里面的所有Client。如:192.168.0.3掛了酣倾,那么UserService和ProductService的serverAddressList都要把192.168.0.3刪除掉舵揭,同時把新的列表告訴對應的Client172.16.0.1,172.16.0.2躁锡,172.16.0.3午绳;

當某個Client掛了,那么更新受影響的服務對應的clientAddressList

ConfigServer根據(jù)服務列表映之,就能提供一個web管理界面拦焚,來查看管理服務的提供者和使用者。

新加一個Server時杠输,由于它會主動與ConfigServer取得聯(lián)系赎败,而ConfigServer又會將這個信息主動發(fā)送給Client,所以新加一個Server時蠢甲,只需要啟動Server僵刮,然后幾秒鐘內,Client就會使用上它提供的服務

Client

調用服務的機器鹦牛,每個Client啟動時搞糕,主動與ConfigServer建立Socket長連接,并將自己的IP等相應信息發(fā)送給ConfigServer曼追。

Client在使用服務的時候根據(jù)服務名稱去ConfigServer中獲取服務提供者信息(這樣ConfigServer就知道某個服務是當前哪幾個Client在使用)窍仰,Client拿到這些服務提供者信息后,與它們都建立連接拉鹃,后面就可以直接調用服務了辈赋,當有多個服務提供者的時候,Client根據(jù)一定的規(guī)則來進行負載均衡膏燕,如輪詢钥屈,隨機,按權重等坝辫。

一旦Client使用的服務它對應的服務提供者有變化(服務提供者有新增篷就,刪除的情況),ConfigServer就會把最新的服務提供者列表推送給Client近忙,Client就會依據(jù)最新的服務提供者列表重新建立連接竭业,新增的提供者建立連接,刪除的提供者丟棄連接

Server

真正提供服務的機器及舍,每個Server啟動時未辆,主動與ConfigServer建立Scoket長連接,并將自己的IP锯玛,提供的服務名稱咐柜,端口等信息直接發(fā)送給ConfigServer兼蜈,ConfigServer就會收集到每個Server提供的服務的信息。

優(yōu)點:

1拙友,只要在Client和Server啟動的時候为狸,ConfigServer是好的,服務就可調用了遗契,如果后面ConfigServer掛了辐棒,那只影響ConfigServer掛了以后服務提供者有變化,而Client還無法感知這一變化牍蜂。

2漾根,Client每次調用服務是不經過ConfigServer的,Client只是與它建立聯(lián)系捷兰,從它那里獲取提供服務者列表而已

3立叛,調用服務-負載均衡:Client調用服務時负敏,可以根據(jù)規(guī)則在多個服務提供者之間輪流調用服務贡茅。

4,服務提供者-容災:某一個Server掛了其做,Client依然是可以正確的調用服務的顶考,當前提是這個服務有至少2個服務提供者,Client能很快的感知到服務提供者的變化妖泄,并作出相應反應驹沿。

5,服務提供者-擴展:添加一個服務提供者很容易蹈胡,而且Client會很快的感知到它的存在并使用它渊季。

Dubbo缺省協(xié)議,使用基于mina1.1.7+hessian3.2.1的tbremoting交互罚渐。

連接個數(shù):單連接

連接方式:長連接

傳輸協(xié)議:TCP

傳輸方式:NIO異步傳輸

序列化:Hessian二進制序列化

適用范圍:傳入傳出參數(shù)數(shù)據(jù)包較腥春骸(建議小于100K),消費者比提供者個數(shù)多荷并,單一消費者無法壓滿提供者合砂,盡量不要用dubbo協(xié)議傳輸大文件或超大字符串。

適用場景:常規(guī)遠程服務方法調用

通常源织,一個典型的同步遠程調用應該是這樣的:

1翩伪, 客戶端線程調用遠程接口,向服務端發(fā)送請求谈息,同時當前線程應該處于“暫驮狄伲“狀態(tài),即線程不能向后執(zhí)行了侠仇,必需要拿到服務端給自己的結果后才能向后執(zhí)行

2轻姿, 服務端接到客戶端請求后,處理請求,將結果給客戶端

3踢代, 客戶端收到結果盲憎,然后當前線程繼續(xù)往后執(zhí)行

Dubbo里使用到了Socket(采用apache mina框架做底層調用)來建立長連接,發(fā)送胳挎、接收數(shù)據(jù)饼疙,底層使用apache mina框架的IoSession進行發(fā)送消息。

查看Dubbo文檔及源代碼可知慕爬,Dubbo底層使用Socket發(fā)送消息的形式進行數(shù)據(jù)傳遞窑眯,結合了mina框架,使用IoSession.write()方法医窿,這個方法調用后對于整個遠程調用(從發(fā)出請求到接收到結果)來說是一個異步的磅甩,即對于當前線程來說,將請求發(fā)送出來姥卢,線程就可以往后執(zhí)行了卷要,至于服務端的結果,是服務端處理完成后独榴,再以消息的形式發(fā)送給客戶端的僧叉。于是這里出現(xiàn)了2個問題:

當前線程怎么讓它“暫停”棺榔,等結果回來后瓶堕,再向后執(zhí)行?

正如前面所說症歇,Socket通信是一個全雙工的方式郎笆,如果有多個線程同時進行遠程方法調用,這時建立在client server之間的socket連接上會有很多雙方發(fā)送的消息傳遞忘晤,前后順序也可能是亂七八糟的宛蚓,server處理完結果后,將結果消息發(fā)送給client德频,client收到很多消息苍息,怎么知道哪個消息結果是原先哪個線程調用的?

分析源代碼壹置,基本原理如下:

client一個線程調用遠程接口竞思,生成一個唯一的ID(比如一段隨機字符串,UUID等)钞护,Dubbo是使用AtomicLong從0開始累計數(shù)字的

將打包的方法調用信息(如調用的接口名稱盖喷,方法名稱,參數(shù)值列表等)难咕,和處理結果的回調對象callback课梳,全部封裝在一起距辆,組成一個對象object

向專門存放調用信息的全局ConcurrentHashMap里面put(ID, object)

將ID和打包的方法調用信息封裝成一對象connRequest,使用IoSession.write(connRequest)異步發(fā)送出去

當前線程再使用callback的get()方法試圖獲取遠程返回的結果暮刃,在get()內部跨算,則使用synchronized獲取回調對象callback的鎖, 再先檢測是否已經獲取到結果椭懊,如果沒有诸蚕,然后調用callback的wait()方法,釋放callback上的鎖氧猬,讓當前線程處于等待狀態(tài)背犯。

服務端接收到請求并處理后,將結果(此結果中包含了前面的ID盅抚,即回傳)發(fā)送給客戶端漠魏,客戶端socket連接上專門監(jiān)聽消息的線程收到消息,分析結果妄均,取到ID柱锹,再從前面的ConcurrentHashMap里面get(ID),從而找到callback丛晦,將方法調用結果設置到callback對象里奕纫。

監(jiān)聽線程接著使用synchronized獲取回調對象callback的鎖(因為前面調用過wait(),那個線程已釋放callback的鎖了)烫沙,再notifyAll(),喚醒前面處于等待狀態(tài)的線程繼續(xù)執(zhí)行(callback的get()方法繼續(xù)執(zhí)行就能拿到調用結果了)隙笆,至此锌蓄,整個過程結束。

當前線程怎么讓它“暫统湃幔”,等結果回來后铅忿,再向后執(zhí)行剪决?

答:先 生成一個對象obj柑潦,在一個全局map里put(ID,obj)存放起來,再用synchronized獲取obj鎖峻凫,再調用obj.wait()讓當前 線程處于等待狀態(tài),然后另一消息監(jiān)聽線程等到服務端結果來了后荧琼,再map.get(ID)找到obj差牛,再用synchronized獲取obj鎖,再調用 obj.notifyAll()喚醒前面處于等待狀態(tài)的線程偏化。

正如前面所說,Socket通信是一個全雙工的方式镐侯,如果有多個線程同時進行遠程方法調用,這時建立在client server之間的socket連接上會有很多雙方發(fā)送的消息傳遞析孽,前后順序也可能是亂七八糟的,server處理完結果后袜瞬,將結果消息發(fā)送給client,client收到很多消息邓尤,怎么知道哪個消息結果是原先哪個線程調用的拍鲤?

答:使用一個ID,讓其唯一汞扎,然后傳遞給服務端季稳,再服務端又回傳回來,這樣就知道結果是原先哪個線程的了澈魄。

轉載地址:http://www.cnblogs.com/xmzzp/p/4178153.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末景鼠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子痹扇,更是在濱河造成了極大的恐慌铛漓,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲫构,死亡現(xiàn)場離奇詭異浓恶,居然都是意外死亡,警方通過查閱死者的電腦和手機结笨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門包晰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炕吸,你說我怎么就攤上這事伐憾。” “怎么了算途?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵塞耕,是天一觀的道長。 經常有香客問我嘴瓤,道長扫外,這世上最難降的妖魔是什么莉钙? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮筛谚,結果婚禮上磁玉,老公的妹妹穿的比我還像新娘。我一直安慰自己驾讲,他們只是感情好蚊伞,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吮铭,像睡著了一般时迫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谓晌,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天掠拳,我揣著相機與錄音,去河邊找鬼纸肉。 笑死溺欧,一個胖子當著我的面吹牛,可吹牛的內容都是我干的柏肪。 我是一名探鬼主播姐刁,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼烦味!你這毒婦竟也來了?” 一聲冷哼從身側響起拐叉,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后案铺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡笔诵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年乎婿,在試婚紗的時候發(fā)現(xiàn)自己被綠了谢翎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡榨婆,死狀恐怖褒侧,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情烟央,我是刑警寧澤歪脏,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布唾糯,位于F島的核電站,受9級特大地震影響香璃,放射性物質發(fā)生泄漏舟误。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一眯牧、第九天 我趴在偏房一處隱蔽的房頂上張望赖草。 院中可真熱鬧,春花似錦版确、人聲如沸乎折。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽磨镶。三九已至,卻和暖如春棋嘲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痪伦。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工网沾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辉哥。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓醋旦,卻偏偏與公主長得像会放,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捂人,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理滥搭,服務發(fā)現(xiàn)捣鲸,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 摘自: https://my.oschina.net/hosee/blog/711632摘要: 本文主要說明RPC...
    holy_z閱讀 1,121評論 0 7
  • 首爾的秋天走了,雖然時不時還能看見樹枝上掛著幾簇秋色侵染的樹葉媒役,但只要有風吹過酣衷,樹葉便會毫無留戀地飄下,堆落在地上...
    織夕閱讀 565評論 0 2
  • 早餐穿仪,青菜魚片 早上工作:天潤牛奶200ml對咖啡 午餐:米飯半碗,脆魚片只锻,山藥片紫谷,炒雞蛋,炒白菜 晚餐米飯笤昨,杏鮑...
    青出雨藍閱讀 211評論 0 0
  • 這是我寫字的第三年瞒窒,在這三年里,我絮絮叨叨寫了很多不知所以的文字崇裁。在我情緒低落時,在我焦灼不安時葛峻,在我取得成績時壳炎,...
    sharon韓雨霜閱讀 357評論 0 4