JavaGuide知識點整理——RPC原理

何為RPC?

RPC即遠程過程調(diào)用,通過名字我們就能看出RPC關注的是遠程調(diào)用而非本地調(diào)用。
為什么要RPC?因為兩個不同的服務器上的服務提供的方法不在一個內(nèi)存空間,所以需要網(wǎng)絡編程才能傳遞方法調(diào)用所需要的參數(shù)。并且方法調(diào)用的結果也需要通過網(wǎng)絡編程來接收。但是如果我們自己手動網(wǎng)絡編程來實現(xiàn)這個調(diào)用過程的話工作量是非常大的,因為我們需要考慮底層傳輸方式(TCP或者UDP),序列化方式等。
RPC能幫助我們做什么呢?簡單來說,通過RPC可以幫助我們遠程調(diào)用計算機上某個服務的方法。這個過程就像調(diào)用本地方法一樣簡單,并且我們不需要了解底層網(wǎng)絡編程的具體細節(jié)。
舉個例子:A,B兩個服務部署在不同的機器上,服務A想調(diào)用服務B的某個方法就可以通過RPC來做。
一言蔽之:RPC的出現(xiàn)就是為了讓你調(diào)用遠程方法像調(diào)用本地方法一樣簡單。

RPC的原理是什么?

我們可以將整個RPC的核心功能看作是下面5個部分的實現(xiàn):

  1. 客戶端(服務消費端):調(diào)用遠程方法的一端。
  2. 客戶端Stub(樁):這其實就是一個代理類。代理類主要做的事情很簡單,就是把你調(diào)用方法,類,方法參數(shù)等信息傳遞到服務端。
  3. 網(wǎng)絡傳輸:網(wǎng)絡傳輸就是你要把你調(diào)用的方法的信息比如說參數(shù)這些東西傳輸?shù)椒斩耍缓蠓斩藞?zhí)行完之后再把返回結果通過網(wǎng)絡傳輸給你傳輸回來。網(wǎng)絡傳輸?shù)膶崿F(xiàn)方式有很多種,比如最基本的Socket或者性能以及封裝更加優(yōu)秀的Netty.
  4. 服務端Stub(樁):這個樁就不是代理類的,實際指的就是接收到客戶端執(zhí)行方法的請求后,去指定對應的方法返回結果給客戶端的類。
  5. 服務端(服務提供端):提供遠程方法的一端。
RPC原理圖

簡單來講:

  1. 客戶端以本地調(diào)用的方式調(diào)用遠程服務。
  2. 客戶端Stub接收到調(diào)用后負責將方法,參數(shù)等組裝成能夠進行網(wǎng)絡傳輸?shù)南Ⅲw(序列化):RpcRequest
  3. 客戶端找到遠程服務的地址,并將消息發(fā)送到服務端
  4. 服務端Stub收到消息將消息反序列化成java對象。
  5. 服務端Stub根據(jù)對象中的類,方法,方法參數(shù)等信息調(diào)用本地的方法
  6. 服務端Stub等到方法的執(zhí)行結果并組裝成能夠進行網(wǎng)絡傳輸?shù)南Ⅲw,序列化后發(fā)送給客戶端
  7. 客戶端Stub收到消息并反序列化成java對象。這樣就得到了最終的結果。

有哪些常見的RPC框架?

我們這里說的RPC框架指可以讓客戶端直接調(diào)用服務端方法,就像調(diào)用本地方法一樣簡單的框架,比如下面說的Dubbo,Motan,gRPC這些。如果需要和HTTP協(xié)議打交道,解封和封裝HTTP請求和響應,這種框架并不能算RPC框架,比如Feign。

Dubbo

Apache Dubbo是一款微服務框架,為大規(guī)模微服務實踐提供高性能RPC通信,流量治理,可觀測性等解決方案,涵蓋Java,Golang等多種語言SDK實現(xiàn)。

Motan

Motan是新浪微博開源的一款RPC框架。據(jù)說在新浪微博正支撐著千億次調(diào)用。不過好像市面上很少有公司使用。
很多人喜歡拿Dubbo和Motan作比較,但是Motan更像是一個精簡版的Dubbo,可能是借鑒了Dubbo的思想,Motan的設計更加精簡,功能更加純粹。
不過不推薦實際項目中使用Motan,因為Dubbo的社區(qū)活躍度以及生態(tài)都要好得多。

gRPC

gRPC是Google開源的一個高性能,通用的RPC框架。其主要是面向移動應用開發(fā)并基于HTTP/2協(xié)議標準而設計的。基于ProtoBuf序列化協(xié)議開發(fā),并支持眾多開發(fā)語言。
何謂 ProtoBuf? 它是一種更加靈活、高效的數(shù)據(jù)格式,可用于通訊協(xié)議、數(shù)據(jù)存儲等領域,基本支持所有主流編程語言且與平臺無關。不過,通過 ProtoBuf 定義接口和數(shù)據(jù)類型還挺繁瑣的,這是一個小問題。
據(jù)說Dubbo-go 3.0主要是借鑒了gRPC。
不過gRPC的設計導致其幾乎沒有服務治理功能。如果想要解決這個問題還要依賴于其它組件。

Thrift

Apache Thrift 是 Facebook 開源的跨語言的 RPC 通信框架,目前已經(jīng)捐獻給 Apache 基金會管理,由于其跨語言特性和出色的性能,在很多互聯(lián)網(wǎng)公司得到應用,有能力的公司甚至會基于 thrift 研發(fā)一套分布式服務框架,增加諸如服務注冊、服務發(fā)現(xiàn)等功能。
Thrift支持多種不同的編程語言,包括C++、Java、Python、PHP、Ruby等(相比于 gRPC 支持的語言更多 )。

總結

gRPC和Thrift雖然支持跨語言的RPC調(diào)用,但是他們只提供了最基本的RPC框架功能,缺乏一系列配套的服務化組件和服務化治理功能的支持。
Dubbo不論是功能完善程度,生態(tài)系統(tǒng)還是社區(qū)活躍度來說都是最優(yōu)秀的。而且Dubbo在國能還有很多成功的案例,比如當當網(wǎng),滴滴等,是一款成熟穩(wěn)定的RPC框架。最重要的是參考資料多,學習成本相對低。


dubbo生態(tài)系統(tǒng)

dubbo也是Spring Cloud Alibaba里的一個組件。


image.png

但是dubbo和motan主要是給java語言使用,雖然目前能兼容部分語言,但是不太推薦,跨語言的話,可以考慮gRPC。

本篇筆記就記到這里,如果稍微幫到你了記得點個喜歡點個關注。最近這幾章側重于一些理論和現(xiàn)有的輪子,其實說有用吧,工作中幾乎用不到。但是說沒用吧,我們可以借助原理去更好的理解這個工具,而且實現(xiàn)的方式也可以開拓我們的思路。總之所學即所得,也祝大家工作順順利利!

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容