rmi与rpc的区别
这里简单说一下RMI和RPC的区别。
什么是RMI
RMI(Remote Method Invocation,远程方法调用),能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端Java虚拟机中的对象上的方法,是Java在JDK1.1中实现的,大大增强了Java开发分布式应用的能力,使用的代表是EJB。
RMI是Java的一组用户开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象,集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。简单来说,这样使得原来的程序在同一操作系统的方法调用变成了不同操作系统之间程序的方法调用。由于J2EE是分布式程序平台,它以RMI机制实现了程序组件在不同的操作系统之间的通信。比如一个EJB可以通过RMI调用Web上另一台机器上的EJB远程方法。

RMI远程方法调用的步骤
1.客户对象调用客户端辅助对象stub上的方法。
2.客户端辅助对象stub打包调用信息(变量、方法名),通过网络发送给服务端辅助对象skeleton。
3.服务端辅助对象skeleton将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在的对象。
4.调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象skeleton。
5.服务端辅助对象将结果打包,发送给客户端辅助对象stub。
6.客户端辅助对象将返回值解包,返回给调用者。
7.客户对象获得返回值。
RMI的局限性
1.RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候却可能不知道将来的服务器IP和端口如何,而客户端程序调用是依赖这个IP和端口的。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。注意:我们在实际开发中,我们是知道服务器IP和端口的。
2.RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用WebService或者公用对象请求代理体系(CORBA)来实现。
什么是RPC
RPC(Remote Procedure Call Protocol,远程过程调用协议),是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议,使用的代表是Dubbo。RPC不依赖于具体的网络传输协议,TCP、UDP等都可以。
由于存在各式各样的变换和细节差异,相应的RPC也派生出了各式远程过程通信协议。RPC是跨语言的通信标准,SUN和微软都有其实现。比如RMI可以被看作SUN对RPC的Java版本(实现),而微软的DCOM就是建立在ORPC协议之上的。简单理解就是,RPC是一个协议,无论是SUN的RMI还是微软的DCOM都是对该协议的不同实现,二者都为编程人员提供了应用RC技术的程序接口(API)。
RPC远程过程调用的步骤
1.执行客户端调用语句,传送参数。
2.调用本地系统发送网络消息。
3.消息传送到远程主机。
4.服务器得到消息并获得参数。
5.根据调用请求以及参数执行远程过程(服务)。
6.执行过程完毕后,将结果返回服务器句柄。
7.服务器句柄返回结果,调用远程主机的系统网络服务发送结果。
8.消息传回本地主机。
9.客户端句柄从本地主机的网络服务接收消息。
10.客户端接收到调用语句返回的结果数据。
RMI与RPC的区别
1.方法调用的方式不同
RMI调用方法是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(Stub对象)上,那么这个新方法就不能被RMI客户方所调用。简单理解就是,远程方法需要先在远程接口上注册才能使用。
RPC调用函数是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成【classname.*methodname(参数集)】的形式。这就向RPC服务器表明了,被请求的方法是在classname类中,方法名是methodname。然后RPC服务器就会去搜索与之相匹配的类和方法,并把它作为方法参数类型的输入。这里的参数类型是与PRC请求中的类型相匹配的,一旦匹配成功,这个方法就被调用了,并会将执行结果编码后通过网络协议发回。
2.适用语言的范围不同
RMI只适用于Java并支持传输对象。
PRC是基于C语言的,并不支持传输对象,是网络服务的协议,与操作系统和语言无关。
3.调用结果的返回形式不同
因为Java是面向对象的,所以RMI也是面向对象的,RMI的调用结果可以是对象类型或者是基本数据类型。
PRC的返回结果统一由外部数据表示(External Data Representation,XDR)语言表示,这种语言抽象了字节序类和数据类型结构之间的差异,只有由XDR定义的数据类型才能被传递,可以说RMI是面向对象方式的Java RPC。
扩展阅读
Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实RMI可以被看作是RPC的Java版本(实现)。
传统RPC并不能很好地应用于分布式对象系统,而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
RMI目前使用Java远程消息交换协议(JRMP,Java Remote Messaging Protocol)进行通信。JRMP是专为Java的远程对象制定的协议。因此,Java RMI具有Java的【Write Once,Run Anywhere】的优点,是分布式应用系统的百分之百纯Java解决方案。用Java RMI开发的应用系统可以部署在任何支持JRE(Java Run Environment Java,Java运行环境)的平台上。但由于JRMP是专为Java对象制定的,因此RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。
"我再也遇不到第二个你。"
rmi与rpc的区别的更多相关文章
- Java RMI与RPC的区别
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542811.html 一:RPC 远程过程调用 RPC(Remote Procedure Call Prot ...
- 面试题思考:Java RMI与RPC,JMS的比较
RPC:(Remote Procedure Call) 被设计为在应用程序间通信的平台中立的方式,它不理会操作系统之间以及语言之间的差异. 支持多语言 RMI:(Remote Method Invo ...
- RPC、RMI、REST的区别
初入职场,接触了不少企业常用的技术,与学校实训使用的技术有很大差异,在这里记录一下RPC.RMI与REST的区别. 概念 RPC(Remote Procedure Call,远程过程调用) 一种通过从 ...
- SOA,Webservice,SOAP,REST,RPC,RMI,JMS的区别与联系(转载)
原文地址:http://blog.csdn.net/pcceo1/article/details/51245249 SOA面向服务的软件架构(Service Oriented Architecture ...
- 转 RMI、RPC、SOAP通信技术介绍及比对
http://www.open-open.com/home/space.php?uid=37924&do=blog&id=8974 1.RMI 使用java的程序员,对于RMI(Rem ...
- RMI、RPC、SOAP通讯技术介绍及比对 - XML/SOAP
RMI.RPC.SOAP通信技术介绍及比对 1.RMI 使用java的程序员,对于RMI(RemoteMethod Invoke,远程方法调用)一定不陌生,在java中,为了在分布式应用开发时,能够方 ...
- RMI、RPC、SOAP通信技术介绍及比对
1.RMI 使用java的程序员,对于RMI(RemoteMethod Invoke,远程方法调用)一定不陌生,在java中,为了在分布式应用开发时,能够方便调用远程对象,java提供了RMI的API ...
- RMI,RPC,SOAP对比分析
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp60 1.RMI 使用java的程序员,对于RMI(Remot ...
- MQ & RPC 消息队列与RPC的区别与使用场景
MQ: 区别:面向数据.生产者与消费者.有缓冲节点.异步.系统级/模块级通信 选型:RabbitMQ.ActiveMQ/Apollo.ZeroMQ.memcacheQ.Redis.MSMQ.kafk ...
随机推荐
- java之构造器
1.构造方法的作用:在new创建对象时为其赋值. 2.构造方法的分类: ①无参构造public 同类名(){},有参构造public 同类名(参数列表){语句}. ②构造方法没有方法名,没有返回值类型 ...
- MVC模式与Servlet执行流程
##Servlet生命周期 五个部分,从加载到卸载,如同人类的出生到死亡 加载:Servlet容器自动处理 初始化:init方法 该方法会在Servlet被加载并实例化后执行 服务:service抽象 ...
- python基础知识第七篇(练习)
# a. 获取内容相同的元素列表 l1 = [11,22,33] l2 = [22,33,44] for l in l1: if l in l2: print(l) # b. 获取 l1 中有, l2 ...
- golang中copy文件时,buffer设多大值合适,性能对比
在go语言中,copy文件时,大文件使用buffer缓冲,可以明显加快时间, 但这个值多大合适呢? 除了考虑计算机的硬件资源,还要考虑CP文件的大小. 如果都是100m之内的小文件,一次CP完就可以. ...
- Flutter报错记录
1.Could not find an option named "androidx". Run 'flutter -h' (or 'flutter -h') for avai ...
- 商业分析BA:用户故事怎么拆?
什么是User Story其实我觉得要对User Story做一个定义还是挺难的.曾经的我以为,所谓User Story是User来讲述的Story.你看啊,User Story的编写范式:As a ...
- sqlserver日志处理不当而造成的隐患
sqlserver日志处理不当而造成的隐患 事故背景:一大早还在路上,群里陆续有人反馈系统一直报错 “Unknown error 258”,后来查询日志发现错误日志 第一反应是不是数据库连接不够用了? ...
- Your activation code could not be validated (error 1653219)
很多小伙伴私聊我反应说,完全按照了你的 idea 激活教程走的,可最后还是没能激活成功,提示错误信息为: Your activation code could not be validated (er ...
- C# 使用TopShelf实现Windows服务部署
一.TopShelf介绍 topShelf是创建Windows服务的一种方式,可以方便管理应用服务,最大广泛应用于,数据实时接收,定时推送等. 二.TopShelf使用 1.安装 TopShelf程序 ...
- 5分钟搞定Jenkis
目录 什么是持续集成 Jenkins简介 Jenkins安装与启动 Jenkins插件安装 全局工具配置 自动安装 本地安装 代码上传至Git服务器 任务的创建与执行 Go项目 JAVA项目 @ 什么 ...