这里简单说一下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的区别的更多相关文章

  1. Java RMI与RPC的区别

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542811.html  一:RPC 远程过程调用 RPC(Remote Procedure Call Prot ...

  2. 面试题思考:Java RMI与RPC,JMS的比较

    RPC:(Remote Procedure Call)  被设计为在应用程序间通信的平台中立的方式,它不理会操作系统之间以及语言之间的差异. 支持多语言 RMI:(Remote Method Invo ...

  3. RPC、RMI、REST的区别

    初入职场,接触了不少企业常用的技术,与学校实训使用的技术有很大差异,在这里记录一下RPC.RMI与REST的区别. 概念 RPC(Remote Procedure Call,远程过程调用) 一种通过从 ...

  4. SOA,Webservice,SOAP,REST,RPC,RMI,JMS的区别与联系(转载)

    原文地址:http://blog.csdn.net/pcceo1/article/details/51245249 SOA面向服务的软件架构(Service Oriented Architecture ...

  5. 转 RMI、RPC、SOAP通信技术介绍及比对

    http://www.open-open.com/home/space.php?uid=37924&do=blog&id=8974 1.RMI 使用java的程序员,对于RMI(Rem ...

  6. RMI、RPC、SOAP通讯技术介绍及比对 - XML/SOAP

    RMI.RPC.SOAP通信技术介绍及比对 1.RMI 使用java的程序员,对于RMI(RemoteMethod Invoke,远程方法调用)一定不陌生,在java中,为了在分布式应用开发时,能够方 ...

  7. RMI、RPC、SOAP通信技术介绍及比对

    1.RMI 使用java的程序员,对于RMI(RemoteMethod Invoke,远程方法调用)一定不陌生,在java中,为了在分布式应用开发时,能够方便调用远程对象,java提供了RMI的API ...

  8. RMI,RPC,SOAP对比分析

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp60   1.RMI     使用java的程序员,对于RMI(Remot ...

  9. MQ & RPC 消息队列与RPC的区别与使用场景

    MQ:  区别:面向数据.生产者与消费者.有缓冲节点.异步.系统级/模块级通信 选型:RabbitMQ.ActiveMQ/Apollo.ZeroMQ.memcacheQ.Redis.MSMQ.kafk ...

随机推荐

  1. 每天用Mybatis,但是Mybatis的工作原理你真的知道吗?

    近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件: SqlSession Executor Sta ...

  2. android studio 代码问题总结

    1,android studio隐藏title时,用eclipse里面的方法不行,所以用下面的代码解决,此代码需要写在 加载xml文件之后 getSupportActionBar().hide(); ...

  3. Maven使用教程一:Maven基础

    使用Maven快速创建一个工程 为了加快速度,在setting.xml中加一段配置,用国内阿里云的镜像仓库可以去下载各种东西. <mirror> <id>nexus-aliyu ...

  4. IPFS学习-哈希

    Hashes 哈希函数是接受一些任意输入并返回固定长度值的函数.具体值取决于所使用的给定哈希算法,例如SHA-1(GIT在使用),SHA-256,或者是BLAKE2,但是给予一个输入使用哈希算法总是返 ...

  5. C# 生成全球唯一标识符GUID

    string strguid = Guid.NewGuid().ToString();//57d99d89-caab-482a-a0e9-a0a803eed3ba 生成标准的标志符 (36位标准)st ...

  6. linux部署.net Core项目

    首篇笔记,多多关照.方便回忆和给新手指导,大神绕道 首先在Linux系统部署.net Core项目首先准备一个Linux系统的服务器,百度云,阿里云都行. 1.net core 部署在Linux系统上 ...

  7. css 重点知识 和 bug 解决方法

    1.图片向下撑大3像素问题 在一个盒子里面放一张图片,默认情况下,图片会向下撑大3像素,有以下几种解决方法: 1.1 给图片添加display:block: 1.2 给图片添加 float:left: ...

  8. .NET Core和无服务器框架

    无服务器框架是一个云提供商无关的工具包,旨在帮助构建,管理和部署无服务器组件的操作,以实现完整的无服务器架构或不同功能即服务(FaaS).无服务器框架的主要目标是为开发人员提供一个界面,该界面抽象出云 ...

  9. CentOS 7 源代码安装Nginx

    本篇简要介绍CentOS 7 源代码安装Nginx. Preface # yum install epel-release -y # yum group install "Developme ...

  10. WebMvcConfigurationSupport 避坑指南

    通过返回WebMvcConfigurationSupport 的方式, 默认会覆盖 Spring boot的自动配置, 导致配置失效静态资源无法访问:但是在WebMvcConfigurationadp ...