RPC是什么?為什么要學習RPC?
隨著近幾年分布式、微服務架構的火熱,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的意義是一個調用執行遠程方法的協議。我們對于方法的調用一般類似這樣
- Echo echo = 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等支持,可以比較學習這些不同的序列化實現,在自己的業務場景中有需要時,就發現你的技能工具箱中又多了一件工具。
類似的內容還有很多,學習這些都能讓我們更好的成長。
【本文為51CTO專欄作者“侯樹成”的原創稿件,轉載請通過作者微信公眾號『Tomcat那些事兒』獲取授權】