RPC框架和簡單的request - reponse的web框架有什麼區別?


RPC最重要的特點就是用起來感覺調用就在本地
RPC有兩種調用方式,
1. 同步調用 客戶方等待調用執行完成並返回結果。
2. 非同步調用 客戶方調用後不用等待執行結果返回,但依然可以通過回調通知等方式獲取返回結果。 若客戶方不關心調用返回結果,則變成單向非同步調用,單向調用不用返回結果。

非同步和同步的區分在於是否等待服務端執行完成並返回結果。
如果使用Java中的submit方法就可以實現同步調用


----------------------------------------------------------------------------------------------------------
RPC的同步調用更像在調用本地數據一樣
RPC的非同步調用更像request和response的處理,不過每次數據回來都回帶回arg參數的透傳信息


沒有區別,本質都是用的 socketapi封裝,都是走的tcp ip協議, http走http的數據封包解包協議,其餘的rpc同理也是走的對應的自己定義的私有協議,說穿了就是定義一個解析一個byte的約定。

有興趣 可以參看我寫的rpc 狗帶RPC 附上github GitHub - goudai/gd-rpc: goudai-rpc encapsulated using java the basic fundamental, minimize dependence, simple is the core idea


Web 服務應該算是 RPC 的一個子集吧,理論上 RPC 能實現的功能, 用 Web 服務也能實現,甚至很多 RPC 框架選用 HTTP 協議作為傳輸層。
現在很多網站的 API 都是以 HTTP 服務的形式提供的,這也算是 RPC 的一種形式。

區別主要在這 2 個東西設計的出發點不太一樣:

  • HTTP 是面向瀏覽器設計的應用層協議,操作的核心在資源。我們更多的用 Web 服務在做網站。
  • RPC 是為了在像在本地調用一個函數那樣調用遠程的代碼而設計的,所以更關注減少本地調用和遠程調用的差異,像 SOAP 這種東西是可以把對象當參數傳的。

我們討論 RPC 和 Web 的區別,其實是在談論 2 個東西:序列化協議和傳輸協議。序列化協議比如常見的 XML,JSON 和比較現代的 Protocol Buffers、Thrift。 傳輸協議比如 TCP、UDP 以及更高層的 HTTP 1.1、HTTP 2.0。

一般我們考慮用 RPC 而不是 HTTP 構建自己的服務,通常是考慮到下面的因素:

  • 介面是否需要 Schema 約束
  • 是否需要更高效的傳輸協議(TCP,HTTP 2.0)
  • 是否對數據包的大小非常敏感

比如 HTTP 是基於文本的協議,頭部有非常多冗餘(對於 RPC 服務而言)。HTTP 中我們用的最多就是 RESTful ,而 RESTful 是個弱 Schema 約束,大家通過文檔溝通,但是如果我就是不在實現的時候對介面文檔約定的參數做檢查,你也不能把我怎麼樣。這個時候 Thrift 這種序列化協議的優勢就體現出來了,由於 Schema 的存在,可以保證服務端接受的參數和 Schema 保持一致。


RPC 針對的是應用系統中的客戶端和伺服器端的通訊,適用的範圍比 Web 框架更廣泛。RPC 可以在 HTTP 上跑,也可以在 Socket 上跑,這個不是本質的區別。比如 andot/hprose · GitHub 就是一個跨語言跨平台的 RPC 實現,既可以在 Http 上跑,也可以在 Socket 上跑,還可以在 WebSocket 上跑。


RPC即遠程過程調用,有點遠程功能本地化的意思,而HTTP則API意味更濃。如果你的伺服器端即想被別的系統使用,也想被瀏覽器客戶端,手機端等多端使用,建議使用HTTP協議,以及REST風格的API。


只是說序列化 與反序列化的方式不同罷了


RPC即遠程過程調用,它的網路協議既可以是TCP/IP,也可以應用層的HTTP,一個功能完備的RPC框架應該除了支持一般socket通信,也支持HTTP訪問。可以參考一下baidu開源的RPC框架,網路模型設計的很巧妙,代碼質量比較高。GitHub - baidu/sofa-pbrpc: A light-weight RPC implement of google protobuf RPC framework.


web框架是http,RPC是socket


RPC框架一般是用socket編程tcp實現,web框架就是通過http協議咯。應用場景也不同。web框架應該更多用在web項目的開發。
自己寫RPC的話,體積可以比較小,更靈活一些,也不用搭個web環境;RPC使用起來也方便一些,用起來感覺調用就在本地。缺點可能是對程序員的水平要求比高。


推薦閱讀:

JVM 常量池中存儲的是對象還是引用呢?
jvm內存回收詭異現象,求解?
JVM的JIT優化所帶來的性能提升與C++之類比較那個好?
想做軟體開發,學哪種語言比較好?
聽說過面向工資編程嗎?面向工資編程是怎樣一種體驗?

TAG:程序員 | Java | 計算機網路 | JavaWeb | 遠程過程調用協議RPCRemoteProcedureCallProtocol |