1. 程式人生 > >rpc 是什麼與http的一些區別

rpc 是什麼與http的一些區別

RPC是遠端過程呼叫

什麼意思呢?

你以前呼叫的都是本地的服務,如:

val you = PersonManager.getById("007");

這個很簡單,你也很熟悉,PersonManager是本地記憶體的一個靜態物件嘛,呼叫它的getById方法嘛

但是假設這個服務提供方是另外一臺機器呢?

這個時候你可能會基於HTTP設計一個“上層的”協議,然後以上簡單的一句呼叫會被分解成以下步驟:

(1)你的程式作為客戶端,連線到host,提交POST請求到伺服器的某個servlet:

為了告訴伺服器你要做什麼呼叫,你需要把呼叫資訊封裝(序列化)到request訊息體裡面,例如設計成

{
method: '
getById' parameters:[ '007' ] }

(2)servlet解析(反序列化)request訊息體,對映成方法名及其引數

(3)根據以上簽名,servlet呼叫本地真正的服務,獲取到you物件

(4)servlet將you物件的資訊包裝(序列化)到response訊息中

(5)客戶端取到response訊息體,解析(反序列化)成Person物件

這個時候,返回值才真正變成本地的物件(其實是一個代理物件),接下來就是消費咯!

從這個例子裡,你就看到了,HTTP只管底層的傳輸,它不關心RPC本身對訊息格式的約定,你可以將方法名放在queryString裡,也可以全部放到request訊息體裡。訊息體可以用json,也可以xml,以及二進位制。同樣的,返回值及異常資訊也需要設計約定,如此如此,就是RPC框架乾的事了。

有一些RPC框架就是基於HTTP的,如N年前流行的hessian。基於HTTP,利用一些成熟的序列化器(serde,serializer+deserializer),如Avro,你甚至可以在一個晚起的上午就封裝出一個可用的RPC框架。當然了,成熟的RPC除了序列化之外,還要考慮更多的內容,如:非同步處理,物件複用啊,什麼的。