背景
分布式系统要求在不同地址空间(可能在不同主机上)运行的计算能够进行通信。对于基本的通信机制,Java TM编程语言支持套接字,它对于一般通信来说是灵活且足够的。但是套接字需要客户端和服务器参与应用程序级协议来对消息进行编码和解码以进行交换,并且此类协议的设计繁琐且容易出错。
套接字的替代方法是远程过程调用 (RPC),它将通信接口抽象为过程调用级别。程序员没有直接使用套接字工作,而是有一种调用本地过程的错觉,而实际上调用的参数被打包并发送到调用的远程目标。RPC 系统使用外部数据表示(例如 XDR)对参数和返回值进行编码。
然而,RPC 并不能很好地转化为分布式对象系统,其中需要驻留在不同地址空间中的程序级对象之间进行通信。为了匹配对象调用的语义,分布式对象系统需要远程方法调用或RMI。在此类系统中,本地代理(存根)对象管理对远程对象的调用。
Java 平台的远程方法调用系统是专门为在 Java 应用程序环境中运行而设计的。Java 编程语言的 RMI 系统假定 Java 虚拟机 (JVM) 的同类环境,因此系统可以尽可能利用 Java 平台的对象模型。
系统目标
在 Java 编程语言中支持分布式对象的目标是:
- 支持对不同虚拟机中对象的无缝远程调用
- 支持从服务器到小程序的回调
- 以自然的方式将分布式对象模型集成到 Java 编程语言中,同时保留大部分 Java 编程语言的对象语义
- 使分布式对象模型和本地 Java 平台的对象模型之间的差异显而易见
- 使编写可靠的分布式应用程序尽可能简单
- 保留 Java 平台运行时环境提供的类型安全
- 支持远程对象的各种引用语义;例如实时(非持久)引用、持久引用和延迟激活
- 维护由安全管理器和类加载器提供的 Java 平台的安全环境
所有这些目标的基础是一个通用要求,即 RMI 模型既简单又使用。