一、定義:
遠程過程調用, 也叫遠程函數調用, 最先出如今Sun公司和HP公司的運行Unix操做系統的計算機中,用於系統間通訊的一種機制.
RPC的基本通訊模型是基於Client/Server進程間相互通訊模型的一種同步通訊形式;它對Client提供了遠程服務的過程抽象,其底層消息傳遞操做對Client是透明的。在RPC中,Client便是請求服務的調用者(Caller),而Server則是執行Client的請求而被調用的程序 (Called)
二、協議及其用途:
RPC是一種大而泛的遠程調用機制,不侷限於語言,更不侷限於協議。咱們能夠認爲RMI就是一種RPC,其區別在於RMI是基於對象的,本地虛擬機中經過Stub能夠調用遠程虛擬機的對象。
不過從傳輸的數據格式來講,RPC能夠分爲基於二進制的RPC、基於XML的RPC、以及其餘諸如基於Json的RPC。
它能夠做爲web服務的一種實現方式,Web服務能夠從多層架構的關注點分離中受益。業務邏輯和數據能夠由自動客戶端和 GUI 客戶端共享。唯一的不一樣點在於客戶端的本質和中間層的表示層。此外,從數據訪問中分離業務邏輯可實現數據庫獨立性,併爲各類類型的數據存儲提供插件能力.
三、三種請求傳輸模式:
(1)同步請求-響應(Synchronous Request-Response):客戶端調用遠程程序並阻塞,直到它收到一個返回值或異常。
(2)單向 RPC(One-Way RPC):客戶端調用遠程過程,但自身不阻塞或等待直到收到一個返回值。JAX-RPC 客戶端的運行時系統可能會拋出異常。
(3)非阻塞 RPC 調用(Non-Blocking RPC Invocation):客戶端調用遠程過程,並繼續處理同一個線程的內容而不等待返回值。此後,客戶端經過阻塞來接受返回值或輪詢返回值,以此來處理遠程方法的返回。
四、應用場景:
例如,在線電子商務分類網站爲用戶提供一個瀏覽器界面,用於搜索、查看和訂購產品。若是還提供 Web 服務供公司、零售商甚至我的可以自動訂購產品,它將很是有用。能夠將其看做是構件設計思想的一種實踐,也能夠看做的是組件化設計的一種web實現方式。
五、現有的框架技術:
現有的實現框架包括sun公司的jersey、Google的Protocol Buffers、 Facebook的Thrift還有Missian框架等
Missian簡介
Missian是一個構建於Mina和Hessian基礎上的異步RPC框架,可以兼容HTTP協議和TCP協議,能和Hessian互通兼容,它提供了:
1)、一個基於mina的高性能服務器,具有mina全部的一切優秀基因。Missian服務器可以在一個端口之上兼容tcp和http協議格式,因 此開啓了Missian服務以後,便可以用Missian客戶端調用(同步/異步,HTTP/TCP),也能夠供Hessian客戶端調用。
2)、一個基於阻塞式的傳統Socket的同步客戶端,一樣支持HTTP和TCP,它可使用HTTP或TCP去訪問Missian服務,同時也能夠 使用HTTP方式去訪問Hessian服務。您能夠選擇使用短鏈接的方式,也可使用長鏈接(這時強制要求使用鏈接池,但Missian提供了一個基於 apache commons-pool的Socket鏈接池實現)。能夠根據具體狀況決定使用方式。
3)、一個基於Mina NioSocketConnector的異步客戶端。默認使用一個4個線程的線程池來處理回調,但開發者也能夠指定線程數,或者傳入一個存在的線程池。異 步客戶端只能調用Missian服務,而不可以調用Hessian服務(正在思考如何實現)。一樣,協議能夠是HTTP或者TCP。
其它相關框架的資料請自行蒐集。
六、具體框架的使用(jersey使用)
jersey支持通用的RPC請求類型,包括GET、POST等;請求參數的類型能夠進行設置,包括application/xml、application/json等常見的數據類型具體可參見MediaType枚舉類型中的類型;
1)、具體的一個get請求可使用下面的方式進行處理:web
@GET @Path ("age/{name}" ) @Produces ("text/plain" ) @Consumes (MediaType. APPLICATION_JSON) public String getAge(@PathParam ("name" ) JSONObject name) { // 返回數據信息 return name+"result" ; }
上述get請求接收的參數類型爲json類型,其餘類型的參數將沒法完成請求;數據庫
2)、具體的一個post請求可使用下面的方式進行處理:apache
@POST @Path ("testjson" ) @Consumes (MediaType. APPLICATION_JSON) @Produces ({MediaType. APPLICATION_XML, MediaType. APPLICATION_JSON}) public String getTestJson( String str) { return str + "success" ; }
上述post請求接收到的參數會自動轉換爲str這個參數
post請求可使用下面的命令進行驗證:
curl -d "{'name':'xiayy'}" -X POST http://10.16.204.31:8080/jerseyRestful/resources/helloworld/testjson -H "Content-Type: application/json"
這樣能夠成功的調用遠程請求返回值狀況。json