天天看點

RPC遠端過程調用原理及簡單執行個體

RPC 的全稱是 Remote Procedure Call 是一種程序間通信方式。

它允許程式調用另一個位址空間(通常是共享網絡的另一台機器上)的過程或函數,而不用程式員顯式編碼這個遠端調用的細節。即無論是調用本地接口/服務的還是遠端的接口/服務,本質上編寫的調用代碼基本相同。

比如兩台伺服器A,B,一個應用部署在A伺服器上,想要調用B伺服器上應用提供的函數或者方法,由于不在一個記憶體空間,不能直接調用,這時候需要通過就可以應用RPC架構的實作來解決。

(1)RESTful是一種架構設計風格,提供了設計原則和限制條件,而不是架構。而滿足這些限制條件和原則的應用程式或設計就是 RESTful架構或服務。

(2)SOAP,簡單對象通路協定是一種資料交換協定規範,

是一種輕量的、簡單的、基于XML的協定的規範。SOAP協定和HTTP協定一樣,都是底層的通信協定,隻是請求包的格式不同而已,SOAP包是XML格式的。

SOAP的消息是基于xml并封裝成了符合http協定,是以,它符合任何路由器、 防火牆或代理伺服器的要求。

soap可以使用任何語言來完成,隻要發送正确的soap請求即可,基于soap的服務可以在任何平台無需修改即可正常使用。

(3)RPC就是從一台機器(用戶端)上通過參數傳遞的方式調用另一台機器(伺服器)上的一個函數或方法(可以統稱為服務)并得到傳回的結果。

RPC 會隐藏底層的通訊細節(不需要直接處理Socket通訊或Http通訊)

RPC 是一個請求響應模型。用戶端發起請求,伺服器傳回響應(類似于Http的工作方式)

RPC 在使用形式上像調用本地函數(或方法)一樣去調用遠端的函數(或方法)。

幾種比較典型的RPC的實作和調用架構。 

(1)RMI實作,利用java.rmi包實作,基于Java遠端方法協定(Java Remote Method Protocol) 

和java的原生序列化。 

(2)Hessian,是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能。 基于HTTP協定,采用二進制編解碼。 

(3)THRIFT是一種可伸縮的跨語言服務的軟體架構。thrift允許你定義一個描述檔案,描述資料類型和服務接口。依據該檔案,編譯器友善地生成RPC用戶端和伺服器通信代碼。

(1)一個典型的RPC實作結構

RPC遠端過程調用原理及簡單執行個體

RpcServer:負責導出(export)遠端接口 

RpcClient:負責導入(import)遠端接口的代理實作 

RpcProxy:遠端接口的代理實作 

RpcInvoker:

客戶方實作:負責編碼調用資訊和發送調用請求到服務方并等待調用結果傳回 

服務方實作:負責調用服務端接口的具體實作并傳回調用結果 

RpcProtocol:負責協定編/解碼 

RpcConnector:負責維持客戶方和服務方的連接配接通道和發送資料到服務方 

RpcAcceptor:負責接收客戶方請求并傳回請求結果 

RpcProcessor:負責在服務方控制調用過程,包括管理調用線程池、逾時時間等 

RpcChannel:資料傳輸通道

(2)實作過程

RPC 服務方通過 RpcServer 去導出(export)遠端接口方法,而客戶方通過 RpcClient 去引入(import)遠端接口方法。

客戶方像調用本地方法一樣去調用遠端接口方法,RPC 架構提供接口的代理實作,實際的調用将委托給代理RpcProxy 。

代理封裝調用資訊并将調用轉交給RpcInvoker 去實際執行。

在用戶端的RpcInvoker 通過連接配接器RpcConnector 去維持與服務端的通道RpcChannel,并使用RpcProtocol 執行協定編碼(encode)并将編碼後的請求消息通過通道發送給服務方。

RPC 服務端接收器 RpcAcceptor 接收用戶端的調用請求,同樣使用RpcProtocol 執行協定解碼(decode)。

解碼後的調用資訊傳遞給RpcProcessor 去控制處理調用過程,最後再委托調用給RpcInvoker 去實際執行并傳回調用結果。

本文轉自邴越部落格園部落格,原文連結:http://www.cnblogs.com/binyue/p/3435705.html,如需轉載請自行聯系原作者