這篇文章給大家介紹RPC框架的底層是什么原理,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
成都創(chuàng)新互聯(lián)公司2013年至今,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目網(wǎng)站建設、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元王益做網(wǎng)站,已為上家服務,為王益各地企業(yè)和個人服務,聯(lián)系電話:18980820575
RPC(Remote Procedure Call)–遠程過程調用,通過網(wǎng)絡通信調用不同的服務,共同支撐一個軟件系統(tǒng),微服務實現(xiàn)的基石技術。
使用RPC可以解耦系統(tǒng),方便維護,同時增加系統(tǒng)處理請求的能力。
上面是一個簡單的軟件系統(tǒng)結構,我們拆分出來用戶系統(tǒng)和訂單系統(tǒng)做為服務存在,讓不同的站點去調用。
只需要引入各個服務的接口包,在代碼中調用RPC服務就跟調用本地方法一樣,我剛接觸到這種調用方式的時候頗為驚奇,我明明調用的就是java語言方法啊(已java為例,現(xiàn)在RPC框架一般都支持多語言),怎么就調用了遠程的服務了呢??
最近自己寫了一個簡單的RPC框架KRPC,原理分析結合中代碼,均為該框架源碼。
2.1 流程縱覽
如上圖所示,我將一個RPC調用流程概括為上圖中5個流程,左邊3個為客戶端流程,右邊兩個為服務端流程。
下面就各流程進行解析
服務調用方在調用服務時,一般進行相關初始化,通過配置文件/配置中心 獲取服務端地址用戶調用。
// 用戶服務接口public interface UserService { public User genericUser(Integer id,String name,Long phone);}//調用方//服務初始化KRPC.init("D:\\krpc\\service\\demo\\conf\\client.
一開始接觸RPC調用方法肯定就有疑惑,它不是一個接口嗎,直接調用應該沒啥效果啊,我也沒有引入實現(xiàn)包。
帶著這個疑惑,我們就進入下一個知識點,動態(tài)代理。
2.3 動態(tài)代理
動態(tài)代理這東西意如其名,它代理你幫你做事情,動態(tài)代理看這篇文章《詳解 Java 中的三種代理模式》。
上面我們不說道直接調用一個接口中的方法,并且沒有用該接口的實現(xiàn)類調用,那么方法是怎么生效的呢?
可以看到這個用戶服務這個service是由ProxyFactory代理工程創(chuàng)造的,在該ProxyFactory#create()方法中就跟一個代理處理器綁定在一起了。
@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //構造請求request Request request = new Request(); .... return RequestHandler.request(serviceName, request,returnClass);}
這個類實現(xiàn)了InvocationHandler接口(JDK提供的動態(tài)代理技術),每次去調用接口方法,最終都交由該handler進行處理。
這個環(huán)節(jié)一般會獲取方法的一些信息,例如方法名,方法參數(shù)類型,方法參數(shù)值,返回對象類型。
同時這個環(huán)節(jié)會提供序列化功能,一般的RPC網(wǎng)絡傳輸使用TCP(哪怕使用HTTP)傳輸,這里也要將這些參數(shù)進行封裝成我們定義的數(shù)據(jù)接口進行傳輸。
2.4 網(wǎng)絡傳輸
我們通過將方法參數(shù)進行處理后,就要使用發(fā)起網(wǎng)絡請求,使用tcp傳輸?shù)木屠胹ocket通信進行傳輸,這一塊我開源項目中使用的同步堵塞的方案進行請求,也可以使用一些非堵塞方案進行請求,效率會更高一些。
關于RPC框架的底層是什么原理就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。