在國企干了 5 年 Java,居然不知道 RPC?這正常嗎?
在國企干了 5 年 Java,居然不知道 RPC 是什么?這正常嗎?
這很正常。
如果你沒接觸過分布式微服務項目,基本是接觸不到 RPC 這玩意的,并不是個人能力的問題。
不過 RPC 是程序員需要掌握的知識,也是面試官可能會問的題目。
什么是 RPC?RPC 和 HTTP 有什么區別?
下面用 2 分鐘給大家講清楚!
什么是 RPC?
你餓了,想吃魚皮。

如果是在 20 年前,你只能自己吭哧吭哧跑到店里去買。

但現在有了手機、網絡和外賣平臺,你只需要在家動動手指點個外賣,騎手就能直接把魚皮配送到家。

你不需要關注網絡是怎么傳輸的、平臺是怎么操作的、騎手是怎么配送的,只負責享受鮮嫩多汁、絲滑爽口的魚皮就行了。

這個過程其實就是 RPC 的核心思想。
RPC 的全稱是遠程過程調用(Remote Procedure Call),允許一個項目 像調用自己本地的方法一樣,調用另一個遠程項目的接口,而不需要了解數據的傳輸處理過程和底層網絡通信的細節。

舉個例子,項目 A 提供了點餐服務,項目 B 想要調用它完成下單。
如果沒有 RPC 框架,項目 B 作為服務消費者,需要找到項目 A 的地址、自己構造請求參數、給項目 A 發送請求并解析響應結果。

如果項目 B 要調用很多第三方服務,每個都這么寫,是不是很麻煩?

但如果使用 RPC 框架,只需要一行代碼就能完成調用!

看起來就跟調用自己項目內的方法沒有任何區別!是不是很絲滑?
這就是 RPC 框架的作用,隱藏了服務調用的通信細節,讓程序員專注于業務邏輯,快速開發分布式、微服務系統。
RPC 和 HTTP 的區別?
有同學會問了:“HTTP 協議不也能請求別的服務么,RPC 跟 HTTP 有什么區別呢?”
首先,HTTP 是一種網絡通信協議,而 RPC 是一種 “遠程調用本地化” 的思想,就像我想吃飯的時候,點外賣找個騎手幫我送,至于騎手是誰、從哪找到騎手、騎手是開車還是騎電動車,可以有不同的選擇。

因此,RPC 完全可以 基于 HTTP 協議來實現數據的傳輸,只不過主流的 RPC 實現更多的使用基于 TCP 的二進制格式,傳輸的數據更緊湊,傳輸效率也更高。

一般來說,HTTP 適用于前端和后端的交互、對外 提供 的 RESTful API 服務;而 RPC 更適合分布式系統的服務間的 內部 通信。

除了數據傳輸外,RPC 的實現一般還需要依賴注冊中心、序列化器、負載均衡、重試容錯機制等等。
-
注冊中心:就像服務的通訊錄,記錄著各個服務在哪臺機器上,消費者想找服務時查一下就能知道地址。
-
序列化器:相當于數據翻譯官,把內存里的對象轉換成能在網絡上傳輸的格式(比如二進制),到了對方那里再翻譯回去,確保雙邊都能看懂。
-
負載均衡:就像調度員,當多個機器都提供同一個服務時,它來決定把請求發給哪臺機器,避免有的機器累死,有的機器閑著。
-
重試容錯機制:備用方案,調用服務失敗時會自動重試幾次(比如網絡卡了、宕機了),如果一直失敗就用其他方法(比如返回緩存數據),不讓整個系統因為一個小故障就崩潰。

完整的 RPC 框架工作流程:

服務消費者和提供者都需要引入 RPC 框架:

有哪些 RPC 框架?
聽起來想實現 RPC 很復雜啊!
但別擔心,市面上有很多強大的 RPC 框架,比如 gRPC、Dubbo、Thrift、OpenFeign 等,幾乎可以滿足我們對 RPC 的一切需求。

你們更喜歡用哪個框架呢?
個人建議,對于 Java 開發者來說,首選 Dubbo。
開源項目
我之前帶大家手寫過一套
開源倉庫:https://github.com/liyupi/yu-rpc

OK 以上就是本期分享,還有疑問的話歡迎大家在評論區留言,沒疑問的話求個點贊三連 ????????????????


什么是 RPC?RPC 和 HTTP 有什么區別?用 2 分鐘給大家講清楚!
浙公網安備 33010602011771號