1. 程式人生 > >RPC (遠端過程呼叫)

RPC (遠端過程呼叫)

1、簡單元件介紹:

以Dubbo為例
這裡寫圖片描述
RPC中可以認為有四個角色,消費者(Consumer),提供者(Provider),註冊中心(Registry),監控中心(Monitor),這個還是很好理解的,以前在同一系統的方法的呼叫者因為網路的存在,變成了消費者,被調的方法成了提供者。

同樣註冊中心Registry的存在,其實就是為了讓消費者實時的去感知提供者的存在,去告訴消費者它對應的提供者的地址。

Monitor顧名思義,監控者,其實在整個過程中,它並不是一定要存在,只是它可以做統計,做一些資料分析,提供整個系統的可用性,健壯性。

好了,我們先簡單分析一下Registry / Consumer / Provider / Monitor 這四個角色的定義和每個角色如何各司其職,相互協作完成這整個過程的。

分析時,分成兩個方面,一是每個角色在網路的定位,二是每個角色所要完成的職責

1)Registry註冊中心

簡述:
①註冊中心可以有多個,都是無狀態的,每個註冊中心之間資訊不互動
②從網路的角度來說,它都是server端,它不需要主動地連線其他的任何例項,只需要像一個地主一樣等待別人來連線
③消費者隨機選擇註冊中心叢集中的任何例項建立長連線,提供者與註冊中心中的每一個例項都建立長連線

職責:
①接收服務提供者的服務註冊資訊,接收到資訊之後,傳送ACK資訊給服務提供者,否則服務提供者重新發送註冊資訊
②接收消費者的訂閱資訊,並把它訂閱的結果返回給消費者
③如果註冊資訊變更,會主動通知訂閱變更資訊的消費者,註冊資訊的變更包括服務提供者下線,服務被人工降級,或者服務提供者的地址變更
④持久化一些服務資訊,例如某些服務管理員稽核過了,則該服務重新註冊後則不需要再稽核,再例如,某個服務負載均衡的策略被管理員設定為輪詢,那麼下次它在註冊的時候,則就是輪詢,而不是預設的負載策略

2)Provider提供者

簡述:
①提供者是一個精神分裂的病人,它在網路上(可以更加明確地說是站在Netty的角度上)飾演兩個角色:
1)一是它是客戶端,需要去連線Registry,傳送註冊資訊,它也需要去連線monitor端,去傳送一些呼叫的統計資訊
2)二是它也是服務端,需要作為server端等待Consumer去連線,連線成功後呼叫服務

職責:
①將自己的資訊,提供的介面資訊編織成註冊資訊傳送給registry端
②能夠動態去調自己的方法,可以通過反射,cglib等一些方法去呼叫自己提供的那些方法
③提供服務降級等服務,如果當某些服務呼叫的失敗率高於限定值的時候,可以有一個對應的mock方法,提供降級服務
④限流服務,限流的方式有很多種,也有很多實現方式,最簡單的就是控制呼叫次數,比如100w次,其實簡單的就是控制單位時間的呼叫次數,防止業務洪流沖垮服務
⑤統計活動,將一些呼叫資訊統計好傳送給Monitor端
⑥補充……

3)Consumer消費者

簡述:
①它也是有兩個網路角色,不過並不是精神分裂,它都是作為網路的客戶端存在,一它需要去連線registry去獲取到訂閱資訊,二是它需要主動去連線provider端去呼叫服務

職責:
①去向Registry端訂閱服務,拿到registry端返回的結果,這個結果也就是provider的網路地址,先建立TCP的長連線,可能是多個地址,因為提供某個服務的可能有多個提供者
②當開始系統主動呼叫該服務的時候,拿到剛才建立的連線的集合,根據某個方法,是隨意還是輪詢,獲取到其中的一個連線,傳送方法入參,等待響應
③當註冊中心傳送某個服務的呼叫的負載策略發生變化過,傳送資訊給consumer,consumer需要做相應的變更

4)Monitor監控者

簡述
①這個與整個系統是沒有任何直接的關係的,實現方式也是多樣的,可以與上面一樣建立長連線,接收每個角色統計的資訊,然後展示給使用者,可以使用MQ,使用訊息佇列,每個角色把自己統計的資訊放到佇列中,Monitor去消費這些資訊,這樣做的好處就是解耦,如果monitor宕了,不影響服務

2、簡單RPC實現:

直接看原文吧,不搬了~