分布式对象和远程方法调用
分布式对象和远程方法调用
(Risun 2004-6-23)
分布式对象是将面向对象的编程模型应用到分布式应用中的一种程序模型。在面向对象的编程模型中,系统由若干个对象组成,系统的运行通过对象之间的消息传递和事件通知来实现。在分布式系统中,如何应用面向对象的模型,屏蔽分布式进程之间相互通信的细节,为系统运行和上层开发提供一致的程序模型?这就是分布式对象和远程方法调用要解决的问题。
RMI基本模型
实现分布式对象和远程调用,学要解决以下问题:
1、 如何在一个应用一个远程进程中的对象
2、 进程内部对象间的方法调用参数和结构一个直接通过堆或栈进行传递,如何传递远程对象方法调用的参数和结构
解决这两个问题的,实现分布式对象和远程方法调用的模型如下:
图1
进程A、B在不同的主机上,进程A内的对象AO需要调用进程B内对象BO的方法,过程是:对象AO获得对象BO远程代理的应用,调用BO远程代理的方法,代理将这个方法调用编码(包括方法和参数),发送到对象BO在本机的残根,残根解码,调用对象BO的相应方法,结果放回的过程和调用过程相反。这样对象AO获得远程对象BO代理的引用后就可以和使用本地对象一样调用远程对象的方法,网络通信的细节由BO的远程代理和本地残根处理。
不同对象的远程代理和本地残根其角色和工作方式是相同的,因此,提供相应的智能工具来处理这部分代码的实现是可能的,分布式开发人员只需关注本地对象的实现即可。
RMI设计和实现
根据上面的基本模型,可以设计和实现相应的远程对象及其RMI。
调用语义
对象远程代理和本地残根之间通过网络进行数据传输,由于网络的缺陷,代理到残根之间的消息可能会:1、遗漏,2、重复,3、损坏。
在设计RMI时可以指定相应的请求-应答协议来处理消息故障,从而实现不同的远程调用语义:1、至多一次语义,调用者或者接受一个异常(此时方法执行一次或者没有执行)或者接受返回结构(此时方法执行恰好一次)。2、至少一次语义,调用者或者接受一个异常或者接受返回结果(此时方法被执行至少一次)。
本地调用是恰好一次的语义。对于调用者来说,对本地调用和远程调用应该是透明的。如何屏蔽本地调用和远程调用之间的差别?这应该是远程对象体系(包括残根和代理)的责任。远程对象体系应该根据满足双方协定的调用语义给调用者返回正确的执行结果或者错误代码或者抛出某种异常。
RMI实现模型
图2
通信模块
通信模块负责进程间的通信,用到消息中的消息类型、请求ID和远程对象引用3个参数。消息类型指示请求或应答消息,请求ID用以控制和实现各种请求语义的协议。通信模块根据远程对象引用选择正确的调度程序。
图3 消息格式:
对象应用模块
对象应用模块负责消息中远程对象引用和本地对象引用之间的转化以及远程对象引用的产生。消息中的远程对象引用标志的格式通常为:
在模块中会有一个记录远程对象引用标志到对象引用之间关系的表
RMI中间层
包括远程对象客户端代理,服务器端调度程序和服务器端骨架
代理:请求和应答的编码解码。
调度程序:接受通信模块的请求,根据方法ID选择骨架中的恰当方法。
骨架:编码解码调用参数,调用对象相应的接口,完成服务。
对象实现
远程对象的服务器类实现,通常叫做伺服器。
绑定程序:
绑定程序作为一个独立的服务,维护一张名字到远程对象引用标志的表格,可以在其中登记或查询相应名称的服务。
Java RMI实例研究
远程接口
interface PerfectTimeI extends Remote {
long getPerfectTime() throws RemoteException;
}
实现
public class PerfectTime
extends UnicastRemoteObject
implements PerfectTimeI {
// Implementation of the interface:
public long getPerfectTime()
throws RemoteException {
return System.currentTimeMillis();
}
// Must implement constructor
// to throw RemoteException:
public PerfectTime() throws RemoteException {
// super(); // Called automatically
}
// Registration for RMI serving. Throw
// exceptions out to the console.
public static void main(String[] args)
throws Exception {
System.setSecurityManager(
new RMISecurityManager());
PerfectTime pt = new PerfectTime();
Naming.bind(
"//peppy:2005/PerfectTime", pt);
System.out.println("Ready to do time");
}
} ///:~
产生stub和skeleton
rmic c15.rmi.PerfectTime
客户端
public class DisplayPerfectTime {
public static void main(String[] args)
throws Exception {
System.setSecurityManager(
new RMISecurityManager());
PerfectTimeI t =
(PerfectTimeI)Naming.lookup(
"//peppy:2005/PerfectTime");
for(int i = 0; i < 10; i++)
System.out.println("Perfect time = " +
t.getPerfectTime());
}
}
在Java1.2版中,利用Java的反射功能中Method对象,创建出通用的调度程序和骨架,客户代理则由rmic根据伺服类来创建。
CORBA研究
参考文献:
【1】 分布式系统概念与设计,金蓓鸿 译 机械工业出版社 2004, 01
【2】 Java编程思想第二版
posted on 2004-06-23 23:37 哲学 艺术 程序 人生 阅读(957) 评论(0) 编辑 收藏 举报