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