RPC原理及RPC实例分析

RPC原理及RPC实例分析

ID:37904585

大小:89.00 KB

页数:16页

时间:2019-06-02

RPC原理及RPC实例分析_第1页
RPC原理及RPC实例分析_第2页
RPC原理及RPC实例分析_第3页
RPC原理及RPC实例分析_第4页
RPC原理及RPC实例分析_第5页
资源描述:

《RPC原理及RPC实例分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、RPC原理及RPC实例分析第一部分在学校期间大家都写过不少程序,比如写个helloworld服务类,然后本地调用下,如下所示。这些程序的特点是服务消费方和服务提供方是本地调用关系。[java]viewplaincopyprint?publicclassTest{publicstaticvoidmain(String[]args){HelloWorldServicehelloWorldService=newHelloWorldServiceImpl();helloWorldService.sayHello("test");}}而一旦踏入

2、公司尤其是大型互联网公司就会发现,公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的团队负责。这时就会遇到两个问题:要搭建一个新服务,免不了需要依赖他人的服务,而现在他人的服务都在远端,怎么调用?其它团队要使用我们的新服务,我们的服务该怎么发布以便他人调用?下文将对这两个问题展开探讨。1.如何调用他人的远程服务?由于各服务部署在不同机器,服务间的调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对

3、网络通信这些细节透明,那么将大大提高生产力,比如服务消费方在执行helloWorldService.sayHello(“test”)时,实质上调用的是远端的服务。这种方式其实就是RPC(RemoteProcedureCallProtocol),在各大互联网公司中被广泛使用,如阿里巴巴的hsf、dubbo(开源)、Facebook的thrift(开源)、Googlegrpc(开源)、Twitter的finagle(开源)等。要让网络通信细节对使用者透明,我们需要对通信细节进行封装,我们先看下一个RPC调用的流程涉及到哪些通信细节:服务消

4、费方(client)调用以本地调用方式调用服务;clientstub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;clientstub找到服务地址,并将消息发送到服务端;serverstub收到消息后进行解码;serverstub根据解码结果调用本地的服务;本地服务执行并将结果返回给serverstub;serverstub将返回结果打包成消息并发送至消费方;clientstub接收到消息,并进行解码;服务消费方得到最终结果。RPC的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。1.1怎么做到透明化远程服务

5、调用?怎么封装通信细节才能让用户像以本地调用方式调用远程服务呢?对Java来说就是使用代理!java代理有两种方式:jdk动态代理字节码生成尽管字节码生成方式实现的代理更为强大和高效,但代码维护不易,大部分公司实现RPC框架时还是选择动态代理方式。下面简单介绍下动态代理怎么实现我们的需求。我们需要实现RPCProxyClient代理类,代理类的invoke方法中封装了与远端服务通信的细节,消费方首先从RPCProxyClient获得服务提供方的接口,当执行helloWorldService.sayHello(“test”)方法时就会调

6、用invoke方法。[java]viewplaincopyprint?publicclassRPCProxyClientimplementsjava.lang.reflect.InvocationHandler{privateObjectobj;publicRPCProxyClient(Objectobj){this.obj=obj;}/***得到被代理对象;*/publicstaticObjectgetProxy(Objectobj){returnjava.lang.reflect.Proxy.newProxyInstance(ob

7、j.getClass().getClassLoader(),obj.getClass().getInterfaces(),newRPCProxyClient(obj));}/***调用此方法执行*/publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{//结果参数;Objectresult=newObject();//...执行通信相关逻辑//...returnresult;}}[java]viewplaincopyprint?publiccl

8、assTest{publicstaticvoidmain(String[]args){HelloWorldServicehelloWorldService=(HelloWorldService)RPCProxyClien

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。