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