RMI的简单介绍

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

今天给大家分享一下,修真院官网JAVA任务七,扩展思考中的知识点——RMI的简单使用?

一、背景介绍

     RPC (Remote Procedure Call):远程过程调用,用于一个进程调用另一个进程中的过程,从而提供了过程的分布能力。

     RMI(Remote Method Invocation):远程方法调用,即在RPC的基础上有向前迈进了一步,提供分布式对象间的通讯。允许运行在一个java 虚拟机的对象调用运行在另一个java虚拟机上对象的方法。这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。

二、知识剖析

     RMI的大致工作原理:

     服务器端提供服务,服务中要暴露可以调用的远程方法,以接口的形式表现,这样在客户端可以通过服务接口来调用远程方法,实现复杂的业务逻辑。在服务器端,首先要对接口中提供的方法实现,以便客户端调用能够完成一定的业务逻辑;接着需要生成Skeleton,在Skeleton中真正地实现了对商业方法的调用,完成了客户请求的调用的过程,将获取到的调用方法的结果通过序列化机制返回给客户端,进行应答。在客户端,通过Stub来接收服务器返回的数据(对象),即在这里进行了反序列化,也就是读取网络传输的字节流,进而进行重构。在Skeleton和Stub中,都对网络通信进行了处理,例如建立套接字,建立网络连接,为实际的业务需要做好准备。

     RMI使用过程中需要注意的问题:

    1.数据传值问题:我们都知道在Java程序中引用类型(不包括基本类型)的参数传递是按引用传递的,对于在同一个虚拟机中的传递时是没有问题的,因为的参数的引用对应的是同一个内存空间,但是对于分布式系统中,由于对象不再存在于同一个内存空间,虚拟机A的对象引用对于虚拟机B没有任何意义,这时候我们就要将引用传递更改为值传递,也就是将对象序列化为字节,然后使用该字节的副本在客户端和服务器之间传递;

     2.远程对象的发现问题:在调用远程对象的方法之前需要一个远程对象的引用,如何获得这个远程对象的引用在RMI中是一个关键的问题,如果将远程对象的发现类比于IP地址的发现可能比较好理解一些。在我们日常使用网络时,基本上都是通过域名来定位一个网站,但是实际上网络是通过IP地址来定位网站的,因此其中就需要一个映射的过程,域名系统(DNS)就是为了这个目的出现的,在域名系统中通过域名来查找对应的IP地址来访问对应的服务器。那么对应的,IP地址在这里就相当于远程对象的引用,而DNS则相当于一个注册表(Registry)。而域名在RMI中就相当于远程对象的标识符,客户端通过提供远程对象的标识符访问注册表,来得到远程对象的引用。这个标识符是类似URL地址格式的:rmi://host:port/name。

三、常见问题

     1.如何使用rmi完成远程对象的调用
     2.如何使用springrmi完成远程对象的调用

四、编码实战

       详见视频。

五、扩展思考

      RPC和RMI的区别:

     1、方法调用方式不同:RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用;PC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回。 

     2、适用语言范围不同:RMI只用于Java;RPC是网络服务协议,与操作系统和语言无关。

 六、参考文献

http://www.cnblogs.com/ygj0930/p/6542811.html

https://blog.csdn.net/lmy86263/article/details/72594760
https://blog.csdn.net/shan9liang/article/details/8995023

七、更多讨论

     1.rmi注册服务的方式有哪些?

     LocateRegistry 类、 java.rmi.Naming 类、 java.naming.InitialContext 类都可以注册服务。

     2.java.rmi.Naming类扮演了什么样的角色?

     java.rmi.Naming类用来存储和获取在远程对象注册表里面的远程对象的引用。Naming类的每一个方法接收一个URL格式的String对象作为它的参数。

     3.rmi的开发流程?

       1) 定义远程接口
  2) 实现远程接口
  3) 准备远程调用的服务器对象
  4) 生成残根Stub(客户代理)和框架Skeleton(服务器实体)
  5) 用rmiregistry找到远程对象
  6) 运行测试RMI分布式应用
  

八、视频教程

https://v.qq.com/x/page/m0745ijs01n.html

快点加入我们吧:http://www.jnshu.com/login/1/23284132

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值