您好,欢迎访问三七文档
第7章分布式对象第7章分布式对象7.1消息传递与分布式对象的比较7.2基本分布式对象体系7.3分布式对象系统7.4远程过程调用7.5远程方法调用7.6RMI系统的体系结构7.7使用RMI构造分布式应用系统7.8RMI和socketAPI的比较第7章分布式对象到目前为止,在讨论分布计算时,主要介绍了消息传递范型的使用。利用这一范型,进程之间通过相互约定的某种协议来交换数据,协同完成预期的任务。基于该范型的应用程序接口,如java单播和组播socketAPI,提供了隐藏低层网络通信细节的抽象,允许使用相对简单的语法来编写IPC执行代码。本章将介绍提供抽象层次更高的一种范型---分布式对象第7章分布式对象7.1消息传递与分布式对象的比较对于进程间要通过消息交换来进行交互的网络服务来说,消息传递范型是非常适合的范型。由于下述原因,该范型所提供的抽象可能无法满足复杂网络应用的需求:•基本消息传递要求参与进程是紧耦合的。交互过程中,进程之间必须直接通信。如果进程之间的通信消息丢失,协作将失败。•消息传递范型是面向数据的范型。每个消息都包含按相互约定的某种格式封装的数据,并根据协议解释成请求或应答。每接收到一条消息,都会触发接收进程的一个动作。第7章分布式对象面向数据范型适用于网络服务和简单网络应用,但不适合包含大量混合请求和应答的复杂应用。在这类应用中,消息解释任务的工作量会相当大。分布式对象范型是在消息传递模型之上提供抽象的一种范型。该范型基于分布式系统中存在的对象。第7章分布式对象7.2基本分布式对象体系分布式对象系统的基本假设是最小化远程方法调用和本地方法调用之间的编程差异,进而允许在应用程序中,使用与本地方法调用类似的语法来调用远程方法。事实上,两者是存在一定区别的。因为远程方法调用涉及到两个独立进程之间的通信,因此需要解决数据封装、事件同步等关键问题。这些差异被封装在体系结构中。图7.2描述了支持分布式对象范型的基本体系结构。第7章分布式对象图7.2基本分布式对象系统对象客户客户代理运行时支持网络支持对象注册器对象服务器服务器代理运行时支持网络支持第7章分布式对象一个分布式对象由某一进程提供或输出。这里称该进程为对象服务器。必须在系统中为分布式对象注册提供一种设施,这里称之为对象注册器,或简称为注册器。为了访问某一分布式对象,对象客户进程从注册器中查询该对象的引用。这一引用被对象客户用来调用该远程对象的各种方法。从逻辑上看,对象客户是直接调用远程方法的。但实际上,这种调用是由一个客户代理来处理的,该代理通过与客户主机上的软件交互,提供分布式对象系统的运行时支持。该运行时支持负责向远程主机传送方法调用所需的进程间通信,包括封装需要传输给远程对象的参数数据。第7章分布式对象服务器端也需要类似体系结构,其中分布式对象系统的运行时支持处理消息接收和数据解封,并将调用转发到服务器代理。服务器代理通过与分布式对象交互,在本地调用方法,并将解封数据作为参数传人。该方法调用触发服务器主机上某些任务的执行。方法的执行结果(包括封装后的返回值数据),被服务器代理通过双方的运行时支持和网络支持,转发给客户代理。第7章分布式对象7.3分布式对象系统分布式对象范型已在分布式应用中广泛应用,并提供了大量基于该范型的工具集。包括:•JavaRMI(RemoteMethodInvocation,远程方法调用);•基于CORBA(CommonObjectRequestBrokerArchitecture,公共对象请求代理)的系统;•DCOM(DistributedComponentObjectModel,分布式组件对象模型);•支持SOAP(SimpleObjectAccessProtocol,简单对象访问协议)的工具集和API。第7章分布式对象7.4远程过程调用RMI源于远程过程调用(RemoteProcedureCall)范型。在远程过程调用模型中,过程调用由一进程向另一进程发出,被调用进程可驻留于远程系统,其中的数据作为参数传递。进程接收到调用后,执行该过程中的动作,调用者在调用结束时被通告,如果存在返回值,则该值将从被调用者传递到调用者。图7.3示出了RPC范型。第7章分布式对象图7.3远程过程调用范型远程过程进程A逻辑执行流proc1(arg1,arg2)进程B返回值第7章分布式对象目前,已经出现了一些基于RPC模型的应用程序编程接口。这些API采用与本地进程调用类似的语法和语义提供远程过程调用。为隐藏进程间通信细节,每个远程进程调用都要通过工具rpcgen变换,将本地过程调用转换到一个称为stub的软件模块,代表该过程调用及其参数的消息通过代理传送到远程机器。在另一方,代理接收到消息并将之转换成与远程过程调用相对应的本地过程调用。图7.4示出了将远程过程调用转换成本地过程调用,以及交互消息传递的实际情形。注意,双方都使用代理来提供进程间通信所需的运行时支持,完成必要的数据封装和socket调用。第7章分布式对象图7.4本地过程调用和远程过程调用的比较主机A1.主机A上的进程1调用主机B上的进程22.运行时支持将调用映射成主机A的代理的调用3.代理封装数据,并向主机B的代理发出IPC调用。4.主机B的代理解封接收到的数据,并向进程2发起调用。5.执行进程2中的代码,并向主机B的代理返回结果。6.代理封装返回的数据,并向主机A的代理发起IPC调用。7.代理接收到返回值,解封数据,并将返回值转发给进程1,该进程将重新启动其执行流。进程1进程2主机A进程1代理主机B进程2代理远程过程调用(未显示返回时的执行路径)本地过程调用执行流第7章分布式对象远程过程调用模型从20世纪80年代初出现以来,已经在网络应用中得到了广泛的使用。有两种针对该范型的主流API:一种是开放网络计算远程调用(OpenNetworkComputingRemoteProcedureCall),该API由20世纪80年代早期SunMicrosystems的RPCAPI演变而来;另一种为大家所熟知的API是开放小组分布式计算环境SCE(OpenGroupDistributedComputingEnviroment)RPC。这两种API都提供了工具rpcgen,用于将远程过程调用转换到stub的本地过程调用。第7章分布式对象尽管RPC有其重要的历史意义,但这里不打算具体介绍它,原因有二:•从RPC的名称中就可以看出,它是面向过程调用的方法调用机制。RPCAPI使用过程或函数调用语法。因此更适合于使用过程语言(如C)编写的程序,但不适合使用Java编写的程序。Java是本课程中采用的一种面向对象语言。•为取代RPC,Java提供了远程方法调用API,该API是面向对象的,并且其调用语法比RPC更简单。第7章分布式对象7.5远程方法调用JavaRMI(RemoteMethodInvocation)--Java的远程方法调用是Java所特有的分布式计算技术,它允许运行在一个Java虚拟机上的对象调用运行在另一个Java虚拟机上的对象的方法,从而使Java编程人员可以方便地在网络环境中作分布式计算。面向对象设计要求每个任务由最适合该任务的对象执行,RMI将这个概念更深入了一步,使任务可以在最适合该任务的机器上完成。第7章分布式对象RMI定义了一组远程接口,可以用于生成远程对象。客户机可以像调用本地对象的方法一样用相同的语法调用远程对象。RMIAPI提供的类和方法可以处理所有访问远程方法的基础通信和参数引用要求的串行化。远程方法调用类似于Sun公司1985年提出的远程过程调用(RPC)特征。RPC也要求串行化参数和返回数值数据,但由于没有涉及对象,情况比较简单。RPC和RMI之间的一个重要差别是RPC用快速而不够可靠的UDP协议,RMI用低速而可靠的TCP/IP协议第7章分布式对象RMI和CORBA的区别远程方法调用(RMI)和CORBA都是分布式计算技术,在进行分布式计算时各有其优缺点。CORBA被设计成一个能供所有编程语言使用的一个开放性说明,就是说一个机器上的Java客户可以要求另一个用SmallTalk或C++的机器服务。正是由于这种语言的独立性使得CORBA这么灵活和吸引人。为了适应语言独立性,CORBA采用了非常通用的标准作为其接口。在不同的语言中,远程调用、签名和对象的引入有各自不同的定义,所以CORBA必须尽可能的中立和开放。正是这种通用性是CORBA的一个弱点。当开发人员都采用CORBA时,他们要用一种新的标准定义语言接口,它要求开发者学习新的编程接口,从而减小了远程模型的透明性。第7章分布式对象RMI是为仅在Java的分布式计算中而开发的。远程调用的标准是为了Java和应用Java的自然Java签名和调用而开发的,这使得RMI对Java的开发者相当透明而且易于实现。RMI用Java语言紧密集成从而同CORBA相比能够提供非常好的容错能力及对异常的处理。尽管Java的RMI标准不像CORBA那样语言独立,但Java本身是一个独立的平台,这就使RMI在跨平台的分布软件开发中是一个很好的选择。第7章分布式对象7.6RMI系统的体系结构与RPCAPI类似,在JavaRMI体系结构中,为了将远程方法调用转换成本地方法调用,也要求代理软件模块提供相应的运行时支持,并处理底层进程间通信细节。在该体系结构中,客户及服务器方都提供三层抽象。端头/框架层(Stubs/Skeletons)、远程引用层(RemoteReferenceLayer)和传送层(Transport),如图所示:1)stub层:客户进程的远程方法调用被传递到代理对象stub。stub层位于应用层之下,负责解释客户程序发出的远程方法调用;然后将其转发到下一层(远程引用层RRL)。支持应用程序中的接口。第7章分布式对象第7章分布式对象客户机调用远程方法时,不是直接调用远程对象,而是调用本地stub的方法。Stub是远程对象的客户本地代表或代理人角色,在RMI中,stub与远程对象所实现的远程接口集相同。Stub保持与服务器方对象的连接。它将负责执行对远程对象的方法调用。Stub将参数数据串行化,将串行化的数据传递到调动流。客户方的RRL用调用流与服务器方的RRL通信。执行完远程方法调用后,RRL将串行化的返回值送回Stub,负责反串行化。第7章分布式对象2)框架(Skeleton)每个远程对象都可以有相应的skeleton,skeleton负责将调用分配给实际的远程对象实现。框架是与服务器方RRL接口的服务器方构件。框架接受客户机方RRL的方法调用请求。服务器方RRL要反调动发送到远程方法的任何变元。然后框架调用服务器方的实际对象实现。框架还负责接收来自远程对象的返回值并将其调动到调动流中。skeleton自java1.2版本以后,就被放弃而不用了。它的功能被“反射”机制所取代。在我们的讨论中,将继续使用skeleton作为一种概念描述。第7章分布式对象3)远程引用层(RemoteReferenceLayer)远程引用层(RRL)负责维护不与具体stub或框架模型相关的独立应用协议。这个灵活性使RRL的改变不会影响另外两层。RRL涉及低级传送接口,负责向端头和框架层提供流。RRL通过传送层用客户机方面和服务器方构件通信。客户机方构件包含远程服务器的特定信息。这个信息传递到服务器方构件,因此只依赖于服务方RRL。服务器方RRL负责引用语法和处理这些语法之后再向框架发送远程方法调用。客户机和服务器方构件之间的通信由传送层处理。第7章分布式对象RRL解释和管理客户发出的到远程服务对象的引用,并向下一层即传输层发起IPC操作,从而将方法调用传送给远程主机。将平台独立的stub/skeleton层映射到平台相关的传输层;实现远程引用协议。第7章分布式对象4)传送层(TransportLayer)传送层负责建立并维护客户机和服务器之间的连接。传送层接收客户机方RRL请求时,它寻找请求的远程对象的RMI服务器,然后传送层建立到这个服务
本文标题:第7章 分布式对象
链接地址:https://www.777doc.com/doc-4215420 .html