遠端呼叫
遠端呼叫包括遠端過程呼叫(RPC)和遠端方法呼叫(RMI)
1.請求-應答協議
請求-應答協議描述了一個基於訊息傳遞的範型,支援訊息雙向傳輸。
涉及三個通訊原語
(1)doOperation:向指定的伺服器傳送請求訊息。
(2)getRequest:遠端伺服器獲取客戶端的請求。
(3)sendReply:傳送應答訊息給客戶端。
有三種方式保證doOperation的可靠傳輸:
(1)重發請求訊息:一直重發訊息直到保證收到請求結果或者認定伺服器故障。
(2)過濾重複請求:在伺服器過濾掉重複的請求。
(3)儲存重傳歷史:在伺服器儲存訊息結果,相同的請求直接返回結果。
RPC呼叫語義
呼叫語義 | 重發請求訊息 | 過濾請求訊息 | 重新執行或者重傳訊息應答 |
---|---|---|---|
或許(0次或一次) | 否 | 不適用 | 不適用 |
最多一次 | 是 | 是 | 重傳訊息應答 |
最少一次 | 是 | 否 | 重新執行 |
2.遠端過程呼叫(RPC)
RPC(Remote Procedure Call)允許客戶端程式可以呼叫不同於客戶端的計算機的伺服器程式的程序。
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會將傳送的大訊息用多個數據包傳送,將傳送的小訊息合併為一個數據包傳送。當多個訊息用一個數據包傳送時,可以使用文字分割法或長度字首法得到一個完整的訊息。
- 文字分割法:每個完整的訊息之後,新增一個分隔符,根據之前的分隔符判斷之前的文字是不是同一個訊息。
- 長度字首法:在訊息開頭新增傳輸的訊息長度。
參考資料:
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...3.遠端方法呼叫(RMI)
RMI允許一個程序物件的方法可以呼叫另一個程序物件的方法。不管是否需在同一計算機內,只要是不同程序物件的之間的方法呼叫就是遠端方法呼叫,而同一程序的方法呼叫就是本地方法呼叫。
(1)通訊模組:兩個相互協作的通訊模組執行請求-應答協議,在客戶端和伺服器之間傳遞請求和應答訊息。
(2)遠端引用模組:負責在本地物件引用和遠端物件引用之間進行翻譯。每個程序的遠端引用模組都會維護一個遠端物件表,該表記錄了該程序的本地物件引用和遠端物件引用的對應關係。
(3)伺服器:提供遠端物件主體的類的例項。
很久以前自己在csdn上寫過的一篇關於RMI的文章:
https://blog.csdn.net/u012734...其他參考資料:
https://blog.csdn.net/mawanli...
https://www.cnblogs.com/nashi...
《分散式系統概念與設計》
4.RPC和RMI的聯絡和區別
(1)RPC和RMI都支援介面程式設計。
(2)RPC和RMI都是基於請求-應答協議,並支援最多一次、最少一次等呼叫語義。
(3)RPC和RMI的輸入輸出引數都可以是值。而RMI支援輸入輸出引數是物件引用。