簡單理解 RPC(轉載)

原文地址:http://www.syyong.com/architecture/Simple-understanding-of-RPC.htmlphp

RPC(Remote Procedure Call Protocol)—— 遠程過程調用協議。這個概念術語在上世紀 80 年代由 Bruce Jay Nelson 提出。它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。RPC 協議假定某些傳輸協議的存在,如 TCP 或 UDP,爲通訊程序之間攜帶信息數據。在 OSI 網絡通訊模型中,RPC 跨越了傳輸層和應用層。RPC 使得開發包括網絡分佈式多程序在內的應用程序更加容易。html

RPC 採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,得到進程結果,而後調用執行繼續進行。json

RPC 的幾個特色

  1. 簡單地說,RPC 就是從一臺機器(客戶端)上經過參數傳遞的方式調用另外一臺機器(服務器)上的一個函數或方法(能夠統稱爲服務)並獲得返回的結果;
  2. RPC 會隱藏底層的通信細節(不須要直接處理 Socket 通信或 Http 通信);
  3. RPC 是一個請求響應模型。客戶端發起請求,服務器返回響應(相似於 Http 的工做方式);
  4. RPC 在使用形式上像調用本地函數(或方法)同樣去調用遠程的函數(或方法)。

RPC 經常使用數據序列話協議

  1. Json
  2. Xml
  3. PHP serialize
  4. 二進制,如 Protobuf、msgpack

RPC 經常使用通訊協議

  1. Http
  2. Tcp
  3. Socket
  4. Websocket

看一個 PHP 的客戶端調用例子

\RpcClient::serv('User')->handler('UserInfo')->getUserInfoById($id);

Rpc 流程圖

rpc狀態圖.jpg

  1. 調用客戶端句柄;執行傳送參數
  2. 調用本地系統內核發送網絡消息
  3. 消息傳送到遠程主機
  4. 服務器句柄獲得消息並取得參數
  5. 執行遠程過程
  6. 執行的過程將結果返回服務器句柄
  7. 服務器句柄返回結果,調用遠程系統內核
  8. 消息傳回本地主機
  9. 客戶句柄由內核接收消息
  10. 客戶接收句柄返回的數據

常見的 RPC 框架:

  1. Thrift
  2. gRpc
  3. Yar
  4. hprose
  5. dubbo

2、Protobuf 和 Thrift 介紹

Protobuf

Protocol Buffers (a.k.a., protobuf) are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data.服務器

Protobuf 是一種二進制數據序列化協議,相對 xml、json 這些協議來講,它具備更小、性能更好、效率更快的優點。一樣由於是二進制協議也就帶來了可讀性更差問題。目前尚未官方支持的 php 擴展,但有好比 php-protobuf 這樣的開源擴展。Protobuf 對數據序列化後可用於 RPC 框架的數據傳輸交互。網絡

Thrift

Thrift 最初由 facebook 開發用作系統內各語言之間的 RPC 通訊,它提供了全套的 RPC 解決方案,包括序列化機制、傳輸層、併發處理框架等。併發

Thrift經過一箇中間語言(IDL, 接口定義語言)來定義 RPC 的接口和數據類型,而後經過一個編譯器生成不一樣語言的代碼(目前支持 C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 和 OCaml),並由生成的代碼負責 RPC 協議層和傳輸層的實現。
Thrift 其實是實現了 C/S 模式,經過代碼生成工具將接口定義文件生成服務器端和客戶端代碼(能夠爲不一樣語言),從而實現服務端和客戶端跨語言的支持。用戶在 Thirft 描述文件中聲明本身的服務,這些服務通過編譯後會生成相應語言的代碼文件,而後用戶實現服務(客戶端調用服務,服務器端提服務)即可以了。其中 protocol(協議層, 定義數據傳輸格式,能夠爲二進制或者 XML 等)和 transport(傳輸層,定義數據傳輸方式,能夠爲 TCP/IP 傳輸,內存共享或者文件共享等)被用做運行時庫。框架

Thrift 支持多種協議格式的序列化和反序列化,如二進制,json 格式。這讓用戶能夠更加靈活的選擇協議的具體形式。更完美的是,協議是可自由擴展的,新版本的協議,徹底兼容老的版本!socket

4、參考

    1. http://baike.baidu.com/link?url=3b4Gnihli1pE0_o5z19CQQSNms3wM7d2m92DGagukwFsqzTUx9RI_fOBgMKOzGsJHAC_Qch-ivoFFSMNfP7c88zjJGpKb0-yrwmqOmmYnxppSHVtkt_RG__cbgf6vW1UDXpP4xQIi_FNVRgiSG7MkdQkHotrJEvxJfuMtNAP9gwPUYTmurwqCwHOqVgN5UFjfnOU7VPD6f7PP4ep6dII7q
    2. http://blog.csdn.net/tantexian/article/details/48196453
相關文章
相關標籤/搜索