什么是RMI,为什么要使用Rmi框架

1.背景介绍

RMI全称是Remote Method Invocation-远程方法调用,是纯Java的网络分布式应用系统的核心解决方案之一。Java RMI 支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

RMI目前使用Java远程消息交换协议JRMP进行通信。由于JRMP是专为Java对象制定的,用Java RMI开发的应用系统可以部署在任何支持JRE的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。

2.知识剖析

一个正常工作的RMI系统由下面几个部分组成:

1·远程服务的接口定义

2·远程服务接口的具体实现

3·桩(Stub)和框架(Skeleton)文件

4·一个运行远程服务的服务器

5·一个RMI命名服务,它允许客户端去发现这个远程服务

6·类文件的提供者(一个HTTP或者FTP服务器)

7·一个需要这个远程服务的客户端程序

以Java原生态的方法编写 RMI分布式应用程序的步骤主要包括以下几步:

(1) 将远程类的功能定义为Java接口。在Java中,远程对象是实现远程接口的类的实例。在远程接口中声明每个要远程调用的方法。远程接口具有如下特点:1) 远程接口必须声明为public。如果不这样,则除非客户端与远程接口在同一个包内,否则当试图装入实现该远程接口的远程对象时会得到错误结果。2) 远程对象扩展java.rmi.Remote接口。3) 除了所有应用程序特定的例外之外,每个方法还必须抛出java.rmi.RemoteException

  (2) 编写和实现服务器类。该类是实现(1)中定义的远程接口。所以在该类中至少要声明实现一个远程接口,并且必须具有构造方法。在该类中还要实现远程接口中所声明的各个远程方法。

(3) 编写使用远程服务的客户机程序。在该类中使用java.rmi.Naming中的lookup()方法获得对远程对象的引用,依据需要调用该引用的远程方法,其调用方式和对本地对象方法的调用相同。

实现了服务器和客户机的程序后,就是编译和运行该RMI系统。其步骤有:

(1) 使用javac编译远程接口类,远程接口实现类和客户机程序。

(2) 使用rmic编译器生成实现类的stub和skeleton。

(3) 启动RMI注册服务程序rmiregistry。

(4) 启动服务器端程序。

(5) 启动客户机程序。

RMI的主要优点:

1. RMI是Java编写的, 具有 “编写一次,到处运行 ” 的特性。任何基于RMI的系统均可100%地移植到 任何Java虚拟机上

2. 面向对象:RMI可将完整的对象作为参数和返回值进行传递直接通过网络传输对象数据。

3.可移动属性:RMI可将属性从客户机移动到服务器,或者从服务器移到客户机。

4.设计方式:对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能。

5.安  全:RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。

请记住以下三点,

1. 利用Spring来实现RMI非常简单,不用实现remote接口,也不用调用rmic编译stub和skeleton。

2. 服务端可以定义org.springframework.remoting.rmi.RmiServiceExporter类完成RMI服务器实现。

3. 客户端只要定义org.springframework.remoting.rmi.RmiProxyFactoryBean,告知rmi的url和接口。

分布式和集群

分布式:一个业务分拆多个子业务,部署在不同的服务器上。

集群:同一个业务,部署在多个服务器上

分布式一般是指将一个大的任务划分成不同的小的任务来完成,每一个小的任务是不相同的,也可以称为一个分布式的节点,这些节点可以是在同一台物理机上,也可以在不同的物理机上,分布式的节点之间利用rmi http webservice ebj, jms等等方式来完成通信。

集群是将同样应用部署多个,每一个应用完成同样的任务。 所以说 分布式的每一个节点都可以做集群,这样就可以保存高稳定性,因为光是分布式,一旦其中一个节点死掉,那整个任务就完成不了了。如果分布式的用来完成不同任务的节点有多个相同的在同时运行,这样就不用担心节点死掉的问题了。

3.常见问题

如何使用Spring RMI发布服务

4.解决方案

1. 服务端使用Spring 配置来注入RmiServiceExporter对象来发布服务

6.扩展思考

服务器重启之后,客户端再连接就报错了

RMI客户客户端与服务端第一次建立连接的时候会在客户端生成一个stub,我们称之为存根,并且在服务端注册,以后RMI服务端与客户端都会基于这个文件进行通讯,当客户端需要访问服务端的时候会首先扫描这个文件,然后访问客户端,当客户端验证的时候发现注册了就会通过,如果发现没有注册就会拒绝本次访问,所以当服务端重启之后,曾经所有stub注册都会失效,所以客户端会一直访问不到客户端,必须重新启动,以获取新的stub,不过RMI接口下有避免这种情况的相关配置.

7.参考文献

文献一:  http://www.blogjava.net/zhenyu33154/articles/320245

文献二:  https://blog.csdn.net/QB2049_XG/article/details/3278672

猜你喜欢

转载自blog.csdn.net/qq_42008387/article/details/82353576