博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
什么是RMI,什么是RPC,两者之间的区别是什么?
阅读量:5901 次
发布时间:2019-06-19

本文共 3442 字,大约阅读时间需要 11 分钟。

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

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

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

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

 

 

大家好,我是IT修真院深圳分院第十二期学员,一枚正直纯洁善良的JAVA程序员。

今天给大家分享一下,修真院官网JAVA任务五的一个知识点:

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

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

深入学习网址:

愿不再有程序渣,我们只生产代码,而不是生产BUG。

 

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献      

8.更多讨论

 

1.背景介绍

    集群:集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。

    分布式:一种基于网络的计算机处理技术,与集中式相对应。由于个人计算机的性能得到极大的提高及其使用的普及,使处理能力分布到网络上的所有计算机成为可能。分布式计算是和集中式计算相对立的概念,分布式计算的数据可以分布在很大区域。

    分布式服务架构 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。 此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。

 

2.知识剖析

    2.1.什么是RMI?

    2.2.什么是RPC?

    2.3.RMI与RPC之间的区别是什么?

 

2.1.什么是RMI:

    RMI采用stubs和skeletons来进行远程对象(remote object)的通讯。stub充当远程对象的客户端代理,有着和远程对象相同的远程接口,远程对象的调用实际是通过调用该对象的客户端代理对象stub来完成的,通过该机制RMI就好比它是本地工作,采用tcp/ip协议,客户端直接调用服务端上的一些方法。优点是强类型,编译期可检查错误,缺点是只能基于JAVA语言,客户机与服务器紧耦合。

 

创建远程方法调用的5个步骤:

1)定义一个扩展了Remote接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常;
2)定义一个实现该接口的类;
3)使用rmic程序生成远程实现所需的存根和框架;
  (例如,在demo.rmi.EchoServer.java所在目录运行: rmic demo.rmi.EchoServer)
4)创建一个客户程序和服务器进行RMI调用;
5)启动rmiregistry并运行自己的服务程序和客户程序。

 

2.2.什么是RPC:

    RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC不依赖于具体的网络传输协议,tcp、udp等都可以。由于存在各式各样的变换和细节差异,相应的rpc也派生出了各式远程过程通信协议。RPC是跨语言的通信标准,SUN和微软都有其实现,比如RMI可以被看作SUN对RPC的Java版本( 实现),而微软的DCOM就是建立在ORPC协议之上。一言以蔽之,RPC是协议,而无论是SUN的RMI还是微软的DCOM都是对该协议的不同实现,二者都为编程人员提供了应用PRC技术的程序接口(API)。

    RPC是指远程过程调用,RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

    RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。这个请求包括一个参数集和一个文本集,通常形成“classname.methodname”形式。优点是跨语言跨平台,C端、S端有更大的独立性,缺点是不支持对象,无法在编译器检查错误,只能在运行期检查。

 

 2.3.RMI与RPC之间的区别:

(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请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。

 

3.常见问题

    3.1.如何使用RMI?

 

4.解决方案

     4.1.正确使用RMI。

 

5.编码实战

     5.1.使用RMI远程调用。

 

6.扩展思考

     

7.参考文献      

     CSDN、百度百科

    

 

8.更多讨论

     8.1.什么是Web Service?

Web Service提供的服务是基于web容器的,底层使用http协议,类似一个远程的服务提供者,比如天气预报服务,对各地客户端提供天气预报,是一种请求应答的机制,是跨系统跨平台的。就是通过一个servlet,提供服务出去。

首先客户端从服务器的到WebService的WSDL,同时在客户端声称一个代理类(Proxy Class)这个代理类负责与WebService

服务器进行Request和Response当一个数据(XML格式的)被封装成SOAP格式的数据流发送到服务器端的时候,就会生成一个进程对象并且把接收到这个Request的SOAP包进行解析,然后对事物进行处理,处理结束以后再对这个计算结果进行SOAP

包装,然后把这个包作为一个Response发送给客户端的代理类(Proxy Class),同样地,这个代理类也对这个SOAP包进行解析处理,继而进行后续操作。这就是WebService的一个运行过程。

Web Service大体上分为5个层次:

  1. Http传输信道
  2. XML的数据格式
  3. SOAP封装格式
  4. WSDL的描述方式
  5. UDDI UDDI是一种目录服务,企业可以使用它对Webservices进行注册和搜索

8.2.JMS和RMI的区别?

    采用JMS服务,对象是在物理上被异步从网络的某个JVM上直接移动到另一个JVM上(是消息通知机制)

而RMI对象是绑定在本地JVM中,只有函数参数和返回值是通过网络传送的(是请求应答机制)。

RMI一般都是同步的,也就是说,当client调用Server的一个方法的时候,需要等到对方的返回,才能继续执行client端,这个过程调用本地方法感觉上是一样的,这也是RMI的一个特点。

JMS一般只是一个点发出一个Message到Message Server,发出之后一般不会关心谁用了这个message。

所以,一般RMI的应用是紧耦合,JMS的应用相对来说是松散耦合应用。

 

8.3.网络传输问题:

    远程调用往往用在网络上,客户端和服务端是通过网络连接的。所有的数据都需要通过网络传输,因此就需要有一个网络传输层。网络传输层需要把Call ID和序列化后的参数字节流传给服务端,然后再把序列化后的调用结果传回客户端。只要能完成这两者的,都可以作为传输层使用。因此,它所使用的协议其实是不限的,能完成传输就行。尽管大部分RPC框架都使用TCP协议,但其实UDP也可以,而gRPC干脆就用了HTTP2。Java的Netty也属于这层的东西。

 

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

转载地址:http://bnesx.baihongyu.com/

你可能感兴趣的文章
直接刷脸?一元就能搞定会议签到!
查看>>
启动apache (OS 10022)提供了一个无效的參数。解决方式
查看>>
Maven问题合集
查看>>
湘潭大学1185 Bob's Problem
查看>>
oc6--类方法
查看>>
Android封装类似微信的顶部TitleBar弹出的PopupWindow代码
查看>>
【算法】汉诺塔问题
查看>>
kafka集群部署
查看>>
第三百七十八节,Django+Xadmin打造上线标准的在线教育平台—django自带的admin后台管理介绍...
查看>>
STM8串口初始化寄存器配置
查看>>
ReactNative常用组件汇总
查看>>
openfaas 安装(docker swarm 模式)
查看>>
nested exception is java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter
查看>>
“正在注册字体”问题解决
查看>>
[转]OPEN(SAP) UI5 学习入门系列之一:扫盲与热身(上)
查看>>
CSS/CSS3中的原生变量var详解以及布局响应式网页扩展
查看>>
windows10 更新后要输入2次密码才能进入系统
查看>>
iOS开发-OpenGL ES入门教程1
查看>>
平衡二叉树(AVL树)
查看>>
springboot 后台运行
查看>>