1. 程式人生 > >RPC是什麽?為什麽要學習RPC?

RPC是什麽?為什麽要學習RPC?

toc 今天 分享圖片 寫法 hash 常用 ini 部分 ima

隨著近幾年分布式、微服務架構的火熱,RPC在開發工作中使用的越來越多,也變的越來越重要。

今天我們來看RPC是什麽,為什麽要了解RPC,通過學習RPC我們能掌握什麽內容?

什麽是「RPC」

RPC 全稱 Remote Procedure Call, wikipedia的部分說明:

RPC is a request–response protocol. An RPC is initiated by the client , which sends a request message to a known remote server to execute a specified procedure with supplied parameters. The remote server sends a response to the client, and the application continues its process.

首先這裏的重點是「protocol」,其次是 RPC中的R -「Remote」。所以這裏的RPC的意義是一個調用執行遠程方法的協議。我們對於方法的調用一般類似這樣

Echoecho= child.say("Hello World");

這種一般是指調用自己本地的方法,比如 Java 應用是指調用在同一個 JVM 內的方法。

如果上述的代碼要換成我們以RPC的形式去調用,寫法有什麽區別呢?

其實是沒有的。

我們在調用時仍然按這個形式,僅需要在配置中指定這個方法對應的「遠程地址」即可。

再舉個生活化的例子。

假設你是招攬遊客的小販。每次集齊了遊客你都在賣力的吆喝,在各種神奇的網站的搜索,找對應景點的導遊。後來有一天,你和街邊多個打印店談了合作。符合條件可以導對應景點的都可以在打印店「登記」,你下次來的時候根據記錄,直接「聯系」對應的人即可,省力不少哇。

這裏我們看到兩種RPC的使用形式:

直接在配置中固定寫好遠程方法的地址,請求是一步到位

在配置中提供的「註冊處」的地址,方法請求時先到註冊處查方法地址再執行

看到這裏,你不禁要說,調用個遠程方法嘛,又不難,有啥看的。

那我們繼續這個生活化的例子。

在你集齊了遊客聯系經常合作的導遊時,他生病了。你要找誰? 你說我有「備份」嘛,登記處記錄了好多呢。

那好,這好多個導遊裏,你「選哪一個」?

你說,靠,我那管那麽多,隨便挑一個打電話就是了。好,這時你就已經在用到了RPC中的「負載均衡LoadBalance」了,只不過你的策略是用的「隨機」。

如果在導遊登記的時候每個提供了照片和歷史認證評級,那你可能不會隨便挑一個打,可能會看看照片,哪個感覺更靠譜,哪個評級更高。此時這些項都做為你聯系他的一個「權重」。在多個導遊間,這個權重決定了被聯系次數的多少。此時你的LB不再是簡單隨機,而是根據「權重」進行。

再比如你們合作多次,固定的幾個景點就是固定的幾個導遊,老相識,每次帶人來都找他。此時你的策略又變成了「一致性Hash」。

後來,有導遊和你說,最近像他們這類自找生意的導遊,被發現在主動拉生意,可能會罰款,下次聯系他的時候別說那麽多。於是你們訂了個簡單「協議」:先說「0或1」,代表是否空閑,再說「1到100」代表你們所帶遊客遊覽的景點。再說「0或1」代表是否可以帶購物。

你會發現,此時你們的協議裏有「編碼」,有壓縮,每個人在聽到對方信息時,需要再在你這裏解碼,還原成真實的信息。在 RPC 裏也一樣,在方法調用前,需要將對應的參數序列化,以指定的「格式」傳遞,到達後再對應的還原回去執行方法。

過了一段時間,你的業務發展壯大,一個景區附近的導遊們自動組隊。在你請求到達時,這個景區的導遊裏自動根據上面的權重選一個人出來,這些導遊組成的,就是一個「Cluster」

業務發展的同時,你成立了一個秘書團,這些人負責過一段時間聯系一下各個導遊組,判斷這個景區是否能提供,這個時候,秘書團就在進行「監控」。

(一口老血,編不下去了……)

接下來要說的是,我們為什麽要學習 RPC。

為什麽要學習 RPC

為什麽要學習 RPC呢? 我們開頭時也提到,微服務、分布式應用的開發越來越常見, RPC 是其中相當重要的組件。通過 RPC 的學習,可以更好的理解和進行較大型應用的設計與開發。

同時, RPC 中涉及到的各類技術,也會使學習者知識面更寬廣,每個方面,都值得深入。而對於技術,特別是源碼的學習,又會返過來促使更好的理解 RPC,你寫出更好的代碼。

學習 RPC 我們能掌握什麽

我們上面的生活化例子中,提到了這些技術

註冊處

集群

負載均衡

協議

序列化編碼、解碼

一致性Hash

監控

……

這些技術,也是 RPC 中很重要的一些內容。 我們看 Dubbo 的源碼中,從代碼的組織上,也能一窺究竟。

技術分享圖片

這張圖裏,比我們在上面例子裏提到的技術,多一些「Filter」,「Config」還有「Remoting」,包含了更完整的 RPC 的配置管理,請求過濾,多協議支持等內容。

而對 RPC 學習,例如負載均衡,除技術之外,還可以學習一種思想,是一種可遷移的東西。這種負載均衡的使用和實現,在 Nginx、Apache 做反向代理,在 應用服務器做集群搭建時,都會用的到。

像一致性Hash,對於通過 Hash思想來實現請求均衡的實現中,一致性 Hash 的思路,能更大程度的保證請求 Hash到原來的服務器上,在增減服務器時,影響減小。

再比如「註冊處」Registry 中,我們可以了解到通過 zk, redis,甚至廣播 的註冊處實現。這種註冊處的學習,可以在我們後續的微服務,分布式應用中常用的「註冊中心」提供實現的思路。

再比如 我們遠程調用時參數、信息的序列化,我們 Java 默認的序列化在性能上不能滿足 RPC 這種高頻序列化的應用場景,那有什麽好的辦法來提升序列化性能呢?

你會發現 Dubbo 中集成了 kryo,hessian2,fastjson等支持,可以比較學習這些不同的序列化實現,在自己的業務場景中有需要時,就發現你的技能工具箱中又多了一件工具。

類似的內容還有很多,學習這些都能讓我們更好的成長。

RPC是什麽?為什麽要學習RPC?