Alibaba Dubbo框架同步调用原理分析-1
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
由于Dubbo底層采用Socket進(jìn)行通信,自己對(duì)通信理理論也不是很清楚,所以順便把通信的知識(shí)也學(xué)習(xí)一下。
n??通信理論
計(jì)算機(jī)與外界的信息交換稱為通信。基本的通信方法有并行通信和串行通信兩種。
1.一組信息(通常是字節(jié))的各位數(shù)據(jù)被同時(shí)傳送的通信方法稱為并行通信。并行通信依靠并行I/O接口實(shí)現(xiàn)。并行通信速度快,但傳輸線根數(shù)多,只適用于近距離(相距數(shù)公尺)的通信。
2.一組信息的各位數(shù)據(jù)被逐位順序傳送的通信方式稱為串行通信。串行通信可通過(guò)串行接口來(lái)實(shí)現(xiàn)。串行通信速度慢,但傳輸線少,適宜長(zhǎng)距離通信。
串行通信按信息傳送方向分為以下3種:
1)???單工
只能一個(gè)方向傳輸數(shù)據(jù)
2)???半雙工
信息能雙向傳輸,但不能同時(shí)雙向傳輸
3)???全雙工
能雙向傳輸并且可以同時(shí)雙向傳輸
?
n??Socket
Socket?是一種應(yīng)用接口, TCP/IP?是網(wǎng)絡(luò)傳輸協(xié)議,雖然接口相同,?但是不同的協(xié)議會(huì)有不同的服務(wù)性質(zhì)。創(chuàng)建Socket?連接時(shí),可以指定使用的傳輸層協(xié)議,Socket?可以支持不同的傳輸層協(xié)議(TCP?或UDP?),當(dāng)使用TCP?協(xié)議進(jìn)行連接時(shí),該Socket?連接就是一個(gè)TCP?連接。Soket?跟TCP/IP?并沒(méi)有必然的聯(lián)系。Socket?編程接口在設(shè)計(jì)的時(shí)候,就希望也能適應(yīng)其他的網(wǎng)絡(luò)協(xié)議。所以,socket?的出現(xiàn)只是可以更方便的使用TCP/IP?協(xié)議棧而已。
引自:http://hi.baidu.com/lewutian/blog/item/b28e27fd446d641d09244d08.html
上一個(gè)通信理論其實(shí)是想說(shuō)Socket(TCP)通信是全雙工的方式
n??Dubbo遠(yuǎn)程同步調(diào)用原理分析
從Dubbo開源文檔上了解到一個(gè)調(diào)用過(guò)程如下圖
http://code.alibabatech.com/wiki/display/dubbo/User+Guide#UserGuide-APIReference
另外文檔里有說(shuō)明:Dubbo缺省協(xié)議采用單一長(zhǎng)連接和NIO異步通訊,適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用,以及服務(wù)消費(fèi)者機(jī)器數(shù)遠(yuǎn)大于服務(wù)提供者機(jī)器數(shù)的情況。
Dubbo缺省協(xié)議,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。
- 連接個(gè)數(shù):單連接
- 連接方式:長(zhǎng)連接
- 傳輸協(xié)議:TCP
- 傳輸方式:NIO異步傳輸
- 序列化:Hessian二進(jìn)制序列化
- 適用范圍:傳入傳出參數(shù)數(shù)據(jù)包較小(建議小于100K),消費(fèi)者比提供者個(gè)數(shù)多,單一消費(fèi)者無(wú)法壓滿提供者,盡量不要用dubbo協(xié)議傳輸大文件或超大字符串。
- 適用場(chǎng)景:常規(guī)遠(yuǎn)程服務(wù)方法調(diào)用
?通常,一個(gè)典型的同步遠(yuǎn)程調(diào)用應(yīng)該是這樣的: 1,?客戶端線程調(diào)用遠(yuǎn)程接口,向服務(wù)端發(fā)送請(qǐng)求,同時(shí)當(dāng)前線程應(yīng)該處于“暫停“狀態(tài),即線程不能向后執(zhí)行了,必需要拿到服務(wù)端給自己的結(jié)果后才能向后執(zhí)行 2,?服務(wù)端接到客戶端請(qǐng)求后,處理請(qǐng)求,將結(jié)果給客戶端 3,?客戶端收到結(jié)果,然后當(dāng)前線程繼續(xù)往后執(zhí)行
Dubbo里使用到了Socket(采用apache mina框架做底層調(diào)用)來(lái)建立長(zhǎng)連接,發(fā)送、接收數(shù)據(jù),底層使用apache mina框架的IoSession進(jìn)行發(fā)送消息。
查看Dubbo文檔及源代碼可知,Dubbo底層使用Socket發(fā)送消息的形式進(jìn)行數(shù)據(jù)傳遞,結(jié)合了mina框架,使用IoSession.write()方法,這個(gè)方法調(diào)用后對(duì)于整個(gè)遠(yuǎn)程調(diào)用(從發(fā)出請(qǐng)求到接收到結(jié)果)來(lái)說(shuō)是一個(gè)異步的,即對(duì)于當(dāng)前線程來(lái)說(shuō),將請(qǐng)求發(fā)送出來(lái),線程就可以往后執(zhí)行了,至于服務(wù)端的結(jié)果,是服務(wù)端處理完成后,再以消息的形式發(fā)送給客戶端的。于是這里出現(xiàn)了2個(gè)問(wèn)題:
- 當(dāng)前線程怎么讓它“暫停”,等結(jié)果回來(lái)后,再向后執(zhí)行?
- 正如前面所說(shuō),Socket通信是一個(gè)全雙工的方式,如果有多個(gè)線程同時(shí)進(jìn)行遠(yuǎn)程方法調(diào)用,這時(shí)建立在client server之間的socket連接上會(huì)有很多雙方發(fā)送的消息傳遞,前后順序也可能是亂七八糟的,server處理完結(jié)果后,將結(jié)果消息發(fā)送給client,client收到很多消息,怎么知道哪個(gè)消息結(jié)果是原先哪個(gè)線程調(diào)用的?
分析源代碼,基本原理如下:
現(xiàn)在,前面兩個(gè)問(wèn)題已經(jīng)有答案了,
- 當(dāng)前線程怎么讓它“暫停”,等結(jié)果回來(lái)后,再向后執(zhí)行?
- 正如前面所說(shuō),Socket通信是一個(gè)全雙工的方式,如果有多個(gè)線程同時(shí)進(jìn)行遠(yuǎn)程方法調(diào)用,這時(shí)建立在client server之間的socket連接上會(huì)有很多雙方發(fā)送的消息傳遞,前后順序也可能是亂七八糟的,server處理完結(jié)果后,將結(jié)果消息發(fā)送給client,client收到很多消息,怎么知道哪個(gè)消息結(jié)果是原先哪個(gè)線程調(diào)用的?
轉(zhuǎn)載于:https://my.oschina.net/91jason/blog/374171
總結(jié)
以上是生活随笔為你收集整理的Alibaba Dubbo框架同步调用原理分析-1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Alibaba Dubbo框架同步调用原
- 下一篇: iOS开发网络篇—使用ASI框架进行文件