一篇文章瞭解RPC框架原理

1.RPC框架的概念

RPC(Remote Procedure Call)–遠程過程調用,經過網絡通訊調用不一樣的服務,共同支撐一個軟件系統,微服務實現的基石技術。使用RPC能夠解耦系統,方便維護,同時增長系統處理請求的能力。java

clipboard.png

上面是一個簡單的軟件系統結構,咱們拆分出來用戶系統和訂單系統作爲服務存在,讓不一樣的站點去調用。git

只須要引入各個服務的接口包,在代碼中調用RPC服務就跟調用本地方法同樣,我剛接觸到這種調用方式的時候頗爲驚奇,我明明調用的就是java語言方法啊(已java爲例,如今RPC框架通常都支持多語言),怎麼就調用了遠程的服務了呢??github

2.RPC框架的原理解析

最近本身寫了一個簡單的RPC框架KRPC,本文原理分析結合中代碼,均爲該框架源碼 https://github.com/yangzhenku...tomcat

2.1 流程縱覽性能優化

clipboard.png

如上圖所示,我將一個RPC調用流程歸納爲上圖中5個流程,左邊3個爲客戶端流程,右邊兩個爲服務端流程。
下面就各流程進行解析微信

2.2 客戶端調用網絡

服務調用方在調用服務時,通常進行相關初始化,經過配置文件/配置中心 獲取服務端地址
用戶調用:架構

clipboard.png

一開始接觸RPC調用方法確定就有疑惑,它不是一個接口嗎,直接調用應該沒啥效果啊,我也沒有引入實現包。併發

帶着這個疑惑,咱們就進入下一個知識點,動態代理框架

2.3動態代理

動態代理這東西意如其名,它代理你幫你作事情。
上面咱們不說道直接調用一個接口中的方法,而且沒有用該接口的實現類調用,那麼方法是怎麼生效的呢?

能夠看到這個用戶服務這個service是由ProxyFactory代理工程創造的,在該ProxyFactory#create()方法中就跟一個代理處理器綁定在一塊兒了

clipboard.png

這個類實現了InvocationHandler接口(JDK提供的動態代理技術),每次去調用接口方法,最終都交由該handler進行處理。
這個環節通常會獲取方法的一些信息,例如方法名,方法參數類型,方法參數值,返回對象類型。

同時這個環節會提供序列化功能,通常的RPC網絡傳輸使用TCP(哪怕使用HTTP)傳輸,這裏也要將這些參數進行封裝成咱們定義的數據接口進行傳輸。

2.4網絡傳輸

咱們經過將方法參數進行處理後,就要使用發起網絡請求,使用tcp傳輸的就利用socket通訊進行傳輸,這一塊我開源項目中使用的同步堵塞的方案進行請求,也可使用一些非堵塞方案進行請求,效率會更高一些。

2.5服務端數據接受

這一塊使用netty,能夠快速一個高性能、高可靠的一個服務端。

clipboard.png

上面代碼是我項目中使用的服務端代碼。關於netty網上學習的資料不少,這裏也只是宏觀的講解RPC原理,就不展開。

2.6真實調用

服務端獲取客戶端請求的數據後, 調用請求中的方法,方法參數值,經過反射調用真實的方法,獲取其返回值,將其序列化封裝,經過netty進行數據返回,客戶端在接受數據並解析,這就完成了一次rpc請求調用的全過程。

clipboard.png

上面代碼片斷爲經過反射調用真實方法

2.7 服務端的動態加載

經過2.2到2.6的說明,一次RPC請求過程大體如此,可是一個RPC框架會有不少細節須要處理。

其實在一次請求調用前,服務端確定要先啓動。

服務端做爲一個容器,跟咱們熟知的tomcat同樣,它能夠動態的加載任何項目。因此在服務端啓動的時候,必需要進行一個動態加載的過程。在KRPC中,我使用了URLClassLoader動態加載一個指定路徑的jar包,任何業務服務的實現所依賴的jar包均可以放入該路徑中。

在此我向你們推薦一個架構學習交流羣。交流學習羣號:575745314 裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構等這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

3.總結

一個RPC框架大體須要動態代理、序列化、網絡請求、網絡請求接受(netty實現)、動態加載、反射這些知識點。如今開源及各公司本身造的RPC框架層出不窮,惟有掌握原理是一勞永逸的。掌握原理最好的方法莫不是閱讀源碼,本身動手寫是最快的。

注:原文出處爲:微信公衆號 JAVA爛豬皮 做者:喬治

相關文章
相關標籤/搜索