什么是RMI,什么是RPC,两者之间的区别是什么?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jnshu_it/article/details/83900664

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

【什么是RMI,什么是RPC,两者之间的区别是什么?】

大家好,我是IT修真院北京分院第34期的学员岳晓鹏,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java任务八,深度思考中的知识点——什么是RMI,什么是RPC,两者之间的区别是什么?

(1)背景介绍:

RMI

Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里, 一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。 远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。 Java RMI极大地依赖于接口。在需要创建一个远程对象的时候,程序员通过传递一个接口来隐藏底层的实现细节。 客户端得到的远程对象句柄正好与本地的根代码连接,由后者负责透过网络通信。 这样一来,程序员只需关心如何通过自己的接口句柄发送消息。

RPC

RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。 它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。 即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同。

(2)知识剖析:

RPC 与其它远程调用方式比较

RPC 与 HTTP、RMI、Web Service 都能完成远程调用,但是实现方式和侧重点各有不同。

HTTP

HTTP(HyperText Transfer Protocol)是应用层通信协议,使用标准语义访问指定资源(图片、接口等), 网络中的中转服务器能识别协议内容。HTTP 协议是一种资源访问协议,通过 HTTP 协议可以完成远程请求并返回请求结果。 HTTP 的优点是简单、易用、可理解性强且语言无关 ,在远程服务调用中包括微博有着广泛应用。HTTP 的缺点是协议头较重, 一般请求到具体服务器的链路较长,可能会有 DNS 解析、Nginx 代理等。 RPC 是一种协议规范,可以把 HTTP 看作是一种 RPC 的实现,也可以把 HTTP 作为 RPC 的传输协议来应用。 RPC 服务的自动化程度比较高,能够实现强大的服务治理功能,和语言结合更友好,性能也十分优秀。与 HTTP 相比, RPC 的缺点就是相对复杂,学习成本稍高。

RMI

RMI(Remote Method Invocation)是指 Java 语言中的远程方法调用,RMI 中的每个方法都具有方法签名, RMI 客户端和服务器端通过方法签名进行远程方法调用。RMI 只能在 Java 语言中使用, 可以把 RMI 看作面向对象的 Java RPC 。

Web Service

Web Service 是一种基于 Web 进行服务发布、查询、调用的架构方式,重点在于服务的管理与使用。Web Service 一般通过 WSDL 描述服务,使用 SOAP(简单对象访问协议)通过 HTTP 调用服务。 RPC 是一种远程访问协议,而 Web Service 是一种体系结构,Web Service 也可以通过 RPC 来进行服务调用,因此 Web Service 更适合同一个 RPC 框架进行比较。当 RPC 框架提供了服务的发现与管理,并使用 HTTP 作为传输协议时,其实就是 Web Service。 相对 Web Service,RPC 框架可以对服务进行更细粒度的治理,包括流量控制、SLA 管理等,在微服务化、分布式计算方面有更大的优势。

RPC与RMI的区别

(1)RPC 跨语言,而 RMI只支持Java。

(2)RMI 调用远程对象方法,允许方法返回 Java 对象以及基本数据类型,而RPC 不支持对象的概念, 传送到 RPC 服务的消息由外部数据表示 (External Data Representation, XDR) 语言表示, 这种语言抽象了字节序类和数据类型结构之间的差异。只有由 XDR 定义的数据类型才能被传递, 可以说 RMI 是面向对象方式的 Java RPC 。

(3)在方法调用上,RMI中,远程接口使每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口上,那么这个新方法就不能被RMI客户方所调用。

在RPC中,当一个请求到达RPC服务器时,这个请求就包含了一个参数集和一个文本值,通常形成“classname.methodname”的形式。这就向RPC服务器表明,被请求的方法在为 “classname”的类中,名叫“methodname”。然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。这里的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。 

RMI远程调用步骤:

1,客户调用客户端辅助对象stub上的方法

2,客户端辅助对象stub打包调用信息(变量,方法名),通过网络发送给服务端辅助对象skeleton

3,服务端辅助对象skeleton将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象

4,调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象skeleton

5,服务端辅助对象将结果打包,发送给客户端辅助对象stub

6,客户端辅助对象将返回值解包,返回给调用者

7,客户获得返回值 

(3)常见问题:

RMI进行远程通信的数据的传递

(4)解决方案:

在Java程序中引用类型的参数传递是按引用传递的,对于在同一个虚拟机中的传递时是没有问题的,因为的参数的引用对应的是同一个内存空间。但是对于分布式系统中,由于对象不再存在于同一个内存空间,虚拟机A的对象引用对于虚拟机B没有任何意义 需要将对象序列化为流的形式,通过实现java.io.Serializable接口来完成。

(5)编码实战:

简单的进行一个RMI的简单调用

(6)拓展思考:

(7)参考文献:

https://blog.csdn.net/shan9liang/article/details/8995023【1】。CSDN博客

https://www.jianshu.com/p/c34ee94fa3d2【2】。白笑然师兄简书技术分享博客

https://www.jianshu.com/p/9b22b9dfba30【3】。袁磊师兄简书技术分享博客

(8)更多讨论:

Q1:什么是uuid?远程传输的时候需要uuid吗?
A1:UUID含义是通用唯一识别码 (Universally Unique Identifier),是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。其实远程传输序列化的时候,使用java自带的散列计算和检点指定一个uid就可以了,并不是一定需要uuid,用这个还是有点繁琐。
Q2:怎么保证远程通信的接受方可以正确的反序列化?
A2:java中序列化的时候,是根据类的所有内容来计算出一个散列哈希值,通过这个哈希值来判断是不是同一个类,计算的内容包括类全限定名称,方法,属性;只要是这个几个内容一样,并且双方都用的同一种序列化方式来进行序列化和反序列化就可以正确的进行传输。
Q3:远程通信跟最近很火的微服务是不是一回事?
A3:远程通信的技术很早就有,微服务的火爆是在远程通信基础上构建的一个服务框架。学习微服务必须得熟悉远程通信的内容。

(9)鸣谢:

感谢白笑然、袁磊师兄,此教程是在他们之前技术分享的基础上完善而成。

(10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

PPT链接 视频链接

更多内容,可以加入IT交流群565734203与大家一起讨论交流

这里是技能树·IT修真院:http://www.jsnhu.com,初学者转行到互联网的聚集地

猜你喜欢

转载自blog.csdn.net/jnshu_it/article/details/83900664