实现远程调用_远程过程调用(RPC)是怎么实现的?
1 RPC简介
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。
2 RPC实现
RPC的实现中一个重要的功能就是动态代理。整个过程如下:
首先,对于用户方而言:
- 只提供接口不提供实现类,所有的接口文件都导出后,调用方放在一个专门目录下
- 接口千奇百怪,但是都没有具体实现
- 代理要代理掉专门目录下的所有接口,任何对这里接口的调用都被序列化后转到远端
假设,我们有一个接口如下:
只有方法名称,也不知道接口在远端的实现类的名称。
然后,我们的ProxyHandler如下:
具体使用时这样:
这样,就可以实现RPC的代理了。运行结果:
那具体实现RPC可如下。
- 首先如代码所示,我们只需要接口,不需要知道任何实现类的信息就可以创建一个接口的代理实现。就和生成RemoteService remoteService一样。
- 因为所有的接口都在指定目录下,我们可以扫描该目录下的所有接口,批量生成所有接口的实例,并把生成的bean都放入spring中管理。这样,用户就可以用autowair注入所有实现。而实际上我们的代理proxy就成了所有接口的实现。
- 用户调用任何接口时,都调用了我们生成的bean实现。其实都进入了我们相同的handler实现,实现中我们可以知道用户想要调用的完整方法名称(从它的目录路径可以分析出目标应用名)、参数。然后序列化后去远端调用并返回结果即可。
3 动态代理
cglib是通过字节码,生成了目标类的子类实现动态代理的。因此,对于final的方法无法使用cglib进行动态代理。
首先引入Cglib包:
首先,目标对象不发生任何变化,并且该类也不需要实现任何接口了:
代理类写法如下:
通过代码我们也可以看出,代理类是作为目标类的子类出现的,在调用目标类方法时,实际是调用父类。
使用如下:
使用过程比较简单:
1. 生成一个代理对象
2. 告诉代理对象,它的实现在哪里
3. 告诉代理对象,它的父类是谁
4. 生成代理类的对象
5. 调用代理对象的方法
这样,对生成的代理对象进行调用时,会调用到它的回调对象,然后回调对象中根据操作可能调用目标对象(父类)的方法。
得到结果:
before speak
hello Jack
after speak
OK
欢迎关注我们,不错过每期的原创干货。
实现远程调用_远程过程调用(RPC)是怎么实现的?相关推荐
- 整合rpc远程调用_远程过程调用(RPC)
分布式系统的主要特点是能够将一台机器上的一个任务分解到系统中其他的机器上运行,实现多个CPU的协同工作.远程过程调用RPC就是实现这一特点的有效方法之一 1.什么是RPC RPC的基本思想 (1984 ...
- java rpc远程调用_浅谈rpc(远程过程调用)
信息来源:邪恶八进制信息安全团队 RPC协议2:这个协议是一个够年头的协议 本文介绍用于ONC RPC协议规范.此协议使用XDR语言进行描述,并文不打算描述具体的使用细节而只介绍RPC协议本身. ON ...
- 远程调用:远程过程调用(RPC)和远程方法调用(RMI)
远程调用包括远程过程调用(RPC)和远程方法调用(RMI) 1.请求-应答协议 请求-应答协议描述了一个基于消息传递的范型,支持消息双向传输. 涉及三个通信原语 (1)doOperation:向指定的 ...
- 【黑马-SpringCloud技术栈】【02】服务拆分及远程调用_服务提供者与消费者
持续学习&持续更新中- 守破离 [黑马-SpringCloud技术栈][02]服务拆分及远程调用_服务提供者与消费者 SpringCloud引入 服务拆分及远程调用 服务拆分原则 服务拆分De ...
- 实现远程调用_微服务的那些事(三),微服务的远程调用方式。RPC和HTTP
2.远程调用方式 无论是微服务还是SOA,都面临着服务间的远程调用.那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下几种: RPC:Remote Produce Call远程过程调用,类似 ...
- java socket 远程调用_使用Socket反射Java流操作进行方法的远程调用(模拟RPC远程调用)...
写在前面 阅读本文首先得具备基本的Socket.反射.Java流操作的基本API使用知识:否则本文你可能看不懂... 服务端的端口监听 进行远程调用,那就必须得有客户端和服务端.服务端负责提供服务,客 ...
- php rpc调用,PHP远程调用, 为什么需要使用RPC
前言 一个项目,从开始到版本更新,一直到最后的版本维护.功能在不断增多,对应的代码量也在不断增加,也就意味着项目变得更不可维护,这时候,我们需要用拆分的方式将一个项目打散,以便开发团队更好的对项目进行 ...
- 分布式系统架构的远程调用(RESTFul、RPC)和CAP原理
文章目录 分布式系统的远程调用 RestFul接口 RPC协议 RestFul和RPC的区别 分布式系统的CAP原理 分布式系统的远程调用 在微服务架构中,通常存在多个服务之间的远程调用的需求.远程调 ...
- cloud 异步远程调用_异步远程工作的意外好处-以及如何拥抱它们
cloud 异步远程调用 In this article, I'll discuss the positive aspects of being a little out of sync with y ...
最新文章
- Ruby开发环境配置
- 比特币现金诞生一周年,未来发展瞄上了IPFS技术
- 核心概念——节点分组 Group
- 用JWT来保护我们的ASP.NET Core Web API
- css媒体查询改变上边距,CSS媒体查询宽度或高度
- 【转】DICOM的常用Tag分类和说明!!!!
- STM8学习笔记---读取STM8S003单片机序列号
- vue页面乱码_项目部署到weblogic后页面乱码问题
- n-Track Studio Suite 9 Mac(多轨音乐制作工具)
- 为企业发展赋能,让零散数据资源变为企业数据资产
- logistic回归分析优点_7种主流数据分析软件比较及经典教材推荐
- mysql数据库实训总结_数据库实训报告
- 模式先行浅析分销系统的优势
- 通俗易懂、细致入微讲解卡尔曼滤波
- 【498. 对角线遍历】
- Tui-editor富文本编辑器的使用
- rabbitmq-消息可靠传递-消息确认机制,手动确认,针对消费者方向(七)
- 外部电源和锂电池自动切换电路
- 耦合和解耦的概念解析!
- 关于OpenCV的个人小心得
热门文章
- h5 app title隐藏_荒岛求生H5:有难度的文字冒险生存游戏,你能生存多久?
- 文件查找工具everything的下载使用
- 基于stm32简易计算机电路图,基于STM32的简易电子计算器设计与实现(DOC).doc
- java double用法_Java Double doubleToLongBits()用法及代码示例
- 03-drawcommands工程分析详解
- Android开发之获取常用android设备参数信息
- picker封装 uniapp_uniapp自定义picker城市多级联动组件
- 为什么在iOS上访问优酷和土豆一样可以播放呢?
- tms脚本演示代码之一
- Android自定义View——可以设置最大宽高的FrameLayout