寫在前面
PRC 是一種技術的代名詞,HTTP 是一種協定, RPC 可以通過 HTTP 來實作,也可以通過 Socket 自己實作一套協定來實作。是以談論為什麼用 RPC 不用 HTTP 是無意義的。
是以為什麼要用rpc調用?
因為良好的 rpc 調用是面向服務的封裝,針對服務的可用性和效率等都做了優化。單純使用 http 調用則缺少了這些特性。
RPC
調用過程 原理:socket + 動态代理 優點調用簡單,清晰,透明,不用像 rest 一樣複雜,就像調用本地方法一樣簡單
高效低延遲,性能高
自定義協定(讓傳輸封包提及更小)
性能消耗低,高效的序列化協定可以支援高效的二進制傳輸
自帶負載均衡
缺點- 耦合性強
引用其他人的總結:
我們為每個微服務定義了各自的 service 抽象接口,并通過持續內建釋出到私有倉庫中,調用方應用對微服務提供的抽象接口存在強依賴關系,是以不論開發、測試、內建環境都需要嚴格的管理版本依賴,才不會出現服務方與調用方的不一緻導緻應用無法編譯成功等一系列問題,以及這也會直接影響本地開發的環境要求,往往一個依賴很多服務的上層應用,每天都要更新很多代碼并 install 之後才能進行後續的開發。若沒有嚴格的版本管理制度或開發一些自動化工具,這樣的依賴關系會成為開發團隊的一大噩夢。
而 REST 接口相比 RPC 更為輕量化,服務提供方和調用方的依賴隻是依靠一紙契約,不存在代碼級别的強依賴,當然 REST 接口也有痛點,因為接口定義過輕,很容易導緻定義文檔與實際實作不一緻導緻服務內建時的問題,但是該問題很好解決,隻需要通過每個服務整合swagger,讓每個服務的代碼與文檔一體化,就能解決。是以在分布式環境下,REST 方式的服務依賴要比 RPC 方式的依賴更為靈活。
2. 無法跨語言,平台敏感
Java 寫的 RPC 微服務無法給 Python 調用。需要再實作一層 REST 來對外提供服務
REST
這裡就指 HTTP 調用了
優點耦合性低,相容性好,提高開發效率
不用關心接口實作細節,相對更規範,更标準,更通用,跨語言支援
缺點性能不如 RPC 高
選擇
RPC 适用于内網服務調用,對外提供服務請走 REST。
IO 密集的服務調用用 RPC,低頻服務用 REST
服務調用過于密集與複雜,RPC 就比較适用