1. 程式人生 > >趣談網路協議學習筆記——RPC

趣談網路協議學習筆記——RPC

二進位制RPC

RPC,遠端過程呼叫,可以認為是在不同程序或者主機間呼叫函式。這是計算分離的一種方式。比如HTTP請求,同樣是在遠端執行一個計算過程並返回結果。而RPC的特點是呼叫方一般保留有一個Stub,使用者看起來就像呼叫本地函式一樣呼叫這個函式,而RPC庫封裝了網路請求的過程。RPC一般是服務間互相呼叫常採取的技術。

RPC主要有兩個部分構成,一個是RPC協議,就是規定如何呼叫一個遠端函式,函式名如何表示,引數如何表示,返回值如何表示等等。第二部分是RPC實現,一般是通過Socket TCP程式設計實現,這就需要考慮網路錯誤,重傳,效能等問題。

不管使用什麼實現,RPC的架構如下: 這裡寫圖片描述

Bruce Jay Nelson 寫了一篇論文Implementing Remote Procedure Calls 定義了RPC的呼叫標準。

二進位制的RPC使用一般是找一個開源的靠譜的庫。

SOAP

SOAP(Simple Object Access Protocol)是一種RPC協議,使用XML表示函式的呼叫和返回結果,使用HTTP協議來傳輸XML,也可以說是一種WebService協議。

<?xml version="1.0" encoding='UTF-8 ?>
<order>
    <date>2018-07-01</date>
<className>趣談網路協議</className> <Author>劉超</Author> <price>68</price> </order>

SOAP的好處是更靈活。因為二進位制的序列化是非常嚴格的,不能有一點不同,所以擴充套件性不好,比如增加一個引數,所有呼叫者都需要修改程式碼。而XML就沒有這個問題。但是使用文字表示函式呼叫並且使用HTTP協議實現RPC,效能是比較差的。

關於SOAP,還有一個概念WSDL(Web Service Description Languages)。WSDL是用於描述一個服務的,相當於一個Schema,這樣就不需要使用文件來描述服務了。

<wsdl: types>
    <xsd:schema targetNameSpace="http://www.example.org/geektime">
        <xsd:complexType name="order">
            <xsd:element name="date" type="xsd:string"></xsd:element>
            <xsd:element name="Author" type="xsd:string"></xsd:element>
            <xsd:element name="price" type="xsd:int"></xsd:element>
        </xsd:complexType>
    </xsd:schema>
</wsdl:types>

<wsdl: message name="purchase">
    <wsdl:part name="purchaseOrder" element="tns:order"></wsdl:part>
</wsdl:message>
...
...

WSDL描述比較複雜,但是很嚴謹。實際工作中使用工具來生成,或者根據工具來生成Stub。

SOAP三大要素:協議約定WSDL,傳輸協議HTTP,服務發現UDDL

RESTful

RESTful是另外一種WebService,使用JSON表示函式呼叫和資料,同樣使用HTTP來傳輸。同時規定了一種以資源為中心的架構風格。和SOAP不同,RESTful並不是通過客戶端的Stub呼叫,而是以URL的方式提供HTTP的網路API,因此,RESTful可以不算是RPC,因為不符合上圖中的RPC架構。使用RESTful架構的一個特點是服務端不需要維護Session狀態(同樣一個URL每次訪問返回的都是同樣的資料,狀態記錄在客戶端)。

總結

基於二進位制協議的RPC適用於公司內部服務間的呼叫,效能好;基於SOAP的RPC呼叫可以釋出給外部的服務呼叫,RESTful也可以做,但是要做好文件工作;RESTful方式適用於給大量的客戶端提供API。