Java RMI

350 阅读2分钟

官方文档docs.oracle.com/javase/6/do…

RPC 概念juejin.cn/post/707307…

简介

Java RMIRemote Method Invocation)- 远程方法调用,能够让客户端像使用本地调用一样调用服务端 Java 虚拟机中的对象方法。RMI 是面向对象语言领域对 RPCRemote Procedure Call)的完善,用户无需依靠 IDL 的帮助来完成分布式调用,而是通过 依赖接口 这种更简单自然的方式。

基本概念

Java RMI 是 Java 领域创建 分布式应用 的技术基石。后续的 EJB 技术,以及现代的分布式服务框架,其中的基本理念依旧是 Java RMI 的延续。在 RMI 调用中,有以下几个核心的概念:

  1. 通过接口进行远程调用
  2. 通过客户端的 Stub 对象和服务端的 Skeleton 对象的帮助将远程调用伪装成本地调用
  3. 通过 RMI 注册服务完成服务的注册和发现

对于第一点,客户端需要依赖接口,而服务端需要提供该接口的实现。

对于第二点,在 J2SE 1.5 版本之前需要通过 rmic 预先编译好客户端的 Stub 对象和服务端的 Skeleton 对象。在之后的版本中,不再需要事先生成 StubSkeleton 对象。

JDK实现

java.rmi.* 包提供 RMI 实现

原理

一个典型的 RMI 调用:

  1. 服务端向 RMI 注册服务绑定自己的地址,
  2. 客户端通过 RMI 注册服务获取目标地址,
  3. 客户端调用本地的 Stub 对象上的方法,和调用本地对象上的方法一致,
  4. 本地 Stub 对象将调用信息打包,通过网络发送到服务端,
  5. 服务端的 Skeleton 对象收到网络请求之后,将调用信息解包,
  6. 然后找到真正的服务对象发起调用,并将返回结果打包通过网络发送回客户端。

image.png

参考文献

dubbo.apache.org/zh/blog/201…