Dubbo支持的協議


協議介紹

協議是兩個網絡實體進行通信的基礎,數據在網絡上從一個實體傳輸到另一個實體,以字節流的形式傳遞到對端。在這個字節流的世界里,如果沒有協議,就無法將這個一維的字節流重塑成為二維或者多維的數據結構以及領域對象。

在通信過程中,不同的服務等級一般對應着不同的服務質量,那么選擇合適的協議便是一件非常重要的事情。你可以根據你應用的創建來選擇。例如,使用RMI協議,一般會受到防火牆的限制,所以對於外部與內部進行通信的場景,就不要使用RMI協議,而是基於HTTP協議或者Hessian協議。

常見的協議模式

應用層協議一般的形式有三種:定長協議、特殊結束符和協議頭+payload模式。

從網絡上以流的形式進行數據的讀取,需要確定的是一次有意義的傳輸內容在讀到何時結束,因為一個一個byte傳輸過來,需要有一個結束。而且數據在網絡上的傳輸,存在粘包和半包的情況,能夠應對這個問題的辦法就是協議能夠准確的識別,當粘包發生時不會多讀,當半包發生時會繼續讀取。

定長協議

定長的協議是指協議內容的長度是固定的,比如協議byte長度是50,當從網絡上讀取50個byte后,就進行decode解碼操作。定長協議在讀取或者寫入時,效率比較高,因為數據緩存的大小基本都確定了,就好比數組一樣,缺陷就是適應性不足,以RPC場景為例,很難估計出定長的長度是多少。

可以參考Netty的FixedLengthFrameDecoder

特殊結束符

相比定長協議,如果能夠定義一個特殊字符作為每個協議單元結束的標示,就能夠以變長的方式進行通信,從而在數據傳輸和高效之間取得平衡,比如用特殊字符\n。

特殊結束符方式的問題是過於簡單的思考了協議傳輸的過程,對於一個協議單元必須要全部讀入才能夠進行處理,除此之外必須要防止用戶傳輸的數據不能同結束符相同,否則就會出現紊亂。

可以參考Netty的DelimiterBasedFrameDecoder

變長協議(協議頭+payload)

一般是自定義協議,會以定長加不定長的部分組成,其中定長的部分需要描述不定長的內容長度。

+———+
|定長|
+———+
|內容|
+———+

可以參考Netty的LengthFieldBasedFrameDecoder

Dubbo支持的協議

  • Dubbo協議
  • Hessian協議
  • HTTP協議
  • RMI協議
  • WebService協議
  • Thrift協議
  • Memcached協議
  • Redis協議

Dubbo 協議

Dubbo缺省協議采用單一長連接和NIO異步通訊,適合於小數據量大並發的服務調用,以及服務消費者機器數遠大於服務提供者機器數的情況。Dubbo缺省協議不適合傳送大數據量的服務,比如傳文件,傳視頻等,除非請求量很低

缺省協議,使用基於mina1.1.7+hessian3.2.1的tbremoting交互。
連接個數:單連接
連接方式:長連接
傳輸協議:TCP
傳輸方式:NIO異步傳輸
序列化:Hessian二進制序列化
適用范圍:傳入傳出參數數據包較小(建議小於100K),消費者比提供者個數多,單一消費者無法壓滿提供者,盡量不要用dubbo協議傳輸大文件或超大字符串。
適用場景:常規遠程服務方法調用

Hessian 協議

Hessian協議用於集成Hessian的服務,Hessian底層采用Http通訊,采用Servlet暴露服務,Dubbo缺省內嵌Jetty作為服務器實現基於Hessian的遠程調用協議。

連接個數:多連接
連接方式:短連接
傳輸協議:HTTP
傳輸方式:同步傳輸
序列化:Hessian二進制序列化
適用范圍:傳入傳出參數數據包較大,提供者比消費者個數多,提供者壓力較大,可傳文件
適用場景:頁面傳輸,文件傳輸,或與原生hessian服務互操作

HTTP 協議

采用Spring的HttpInvoker實現

基於http表單的遠程調用協議

連接個數:多連接
連接方式:短連接
傳輸協議:HTTP
傳輸方式:同步傳輸
序列化:表單序列化(JSON)
適用范圍:傳入傳出參數數據包大小混合,提供者比消費者個數多,可用瀏覽器查看,可用表單或URL傳入參數,暫不支持傳文件
適用場景:需同時給應用程序和瀏覽器JS使用的服務。

RMI 協議

RMI協議采用JDK標准的java.rmi.*實現,采用阻塞式短連接和JDK標准序列化方式

Java標准的遠程調用協議

連接個數:多連接
連接方式:短連接
傳輸協議:TCP
傳輸方式:同步傳輸
序列化:Java標准二進制序列化
適用范圍:傳入傳出參數數據包大小混合,消費者與提供者個數差不多,可傳文件。
適用場景:常規遠程服務方法調用,與原生RMI服務互操作

WebService 協議

基於CXF的frontend-simple和transports-http實現

基於WebService的遠程調用協議

連接個數:多連接
連接方式:短連接
傳輸協議:HTTP
傳輸方式:同步傳輸
序列化:SOAP文本序列化
適用場景:系統集成,跨語言調用。

Thrift 協議

Thrift是一個輕量級、跨語言的遠程服務調用框架,最初由Facebook開發,后面進入Apache開源項目。它通過自身的IDL中間語言, 並借助代碼生成引擎生成各種主流語言的RPC服務端/客戶端模板代碼。

當前 dubbo 支持的 thrift 協議是對 thrift 原生協議的擴展,在原生協議的基礎上添加了一些額外的頭信息,比如service name,magic number等。

資料

Spring Boot、Cloud 學習項目


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM