從零開(kāi)始手寫(xiě)dubborpc框架-1generic泛化調(diào)用_第1頁(yè)
從零開(kāi)始手寫(xiě)dubborpc框架-1generic泛化調(diào)用_第2頁(yè)
從零開(kāi)始手寫(xiě)dubborpc框架-1generic泛化調(diào)用_第3頁(yè)
從零開(kāi)始手寫(xiě)dubborpc框架-1generic泛化調(diào)用_第4頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、rpcrpc是基于netty實(shí)現(xiàn)的javarpc框架,類似于dubbo。主要用于個(gè)人學(xué)習(xí),由漸入深,理解rpc的底層實(shí)現(xiàn)原理generic泛化調(diào)用說(shuō)明泛化接口調(diào)用方式主要用于客戶端沒(méi)有API接口及模型類元的情況,參數(shù)及返回值中的所有POJO勻用Map表示,通常用于框架集成,比如:實(shí)現(xiàn)一個(gè)通用的服務(wù)測(cè)試框架,可通過(guò)GenericService調(diào)用所有服務(wù)實(shí)現(xiàn)。GenericServicebarService=(GenericService)applicationContext.getBean("barService");Objectresult=barService.$inv

2、oke("sayHello",newString"java.lang.String",newObject"World");實(shí)現(xiàn)思路客戶端泛化調(diào)用個(gè)人感受不是很深,但是有一點(diǎn),當(dāng)沒(méi)有服務(wù)端接口的時(shí)候,也就無(wú)法通過(guò)反射獲取對(duì)應(yīng)的方法等原始信息。所以需要額外提供一個(gè)接口,并且可以獲取方法的相關(guān)屬性。服務(wù)端本次基本沒(méi)做處理。個(gè)人理解是客戶使用的時(shí)候自行定義實(shí)現(xiàn)類。客戶端實(shí)現(xiàn)接口/* 泛化調(diào)用接口* (1)接口直接使用dubbo的接口* 【應(yīng)用場(chǎng)景】* 泛接口實(shí)現(xiàn)方式主要用于服務(wù)器端沒(méi)有API接口及模型類元的情況,參數(shù)及返回值中的所有POJO均

3、用Map表示,通常用于框架集成,比如:實(shí)現(xiàn)一個(gè)通用的遠(yuǎn)程服務(wù)Mock框架,可通過(guò)實(shí)現(xiàn)GenericService接口處理所有服務(wù)請(qǐng)求。* 【服務(wù)端】* 服務(wù)端代碼不需要做任何調(diào)整。* 客戶端泛化調(diào)用進(jìn)行相關(guān)調(diào)整即可。* 【客戶端】* authorbinbin.hou* since0.1.2* /publicinterfaceGenericService/*Genericinvocation* parammethodMethodname,e.g.findPerson.Ifthereareoverriddenmethods,parameterinfois* required,e.g.findPer

4、son(java.lang.String)* paramparameterTypesParametertypes* paramargsArguments* returninvocationreturnvalue* throwsGenericExceptionpotentialexceptionthrownfromtheinvocation* /Object$invoke(Stringmethod,StringparameterTypes,Objectargs)throwsGenericException;默認(rèn)實(shí)現(xiàn)默認(rèn)的實(shí)現(xiàn),其實(shí)和基于接口的動(dòng)態(tài)代理非常的類似。這種實(shí)現(xiàn)只需要在用戶指定為gene

5、ric的時(shí)候,使用這個(gè)實(shí)現(xiàn)即可。/* 泛化調(diào)用* authorbinbin.hou* since0.1.2*/publicclassGenericReferenceProxyimplementsGenericServiceprivatestaticfinalLogLOG=LogFactory.getLog(GenericReferenceProxy.class);/* 代理上下文* (1)這個(gè)信息不應(yīng)該被修改,應(yīng)該和指定的service緊密關(guān)聯(lián)* since0.1.3* /privatefinalServiceContextproxyContext;/*遠(yuǎn)程調(diào)用接口since0.1.3*/pr

6、ivatefinalRemoteInvokeServiceremoteInvokeService;publicGenericReferenceProxy(ServiceContextproxyContext,RemoteInvokeServiceremoteInvokeService)xyContext=proxyContext;this.remoteInvokeService=remoteInvokeService;©OverrideSuppressWarnings("unchecked")publicObject$invoke(Stringme

7、thod,StringparameterTypes,Objectargs)throwsGenericException/構(gòu)建基本調(diào)用參數(shù)finallongcreateTime=Times.systemTime();ObjectactualArgs=newObjectmethod,parameterTypes,args;DefaultRpcRequestrpcRequest=newDefaultRpcRequest();rpcRequest.serviceld(proxyContext.serviceld();rpcRequest.createTime(createTime);newArrayL

8、ist(););););rpcRequest.paramValues(actualArgs);List<String>paramTypeNames=Guavas.paramTypeNames.add("java.lang.String"paramTypeNames.add("Ljava.lang.String;"paramTypeNames.add("Ljava.lang.Object;"rpcRequest.paramTypeNames(paramTypeNames);rpcRequest.methodName(&quo

9、t;$invoke");rpcRequest.returnType(Object.class);/proxyContext中應(yīng)該是屬于當(dāng)前service的對(duì)應(yīng)信息。/每一次調(diào)用,對(duì)應(yīng)的invoke信息應(yīng)該是不通的,需要?jiǎng)?chuàng)建新的對(duì)象去傳遞信息/rpcRequest因?yàn)橐婕暗骄W(wǎng)絡(luò)間傳輸,盡可能保證其簡(jiǎn)潔性。DefaultRemotelnvokeContextcontext=newDefaultRemotelnvokeContext();context.request(rpcRequest);context.traceld(Ids.uuid32();context.retryTimes(

10、2);context.serviceProxyContext(proxyContext);context.remotelnvokeService(remotelnvokeService);/3,執(zhí)行遠(yuǎn)程調(diào)用returnremotelnvokeService.remotelnvoke(context);)測(cè)試代碼注冊(cè)中心啟動(dòng)客戶端?指定配置為generic使用GenericService接口直接調(diào)用publicstaticvoidmain(String口args)/服務(wù)配置信息ReferenceConfig<GenericService>config=ClientBs.newInst

11、ance();config.serviceId(ServiceIdConst.GENERIC);config.serviceInterface(GenericService.class);config.subscribe(true);config.registerCenter(ServiceIdConst.REGISTER_CENTER);config.generic(true);GenericServicegenericService=config.reference();genericService.$invoke("hello",newString"name

12、",newObject口"123");服務(wù)端?測(cè)試代碼這個(gè)FooGenericService實(shí)現(xiàn)非常簡(jiǎn)單,只是輸出對(duì)應(yīng)的參數(shù)信息publicstaticvoidmain(Stringargs)/啟動(dòng)服務(wù)ServiceBs.getInstance().register(ServiceIdConst.GENERIC,newFooGenericService().registerCenter(ServiceIdConst.REGISTER_CENTER).expose();服務(wù)端日志信息INFO2019-11-0122:53:12,316nioEventLoopGrou

13、p-3-1c.g.h,r,s.h.RpcServerHandler.channelRead0-Serverchannelreadstart:502b73fffec4485c-000019fc-00000002-bd2c76df8b24bcd4-e2e8065aINFO2019-11-0122:53:12,317nioEventLoopGroup-3-1c.g.h,r,s.h.RpcServerHandler.channelRead0-Serverreceivechannel502b73fffec4485c-000019fc-00000002-bd2c76df8b24bcd4-e2e8065ar

14、equest:DefaultRpcRequestseqId='4afb085e10b94063ad4b6e46aa617fcd',createTime=1572619992279,serviceId='generic',methodName='$invoke',paramTypeNames=java.lang.String,Ljava.lang.String;,Ljava.lang.Object;,paramValues=hello,Ljava.lang.String;11e7ee7,Ljava.lang.Object;c69f46,return

15、Type=classjava.lang.ObjectINFO2019-11-0122:53:12,319nioEventLoopGroup-3-1c.g.h.r.c,s.g.i.FooGenericService.$invoke-Genericmethod:helloINFO2019-11-0122:53:12,319nioEventLoopGroup-3-1c.g.h.r.c,s.g.i.FooGenericService.$invoke-GenericparameterTypes:nameINFO2019-11-0122:53:12,320nioEventLoopGroup-3-1c.g.h.r.c,s.g.i.FooGenericService.$invoke-Genericargs:123INFO2019-11-0122:53

溫馨提示

  • 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)論