RMI的简单使用?

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

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

【RMI的简单使用?】程序员

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

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

1、背景介绍
     RPC (Remote Procedure Call):远程过程调用,用于一个进程调用另外一个进程中的过程,从而提供了过程的分布能力。服务器

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

2、知识剖析
     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。

3、常见问题
     1.如何使用rmi完成远程对象的调用
     2.如何使用springrmi完成远程对象的调用

4、编码实战
       详见视频。

5、扩展思考
      RPC和RMI的区别:

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

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

 6、参考文献
http://www.cnblogs.com/ygj093...

https://blog.csdn.net/lmy8626...
https://blog.csdn.net/shan9li...

7、更多讨论
     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分布式应用

相关文章
相关标签/搜索