RMI代表远程方法调用。 这是一种允许位于在一个系统(JVM)中的对象访问/调用在另一个JVM上运行的对象的机制。
RMI用于构建分布式应用程序; 它提供Java程序之间的远程通信。 它在java.rmi
包中提供。
RMI应用程序的体系结构
在RMI应用程序中,我们编写了两个程序,一个服务器程序(位于服务器上)和一个客户机程序(位于客户端上)。
- 在服务器程序中,创建一个远程对象,该对象的引用可被客户端(使用注册表)使用。
- 客户端程序请求服务器上的远程对象,并尝试调用其方法。
下图显示了RMI应用程序的体系结构。
下面我们来讨论这个架构的组件。
- 传输层(Transport Layer) - 此层连接客户端和服务器。它管理现有的连接,并设置新的连接。
- 存根(Stub) - 存根是客户端上的远程对象的表示(代理)。 它位于客户端系统中; 它作为客户端程序的网关。
- 骨架(Skeleton) - 它位于服务器端的对象。 存根与此骨架通信以将请求传递给远程对象。
- RRL(远程参考层) - 它是管理客户端对远程对象的引用的层。
RMI应用程序的工作
以下几点总结了RMI应用程序的工作原理 -
- 当客户端调用远程对象时,它被存根最终传递给RRL。
- 当客户端RRL接收到请求时,它会调用对象
remoteRef
的一个名为invoke()
的方法。 它将请求传递到服务器端的RRL。 - 服务器端的RRL将请求传递到服务器上的最后调用所需对象的Skeleton(服务器上的代理)。
- 结果一直传递给客户端。
编组和解组
每当客户端调用接受远程对象上的参数的方法时,在通过网络发送之前,将参数捆绑到消息中。 这些参数可能是原始类型或对象。 在原始类型的情况下,将参数放在一起并附加标题。 如果参数是对象,那么它们被序列化。 这个过程被称为编组。
在服务器端,打包参数是未分组的,然后调用所需的方法。这个过程被称为解组。
RMI注册表
RMI注册表是放置所有服务器对象的命名空间。 每次服务器创建一个对象时,它会使用RMIregistry
(使用bind()
或reBind()
方法)注册此对象。 这些使用叫作绑定名称(bind name)的唯一名称进行注册。
要调用远程对象,客户端需要该对象的引用。客户端使用其绑定名称(使用lookup()
方法)从注册表中获取对象。
下图说明了整个过程 -
RMI目标
以下是RMI的目标 -
- 最小化应用程序的复杂性。
- 保护类型安全。
- 分布式垃圾收集。
- 最小化使用本地和远程对象之间的区别。