什么是Java RMI
RMI就是远程方法调用,通俗点讲,就是一种能够实现客户端调用服务端对象方法的远程调用技术,通过这种技术,客户端访问远程服务端的方法就感觉像是在本地调用自己的方法一样简单。
官方给出的关于Java RMI 的基本概念如下:Java RMI(Remote Method Invocation)- 远程方法调用,能够让客户端像使用本地调用一样调用服务端 Java 虚拟机中的对象方法。RMI 是面向对象语言领域对 RPC (Remote Procedure Call)的完善,用户无需依靠 IDL 的帮助来完成分布式调用,而是通过依赖接口这种更简单自然的方式。
RMI工作原理
一种典型的RMI调用如下图所示:
1. 服务端向RMI注册服务绑定自己的地址,
2. 客户端通过RMI注册服务获取目标地址,
3. 客户端调用本地的Stub对象上的方法,和调用本地对象上的方法一致,
4. 本地存根对象将调用信息打包,通过网络发送到服务端,
5. 服务端的Skeleton对象收到网络请求之后,将调用信息解包,
6. 找到真正的服务对象发起调用,并将返回结果打包通过网络发送回客户端。
RMI示例代码
服务端注册代码
1 | Hello obj = new HelloImpl(); // #1 |
说明:
1.初始化服务对象实例
2.通过UnicastRemoteObject.exportObject*生成可以与服务端通讯的Stub对象,
3.创建一个本地的RMI注册服务,监听端口为1099。该注册服务运行在服务端,也可以单独启动一个注册服务的进程,
4.将Stub对象绑定到注册服务上,这样,客户端可以通过 *Hello 这个名字查找到该远程对象。
客户端的服务发现
1 | Registry registry = LocateRegistry.getRegistry(); // #1 |
说明:
- 获取注册服务实例,在本例中,由于没有传入任何参数,假定要获取的注册服务实例部署在本机,并监听在 1099 端口上,
- 从注册服务中查找服务名为 Hello 的远程对象,
- 通过获取的 Stub 对象发起一次 RMI 调用并获得结果。