原文地址: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
\RpcClient::serv('User')->handler('UserInfo')->getUserInfoById($id);
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 最初由 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