遠程調用包括遠程過程調用(RPC)和遠程方法調用(RMI)html
請求-應答協議描述了一個基於消息傳遞的範型,支持消息雙向傳輸。git
涉及三個通訊原語
(1)doOperation:向指定的服務器發送請求消息。
(2)getRequest:遠程服務器獲取客戶端的請求。
(3)sendReply:發送應答消息給客戶端。github
有三種方式保證doOperation的可靠傳輸:
(1)重發請求消息:一直重發消息直到保證收到請求結果或者認定服務器故障。
(2)過濾重複請求:在服務器過濾掉重複的請求。
(3)保存重傳歷史:在服務器保存消息結果,相同的請求直接返回結果。編程
RPC調用語義
調用語義 | 重發請求消息 | 過濾請求消息 | 從新執行或者重傳消息應答 |
---|---|---|---|
或許(0次或一次) | 否 | 不適用 | 不適用 |
最多一次 | 是 | 是 | 重傳消息應答 |
最少一次 | 是 | 否 | 從新執行 |
RPC(Remote Procedure Call)容許客戶端程序能夠調用不一樣於客戶端的計算機的服務器程序的進程。json
RPC調用過程
圖片來源:https://www.cs.rutgers.edu/~p...服務器
解釋下調用的過程:
(1)客戶端(client functions)調用了一個客戶端代理(client stub)。
(2)客戶端將傳輸的對象參數序列化爲二進制,調用客戶端socket進行通訊。
(3)客戶端socket將參數經過網絡傳遞給服務端socket。
(4)服務端socket將接收到的參數交給服務端代理(server stub)。
(5)服務端代理將接收到的參數反序列化爲對象,而後調用服務端(server functions)真正的方法。
(6)服務端將方法調用的結果返回給服務端代理。
(7)服務端代理將調用結果進行序列化,傳遞給服務端socket。
(8)服務端socket接收到二進制的調用結果以後,經過網絡傳輸給客戶端socket。
(9)客戶端socket將調用結果傳遞給客戶端代理。
(10)客戶端代理將調用結果反序列化傳遞給客戶端。網絡
http請求是基於HTTP協議,適用於不用企業間的方法調用,http請求是低效的,由於每次都須要創建一個鏈接。RPC適用於企業內部系統之間的調用,RPC能夠基於TCP協議,也能夠基於HTTP2協議。Dubbo等框架實現了RPC。可使用XML、JSON、Fastjson、Thrift、Avro、Protobuf或是其它進行消息的序列化。框架
多個消息在一個TCP鏈接上傳輸時,TCP會將發送的大消息用多個數據包發送,將發送的小消息合併爲一個數據包發送。當多個消息用一個數據包發送時,可使用文本分割法或長度前綴法獲得一個完整的消息。socket
參考資料:
https://blog.csdn.net/baiye_x...
http://www.360doc.com/content...
https://github.com/hzy38324/s...
https://www.zhihu.com/search?...
《分佈式系統概念與設計》
https://blog.51cto.com/zero01...
http://www.cnblogs.com/zhuxia...分佈式
RMI容許一個進程對象的方法能夠調用另外一個進程對象的方法。無論是否需在同一計算機內,只要是不一樣進程對象的之間的方法調用就是遠程方法調用,而同一進程的方法調用就是本地方法調用。
(1)通訊模塊:兩個相互協做的通訊模塊執行請求-應答協議,在客戶端和服務器之間傳遞請求和應答消息。
(2)遠程引用模塊:負責在本地對象引用和遠程對象引用之間進行翻譯。每一個進程的遠程引用模塊都會維護一個遠程對象表,該表記錄了該進程的本地對象引用和遠程對象引用的對應關係。
(3)伺服器:提供遠程對象主體的類的實例。
好久之前本身在csdn上寫過的一篇關於RMI的文章:
https://blog.csdn.net/u012734...
其餘參考資料:
https://blog.csdn.net/mawanli...
https://www.cnblogs.com/nashi...
《分佈式系統概念與設計》
(1)RPC和RMI都支持接口編程。(2)RPC和RMI都是基於請求-應答協議,並支持最多一次、最少一次等調用語義。(3)RPC和RMI的輸入輸出參數均可以是值。而RMI支持輸入輸出參數是對象引用。