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