图中显示了一个分布式的对象模型。在这个模型中,如果一个对象不仅被本地访问,而且还能够被远程访问,就称为远程对象。
如果一个对象只能被本地访问,就被称为本地对象。
图中白色的椭圆表示本地对象,深色的椭圆表示远程对象。
图中实线表示常规的本地方法调用,虚线表示远程方法调用。
为了保证各个对象之间的可靠地发送消息,该模型的实现通常使用TCP协议作为网络传输层的通信协议。
一般来说远程对象分布在服务器端,提供各种通用的访问。
对象模型的实现系统的功能:
1.把分布在不同节点上的对象之间发送的消息转换为字节序列,这个过程称为编组。
2.通过套接字建立连接并且编组后发送。
3.处理网络连接和传输时候的各种故障。
4.为分布在不同节点上的对象提供分布式垃圾收集机制。
5.为远程方法调用提供安全检查机制。
6.服务端运用多线程或者非阻塞通信机制,确保远程对象具有良好的并发性能,同时被多个客户访问。
7.创建于特定领域相关的各种本地对象和远程对象。
一些现成的,成熟的分布式对象模型的框架:
1.RMI(Remote Method Invoke,远程方法调用):JDK提供一个完善的,简单易用的远程方法调用框架,它要求客户端和服务端都是java程序。
2.CORBA(Common Object Request Broker Architecture,通用对象请求代理体系结构):分布式对象模型的通用框架,允许不同的语言编写
的对象能够彼此通信。
3.SOAP(Simple Object Access Protocol,简单对象访问协议):允许异构的系统之间能够彼此通信,以xml作为通信语言。一个系统能够访问另一个
系统对外公布的web服务。
RMI框架封装了所有底层通信细节,并且解决了编组,分布式垃圾回收,安全检查和并发性等通用问题。开发人员只需要专注于开发与特定问题领域相关的
各种本地对象和远程对象。
RMI对象为远程对象分布生成了客户端代理和服务端代理。位于客户端的代理类叫做存根(Stub),位于服务端的代理类叫做骨架(Skeleton)。
客户端调用远程对象的一个方法的时候,实际上是调用本地的存根对象的对应的方法。
存根对象与远程对象实现了相同的接口。
存根对象采用平台无关的编码方式(java序列化机制)对方法的参数进行编组。
存根对象把以下信息发送给服务器:
1.被访问的远程对象的名字。
2.被调用的方法的名字。
3.编组后的参数的字节序列。
服务器接受到这些信息后,由骨架对象来进行处理:
1.反编组参数。
2.定位要访问的对象。
3.调用远程对象的相应方法。
4.获取方法的结果或者异常信息,进行编组。
5.发送给客户。