RPC框架原理介紹_第1頁(yè)
RPC框架原理介紹_第2頁(yè)
RPC框架原理介紹_第3頁(yè)
RPC框架原理介紹_第4頁(yè)
RPC框架原理介紹_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論