Java RMI - 简介
RMI 代表远程方法调用。 它是一种允许驻留在一个系统 (JVM) 中的对象访问/调用在另一个 JVM 上运行的对象的机制。
RMI用于构建分布式应用程序; 它提供Java程序之间的远程通信。 它在 java.rmi 包中提供。
RMI 应用程序的架构
在 RMI 应用程序中,我们编写两个程序,一个服务器程序(驻留在服务器上)和一个客户端程序(驻留在客户端)。
在服务器程序内部,创建一个远程对象,并且该对象的引用可供客户端使用(使用注册表)。
客户端程序请求服务器上的远程对象并尝试调用其方法。
下图显示了 RMI 应用程序的体系结构。
![RMI 架构](/java_rmi/images/rmi_architecture.jpg)
现在让我们讨论该架构的组件。
传输层 − 该层连接客户端和服务器。 它管理现有连接并设置新连接。
存根 − 存根是客户端远程对象的表示(代理)。 它驻留在客户端系统中; 它充当客户端程序的网关。
骨架 − 这是驻留在服务器端的对象。 存根与此骨架通信以将请求传递到远程对象。
RRL(远程参考层) − 它是管理客户端对远程对象的引用的层。
RMI 应用程序的工作
以下几点总结了 RMI 应用程序的工作原理 −
当客户端调用远程对象时,存根会接收该调用,并最终将此请求传递给 RRL。
当客户端 RRL 收到请求时,它会调用对象 remoteRef 的名为 invoke() 的方法。 它将请求传递给服务器端的 RRL。
服务器端的RRL将请求传递给Skeleton(服务器上的代理),Skeleton最终调用服务器上所需的对象。
结果会一路传回客户端。
编组和解组
每当客户端调用接受远程对象参数的方法时,参数都会在通过网络发送之前捆绑到消息中。 这些参数可以是原始类型或对象。 对于原始类型,参数被放在一起并附加一个标头。 如果参数是对象,那么它们将被序列化。 此过程称为编组。
在服务器端,打包的参数被解绑,然后调用所需的方法。 此过程称为解组。
RMI 注册表
RMI 注册表是放置所有服务器对象的名称空间。 每次服务器创建一个对象时,它都会向 RMIregistry 注册该对象(使用 bind() 或 reBind() 方法)。 它们使用称为绑定名称的唯一名称进行注册。
要调用远程对象,客户端需要该对象的引用。 此时,客户端使用其绑定名称(使用 lookup() 方法)从注册表中获取对象。
下图解释了整个过程 −
![注册](/java_rmi/images/registry.jpg)
RMI 的目标
以下是 RMI 的目标 −
- 最大限度地降低应用的复杂性。
- 保持类型安全。
- 分布式垃圾收集。
- 尽量减少使用本地对象和远程对象之间的差异。