天天看點

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的意義是一個調用執行遠端方法的協定。我們對于方法的調用一般類似這樣

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 的源碼中,從代碼的組織上,也能一窺究竟。

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

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

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

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

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

再比如 我們遠端調用時參數、資訊的序列化,我們 Java 預設的序列化在性能上不能滿足 RPC 這種高頻序列化的應用場景,那有什麼好的辦法來提升序列化性能呢?

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

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

歡迎工作一到五年的Java工程師朋友們加入Java架構開發:860113481

群内提供免費的Java架構學習資料(裡面有高可用、高并發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!