RPC-總體概念

RPC概述

  RPC(Remote Procedure Call),即遠程過程調用,是一種經過網絡從遠程計算機程序上請求服務而不須要了解底層網絡技術的協議,實現調用遠程主機上的方法就像調用本地方法同樣。RPC協議在分佈式系統中發揮重要的做用。git

RPC涉及的技術

                                                  圖片摘自http://blog.csdn.net/yinwenjie/article/details/49453303github

   

  RPC是典型的C/S模型,能夠邏輯上由下到上劃分爲Transfer/Network Protocol、Message Protocol、Selector/Processor(Server端)和Stub/Proxy(Client端)等層次。apache

  Transfer/Network Protocol層

    主要負責不一樣主機之間數據的傳輸,主要包括採用的網絡傳輸協議和網絡I/O模型。網絡

    傳輸協議(Transport Protocol)

      大多數RPC是創建在TCP協議(傳輸層協議)之上,由於TCP具備面向鏈接的、全雙工、可靠傳輸(按序、不重、不丟、容錯)、流量控制(滑動窗口)等特色。固然也可使用http協議、UDP協議等。架構

    I/O模型(I/O Model)

      阻塞式同步IO(bloking IO)、非阻塞式同步IO(non-blocking IO)、多路複用IO(multiplexing IO)、異步IO(asynchronous IO)框架

      具體特色見I/O隨筆。異步

  Message Protocol層

    主要負責傳輸數據的識別,主要包括協議結構(Wire Protocol)和序列化(Serialization),通過I/O只能在不一樣主機之間傳輸二進制數據,協議結構和序列化則是解決如何識別這些二進制數據。。async

    協議結構(Wire Protocol)

      TCP粘包和半包問題
分佈式

        以下圖,發送端發送ABC、DEF、GHI三個Frame,而接收端可能收到四個Frame。性能

        

        TCP只保證將數據可靠有序的傳輸,但接收端收到的Frame和發送端發送的Frame可能並不一致,這就是TCP粘包和半包問題,其中AB、H、I爲半包,CDEFG爲粘包。

      TCP粘包和半包發生的緣由

        1)應用層:應用程序write寫入的字節大小大於套接口發送的緩衝區大小;

        2)TCP層:大於MSS(maximum segment size,最大報文段長度,即TCP層報文段的最大長度)的TCP分段;

        3)IP層:以太網幀大於MTU(maximum transmission unit,最大傳輸單元)的IP分片。

        關於MSS和MTU的相關知識可參考:http://blog.csdn.net/feng1072218457/article/details/51219251

      TCP粘包和半包的解決方法

        1)採用分隔符,例如:在消息結尾增長回車換行符(\r\n)進行分割,典型的是FTP協議。

        2)消息定長,例如:將消息分爲消息頭和消息體,即header+payload的方式,消息頭中含有消息總長度或消息體長度,典型的是http協議。

      協議結構解決的就是TCP粘包和半包問題,它可以從二進制數據流中識別並分割出具備應用層語義的消息。

     序列化(Serialization)

      從二進制數據流中取出應用層語義的消息後,就須要將該消息轉換成本地可識別的數據(例如對象或結構體等),這個過程稱爲序列化和反序列化技術。

      常見的序列化技術有:Protocol Buffers,Thrift,XML,JSON,MessagePack,Hessian,Protostuff,Java Native Serialize,FST等

  IDL(Interface description language,接口定義語言)

    IDL是RPC框架實現跨語言的基礎,定義了一種各語言可以理解的消息結構、接口定義的描述形式。

  Stub/Proxy

    客戶端經過代理實現對遠程接口的調用,RPC框架Proxy負責消息格式、傳輸協議實現。

  Selector/Processor

    負責接收客戶端的請求並執行服務端對接口的實現,主要包括:管理RPC接口的註冊、判斷客戶端的請求權限、控制接口實現類的執行在內的各類工做。

常見的RPC框架

  Thrift:來自Facebook的開源項目,有本身的IDL,支持跨語言,基於TCP協議,支持多種消息格式(二進制、JSON等)、支持阻塞I/O模型和多路複用I/O模型,性能優秀。http://thrift.apache.org/

  GRPC:來自Google的開源項目,有本身的IDL,支持跨語言,基於HTTP/2協議,只支持Protocol Buffers序列化。https://github.com/grpc/grpc

  Dubbo:來自阿里的開源分佈式服務框架,除了集成RPC的規範外,Dubbo還在RPC的上層搭建服務層功能、配置層功能、服務路由功能。http://dubbo.io/

  

 

參考資料

 

  體系化認識RPC

  架構設計:系統間通訊(10)——RPC的基本概念

  MSS and MTU

相關文章
相關標籤/搜索