1 RPC简介RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议 。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据 。在OSI网络通信模型中,RPC跨越了传输层和应用层 。
2 RPC实现RPC的实现中一个重要的功能就是动态代理 。整个过程如下:
首先,对于用户方而言:
- 只提供接口不提供实现类,所有的接口文件都导出后,调用方放在一个专门目录下
- 接口千奇百怪,但是都没有具体实现
- 代理要代理掉专门目录下的所有接口,任何对这里接口的调用都被序列化后转到远端
文章插图
【远程过程调用RPC的实现原理:动态代理】只有方法名称,也不知道接口在远端的实现类的名称 。
然后,我们的ProxyHandler如下:
文章插图
具体使用时这样:
文章插图
这样,就可以实现RPC的代理了 。运行结果:
文章插图
那具体实现RPC可如下 。
- 首先如代码所示,我们只需要接口,不需要知道任何实现类的信息就可以创建一个接口的代理实现 。就和生成RemoteService remoteService一样 。
- 因为所有的接口都在指定目录下,我们可以扫描该目录下的所有接口,批量生成所有接口的实例,并把生成的bean都放入spring中管理 。这样,用户就可以用autowair注入所有实现 。而实际上我们的代理proxy就成了所有接口的实现 。
- 用户调用任何接口时,都调用了我们生成的bean实现 。其实都进入了我们相同的handler实现,实现中我们可以知道用户想要调用的完整方法名称(从它的目录路径可以分析出目标应用名)、参数 。然后序列化后去远端调用并返回结果即可 。
首先引入Cglib包:
文章插图
首先,目标对象不发生任何变化,并且该类也不需要实现任何接口了:
文章插图
代理类写法如下:
文章插图
通过代码我们也可以看出,代理类是作为目标类的子类出现的,在调用目标类方法时,实际是调用父类 。
使用如下:
文章插图
使用过程比较简单:
1. 生成一个代理对象
2. 告诉代理对象,它的实现在哪里
3. 告诉代理对象,它的父类是谁
4. 生成代理类的对象
5. 调用代理对象的方法
这样,对生成的代理对象进行调用时,会调用到它的回调对象,然后回调对象中根据操作可能调用目标对象(父类)的方法 。
得到结果:
before speak
hello Jack
after speak
OK
推荐阅读
- 玻璃杯泡红茶的方法,三评测过程
- B/S架构web请求过程详解
- 远程 抗妇炎胶囊的说明书
- JavaScript轻应用PWA实践全过程
- java中的参数传递
- html5 调用手机摄像头以及录音
- 开发过程中快速抓包并解析
- 获取访客信息 API 接口调用请求
- 垃圾食品的制作过程
- 汉字的来历:汉字的起源和演变过程 汉字的起源和演变