版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 RPC 框架原理介紹目 錄 TOC o 1-3 h z u HYPERLINK l _Toc535521384 1. RPC框架的概念 PAGEREF _Toc535521384 h 3 HYPERLINK l _Toc535521385 2. RPC框架的原理解析 PAGEREF _Toc535521385 h 4 HYPERLINK l _Toc535521386 2.1 流程縱覽 PAGEREF _Toc535521386 h 4 HYPERLINK l _Toc535521387 2.2 客戶端調(diào)用 PAGEREF _Toc535521387 h 5 HYPERLINK l _Toc
2、535521388 2.3 動(dòng)態(tài)代理 PAGEREF _Toc535521388 h 5 HYPERLINK l _Toc535521389 2.4 網(wǎng)絡(luò)傳輸 PAGEREF _Toc535521389 h 6 HYPERLINK l _Toc535521390 2.5 服務(wù)端數(shù)據(jù)接受 PAGEREF _Toc535521390 h 7 HYPERLINK l _Toc535521391 2.6 真實(shí)調(diào)用 PAGEREF _Toc535521391 h 8 HYPERLINK l _Toc535521392 2.7 服務(wù)端的動(dòng)態(tài)加載 PAGEREF _Toc535521392 h 8 HYPE
3、RLINK l _Toc535521393 3. 總結(jié) PAGEREF _Toc535521393 h 91. RPC框架的概念RPC(Remote Procedure Call)遠(yuǎn)程過(guò)程調(diào)用,通過(guò)網(wǎng)絡(luò)通信調(diào)用不同的服務(wù),共同支撐一個(gè)軟件系統(tǒng),微服務(wù)實(shí)現(xiàn)的基石技術(shù)。使用RPC可以解耦系統(tǒng),方便維護(hù),同時(shí)增加系統(tǒng)處理請(qǐng)求的能力。這里寫(xiě)圖片描述上面是一個(gè)簡(jiǎn)單的軟件系統(tǒng)結(jié)構(gòu),我們拆分出來(lái)用戶系統(tǒng)和訂單系統(tǒng)做為服務(wù)存在,讓不同的站點(diǎn)去調(diào)用。只需要引入各個(gè)服務(wù)的接口包,在代碼中調(diào)用RPC服務(wù)就跟調(diào)用本地方法一樣,我剛接觸到這種調(diào)用方式的時(shí)候頗為驚奇,我明明調(diào)用的就是java語(yǔ)言方法?。ㄒ裫ava為例,現(xiàn)
4、在RPC框架一般都支持多語(yǔ)言),怎么就調(diào)用了遠(yuǎn)程的服務(wù)了呢?2. RPC框架的原理解析最近自己寫(xiě)了一個(gè)簡(jiǎn)單的RPC框架KRPC,本文原理分析結(jié)合中代碼,均為該框架源碼2.1 流程縱覽這里寫(xiě)圖片描述如上圖所示,我將一個(gè)RPC調(diào)用流程概括為上圖中5個(gè)流程,左邊3個(gè)為客戶端流程,右邊兩個(gè)為服務(wù)端流程。下面就各流程進(jìn)行解析2.2 客戶端調(diào)用服務(wù)調(diào)用方在調(diào)用服務(wù)時(shí),一般進(jìn)行相關(guān)初始化,通過(guò)配置文件/配置中心 獲取服務(wù)端地址用戶調(diào)用:/用戶服務(wù)接口publicinterfaceUserServicepublicUsergenericUser(Integerid,Stringname,Longphone);
5、/調(diào)用方/服務(wù)初始化KRPC.init(D:krpcservicedemoconfclient.xml);UserServiceservice=ProxyFactory.create(UserService.class,demo,demoService);Useruser=service.genericUser(1,yasin,1888888888L);一開(kāi)始接觸RPC調(diào)用方法肯定就有疑惑,它不是一個(gè)接口嗎,直接調(diào)用應(yīng)該沒(méi)啥效果啊,我也沒(méi)有引入實(shí)現(xiàn)包。帶著這個(gè)疑惑,我們就進(jìn)入下一個(gè)知識(shí)點(diǎn),動(dòng)態(tài)代理2.3 動(dòng)態(tài)代理動(dòng)態(tài)代理這東西意如其名,它代理你幫你做事情。上面我們不說(shuō)道直接調(diào)用一個(gè)接口中的方法
6、,并且沒(méi)有用該接口的實(shí)現(xiàn)類(lèi)調(diào)用,那么方法是怎么生效的呢?可以看到這個(gè)用戶服務(wù)這個(gè)service是由ProxyFactory代理工程創(chuàng)造的,在該P(yáng)roxyFactory#create()方法中就跟一個(gè)代理處理器綁定在一起了OverridepublicObjectinvoke(Objectproxy,Methodmethod,Objectargs)throwsThrowable/構(gòu)造請(qǐng)求requestRequestrequest=newRequest();returnRequestHandler.request(serviceName,request,returnClass);這個(gè)類(lèi)實(shí)現(xiàn)了Invo
7、cationHandler接口(JDK提供的動(dòng)態(tài)代理技術(shù)),每次去調(diào)用接口方法,最終都交由該handler進(jìn)行處理。這個(gè)環(huán)節(jié)一般會(huì)獲取方法的一些信息,例如方法名,方法參數(shù)類(lèi)型,方法參數(shù)值,返回對(duì)象類(lèi)型。同時(shí)這個(gè)環(huán)節(jié)會(huì)提供序列化功能,一般的RPC網(wǎng)絡(luò)傳輸使用TCP(哪怕使用HTTP)傳輸,這里也要將這些參數(shù)進(jìn)行封裝成我們定義的數(shù)據(jù)接口進(jìn)行傳輸。2.4 網(wǎng)絡(luò)傳輸我們通過(guò)將方法參數(shù)進(jìn)行處理后,就要使用發(fā)起網(wǎng)絡(luò)請(qǐng)求,使用tcp傳輸?shù)木屠胹ocket通信進(jìn)行傳輸,這一塊我開(kāi)源項(xiàng)目中使用的同步堵塞的方案進(jìn)行請(qǐng)求,也可以使用一些非堵塞方案進(jìn)行請(qǐng)求,效率會(huì)更高一些。2.5 服務(wù)端數(shù)據(jù)接受這一塊使用netty
8、,可以快速一個(gè)高性能、高可靠的一個(gè)服務(wù)端。publicclassServerHandlerextendsChannelInboundHandlerAdapterOverridepublicvoidchannelRead(ChannelHandlerContextctx,Objectmsg)throwsExceptionByteBufbuf=(ByteBuf)msg;bytebytes=newbytebuf.readableBytes();buf.readBytes(bytes);byteresponseBytes=RequestHandler.handler(bytes);ByteBufres
9、buf=ctx.alloc().buffer(responseBytes.length);resbuf.writeBytes(responseBytes);ctx.writeAndFlush(resbuf);OverridepublicvoidexceptionCaught(ChannelHandlerContextctx,Throwablecause)throwsExceptioncause.printStackTrace();ctx.close();上面代碼是我項(xiàng)目中使用的服務(wù)端代碼。關(guān)于netty網(wǎng)上學(xué)習(xí)的資料很多,這里也只是宏觀的講解RPC原理,就不展開(kāi)。2.6 真實(shí)調(diào)用服務(wù)端獲取客戶
10、端請(qǐng)求的數(shù)據(jù)后, 調(diào)用請(qǐng)求中的方法,方法參數(shù)值,通過(guò)反射調(diào)用真實(shí)的方法,獲取其返回值,將其序列化封裝,通過(guò)netty進(jìn)行數(shù)據(jù)返回,客戶端在接受數(shù)據(jù)并解析,這就完成了一次rpc請(qǐng)求調(diào)用的全過(guò)程。method=clazz.getMethod(request.getMethodName(),requestParamTypes);method.setAccessible(true);result=method.invoke(service,requestParmsValues)123上面代碼片段為通過(guò)反射調(diào)用真實(shí)方法2.7 服務(wù)端的動(dòng)態(tài)加載通過(guò)2.2到2.6的說(shuō)明,一次RPC請(qǐng)求過(guò)程大致如此,但是一個(gè)RPC框架會(huì)有很多細(xì)節(jié)需要處理。其實(shí)在一次請(qǐng)求調(diào)用前,服務(wù)端肯定要先啟動(dòng)。服務(wù)端作為一個(gè)容器,跟我們熟知的tomcat一樣,它可以動(dòng)態(tài)的加載任何項(xiàng)目。所以在服務(wù)端啟動(dòng)的時(shí)候,必須要進(jìn)行一個(gè)動(dòng)態(tài)加載的過(guò)程。在KRPC中,我使用了URLClassLoader
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)業(yè)科技創(chuàng)新應(yīng)用示范方案
- 房產(chǎn)交易代理服務(wù)協(xié)議2024年
- 2024室內(nèi)裝修正規(guī)合同書(shū)
- 2024國(guó)有土地使用權(quán)合同廣州市國(guó)有土地使用權(quán)轉(zhuǎn)讓合同(公開(kāi)交易方式)
- 2024電路租賃合同模板
- 城市配送系統(tǒng)應(yīng)對(duì)疫情的應(yīng)急預(yù)案
- 2024不簽勞動(dòng)合同賠償?shù)姆梢罁?jù)
- 2024網(wǎng)絡(luò)推廣合同書(shū)
- 果蔬供應(yīng)鏈質(zhì)量追溯制度探討
- 電子商務(wù)信息技術(shù)服務(wù)合同協(xié)議
- 2024年成都交通投資集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 公務(wù)員考試行測(cè)模擬試題及答案解析3
- 外研社(一年級(jí)起點(diǎn))小學(xué)英語(yǔ)四年級(jí)上冊(cè)單詞(帶音標(biāo)、詞性)
- 情侶分手經(jīng)濟(jì)糾紛起訴書(shū)模板
- 膽囊切除術(shù)術(shù)后健康飲食宣教
- 學(xué)生安全指南-預(yù)防、識(shí)別和應(yīng)對(duì)危險(xiǎn)
- 難治性抑郁癥的治療及護(hù)理
- 智能林業(yè)裝備與技術(shù)
- 安徽省蕪湖市2023-2024學(xué)年七年級(jí)上學(xué)期期中數(shù)學(xué)試卷
- 降低非計(jì)劃重返手術(shù)率PDCA
- 幼兒園教師如何說(shuō)課
評(píng)論
0/150
提交評(píng)論