第五讲CORBA.ppt

上传人:本田雅阁 文档编号:3122787 上传时间:2019-07-13 格式:PPT 页数:75 大小:509.53KB
返回 下载 相关 举报
第五讲CORBA.ppt_第1页
第1页 / 共75页
第五讲CORBA.ppt_第2页
第2页 / 共75页
第五讲CORBA.ppt_第3页
第3页 / 共75页
第五讲CORBA.ppt_第4页
第4页 / 共75页
第五讲CORBA.ppt_第5页
第5页 / 共75页
点击查看更多>>
资源描述

《第五讲CORBA.ppt》由会员分享,可在线阅读,更多相关《第五讲CORBA.ppt(75页珍藏版)》请在三一文库上搜索。

1、第 五 讲 CORBA,内 容,一、CORBA概述 二、GIOP-IIOP 三、OMG-IDL,Dynamic Invocation,ORB Interface,Skeleton,Object Adapter,ORB Core,Client,Object Implementation,一、CORBA概述,Common Object Request Broker Architecture 公共对象请求代理结构,Stub,对象请求代理(ORB) 不要求将ORB实现为单独的构件 而仅定义其接口 任何提供正确接口的ORB实现都是可以接受的 ORB的具体实现包括: ORB Core、IDL编译器、IR、

2、Object Adapter ORB可以有多种实现 它们对对象引用有不同的表示方法 并且有不同的调用执行方法,提供对象的基本表示 以及请求的通讯 特别地:编排/还原(Marshal/Unmarshal) 将高层语言的参数等表示转换为 便于底层网络传输的形式,ORB核心(ORB Core),客户(Client) (对象的)客户访问对象的对象引用 并且调用对象上的操作 客户只知道对象的逻辑结构 根据它的接口,并通过调用感受对象的行为 尽管一般认为客户是向对象发出请求的程序或进程 但是客户只是相对于特定对象而言的,是一个相对概念 一个对象的实现可以是其它对象的客户,客户,客户,服务器,服务器,对象实

3、现 通过 为 对象实例 定义 数据 和 为 对象方法 定义 代码 提供 对象的语义 对象可以具有不同的实现方式,包括: 单独的服务器 库 每个方法的程序 封装应用程序 面向对象的数据库 等等 对象实现不依赖于ORB或者客户调用对象的方式 对象实现可以 通过 选择Object Adapter 达到 选择与ORB相关服务的接口 的 目的,对象实现(Object Implementation),指代(Stub) 由IDL编译器根据IDL文件生成 客户访问对象的操作主要方式 实现对象位置透明性 向非面向对象语言映射时 将为每个接口类型产生一个stub编程接口 面向对象的编程语言不需要stub接口 它通

4、过伪对象的方式提供访问对象的操作。,动态接口(Dynamic Invocation) 客户指定要调用的对象、要执行的操作和调用或调用序列 中操作的参数集,而不是调用特定于特殊对象上特殊操作的 stub 子程序。 客户代码必须提供要执行操作的信息和传送参数的类型 动态调用接口的特性可能因编程语言映射的不同而不同 客户通过静态还是动态接口发出请求 对于对象实现是透明的,CORBA_Create_request(.) CORBA_Request_add_arg(.) CORBA_Request_add_arg(.) CORBA_Request_invoke(.) CORBA_Request_dele

5、te(.),骨架(Skeleton) 由IDL编译器根据IDL文件生成 对象适配器访问对象实现中方法的主要形式 对于一种特定映射语言,以及可能的特定对象适配器 Skeleton 与 stub 不是必然对应的 客户也可以通过动态调用接口发出请求 但也可以编写不使用skeleton调用实现方法的对象适配器,对象适配器(Object Adaptor) 对象适配器是 对象实现 访问ORB所提供服务的主要方式 ORB通过对象适配器提供的服务通常包括: 生成和解释对象引用 方法调用 交互的安全性 对象和实现激活及取消激活 将对象引用映射到实现 注册实现 对象粒度、寿命、策略、实现风格等的明显区别 使得 O

6、RB核心很难为所有对象提供方便和有效的单一接口 通过对象适配器 ORB可以将一组特定的对象实现作为目标,ORB Interface,ORB操作 对象引用操作 ORB及OA的初始化,ORB接口是客户与服务器都可能够使用的操作,它不依赖于任何特定的对象适配器和对象引用 所提供的主要功能(操作)包括:,因为 对象引用是不透明的 而且各ORB之间不一样 所以 对于对象引用的长期存储 或 对象引用的通信(除激活之外)来说 对象引用不是一个很方便的值 因而必须解决两个问题: 允许对象引用转换成 一个客户可以存储在其他介质上的值 并确保该值以后能够转换为正确的对象引用,ORB操作:对象引用与字符串的转换,可

7、以通过object_to_string操作 把一个对象引用转化为一个字符串 该字符串值就可以以任何字符串所能被处理的方式 进行存储或通信 string_to_object操作 接受由object_to_string产生的字符串 并返回相应的对象引用,对象引用操作 有一些操作可以在所有对象上进行 它们并不是通常意义上的操作 因为 这些操作直接由ORB实现 而并不传递到对象实现端 我们将以在对象引用上的操作的方式 来讨论这些操作 尽管它们的接口实际上依赖于语言绑定,interface Object / PIDL InterfaceDef get_interface (); boolean is_n

8、il(); Object duplicate (); void release (); boolean is_a (in string logical_type_id); boolean non_existent(); boolean is_equivalent (in Object other_object); unsigned long hash(in unsigned long maximum); ,这样的操作包括:,ORB与OA初始化 当应用程序要求CORBA环境时 它需要一种获得ORB和OA对象引用的机制 这样的机制有两个作用: 把应用程序初始化到ORB和OA环境 向应用程序返回OR

9、B和OA对象引用 以便将来使用ORB和OA操作,2、ORB实现方式,位于客户和对象实现内部的ORB 如果有合适的通讯机制,那么ORB 可以 在客户和对象实现的程序中实现 客户中的stub使用位置透明的IPC机制或者直接访问地点服务 建立与实现的通讯 与实现关联的代码负责为客户设置合适的数据库(操作定位),基于服务器的ORB 所有客户和实现可以与一个或多个服务器通讯 服务器的任务是将请求从客户发送到对象实现 就底层操作系统而言,ORB可以是普通的程序 并且可以使用普通的IPC与ORB通讯 这是主要的ORB实现方式,优点: 客户与服务器目标码大小适度 便于配置,基于系统的ORB 为增强安全性、健壮

10、性和性能 可以将ORB作为底层操作系统的基本服务 对象引用可以永远不变,从而减少了每次请求时验证的开销 由于操作系统可以知道客户和实现的地点及接口 因此可以实现许多不同的优化 例如当客户与实现在同一台机器上时,可以省缺编排活动 基于库的ORB 对于小型、并且其实现可以共享的对象,实现可以在库中,二、GIOP-IIOP,1、GIOP概述 2、CDR 3、GIOP消息格式 4、IIOP 5、IIOP IOR,1、 GIOP概述,公共数据表示 GIOP消息格式,GIOP包含的要素:,目前已经被广泛地采纳 经被ISO组织采纳,成为一种工业标准 (ISO/IEC 19500-2),公共数据表示,CDR(

11、Common Data Representation)是传输语法 它将用OMG IDL定义的数据类型映射到 双向的低层表示 以便在代理之间 进行传输,少量、简单消息 仅仅用八个消息格式 GIOP就可以 支持ORB之间的全部CORBA功能 以及 支持对象地点服务的 扩展功能 动态迁移 和 对通讯资源的管理 GIOP语义不要求格式或绑定协议 在大多数情况下 客户可以在打开连接后立即向对象发送请求,GIOP消息特点,动态对象定位 许多ORB的体系结构 允许 对象实现在其生命期内 在不同地点 被激活 并且 允许动态迁移对象 GIOP消息为对象定位和迁移提供支持 但在不需要或不适合ORB的体系结构时 不

12、要求ORB实现这样的机制,完全的CORBA支持 GIOP消息直接支持CORBA要求的所有功能和行为 包括例外情况报告、传送操作环境和远程对象引用操作 (例如CORBA:Object:get_interface) GIOP支持传送特定于服务的环境 例如由事务服务定义的事务环境 该机制的设计目的是 支持要求在请求中隐式传送与服务相关环境的任何服务,2、 公共数据表示(CDR),CDR有如下功能: 可变的字节次序 有相同字节次序的机器 可以在不进行字节交换的情况下进行消息交换 当与字节次序不同的机器进行通讯时 消息发起者决定消息字节次序 接收者负责交换字节以便匹配它的本地次序 每个GIOP消息(以及

13、CDR封装)包含 指出正确字节次序的标记,对齐的主类型 在GIOP消息内基本OMG IDL数据类型 在它们的自然边界对齐 这样强制在内存中进行数据对齐的体系结构 可以有效地处理它们 完整的OMG IDL映射 CDR描述所有OMG IDL数据类型 (包括可传输的伪对象,例如TypeCode)的表示 如果需要,CDR为CORBA Core规范中 表示未定义或与实现有关的数据类型定义表示方法,对齐:,OMG IDL 原始数据类型的对齐要求,字节顺序:,MSB,大结尾(Big-Endian),小结尾(Little-Endian),LSB,MSB,LSB,short,long,MSB,LSB,LSB,M

14、SB,long long,MSB,LSB,LSB,MSB,0,0,0,0,0,0,1,1,3,3,7,7,3、 GIOP 消息格式(1.2版),GIOP消息类型(8类),GIOP头,消息头,消息体,GIOP消息格式:,struct MessageHeader char magic 4; /4字节 Version GIOP_version; /2字节 Octec flags; /1字节 octet message_type; /1字节 unsigned long message_size; /4字节 ;,(0) GIOP消息头,Magic:标识GIOP消息,其值一致为:“GIOP”,GIOP_v

15、ersion: 消息使用的GIOP的版本号 主版本号为1,副版本号为2,长12个字节,Flags是一个8位字节 最低第一位指示消息后续元素的字节顺序 最低第二位指示是否有更多的后续段,message_type指示消息的类型,message_size指示消息中消息头后跟着的字节数 不包含12字节的消息头,(1)请求消息(Request),GIOP消息头 请求消息头 请求消息体,struct RequestHeader_1_2 unsigned long request_id; octet response_flags; octet reserved3; TargetAddress target;

16、 string operation; IOP:ServiceContextList service_context; ;,包含元素:,请求消息头格式:,request_id: 用于将应答消息与请求消息相关联 response_flags:如果请求期待一个应答消息, 则response_flags的最低位置为1 reserved3:保留 Target:标识被调用的目标对象(与IOR密切相关) Operation:被调用操作的IDL标识符。 service_context:包含需要从客户端传送到服务器 端的上下文信息 它被作为一个“隐藏”的参数传递,请求消息体被编排为CDR,并紧接在请求消息头之后

17、 由IDL定义的操作: Double example(in short m, out string str, inout Principal p); 请求消息体等价于结构: struct example_body short m; Principal p; ,(2)应答消息(Reply),GIOP消息头 应答消息头 应答消息体,包含元素:,struct ReplyHeader_1_2 unsigned long request_id; ReplyStatusType_1_2 reply_status; IOP:ServiceContextList service_context; ;,应答消息

18、头格式:,request_id: 用于将应答消息与请求消息相关联 它包含与相应请求相同的request_id值 reply_status:指示相关联的请求的完成状态,而且决定了应答消息体的部分内容。 完成状态包括: NO_EXCEPTION USER_EXCEPTION SYSTEM_EXCEPTION LOCATION_FORWARD LOCATION_FORWARD_PERM NEEDS_ADDRESSING_MODE service_context:包含需要从服务器端传送到客户端的 上下文信息,应答消息体被编排为CDR,并紧接在应答消息头之后 由IDL定义的操作: Double exam

19、ple(in short m, out string str, inout Principal p); 的应答消息体等价于结构: struct example_body double return_value; string str; Principal p; ,GIOP消息头 撤消请求消息头,(3)撤消请求消息(CancelRequest),包含元素:,struct CancelRequestHeader unsigned long request_id; ;,撤消请求消息头格式:,(4)定位请求消息(LocateRequest),包含元素:,GIOP消息头 定位请求消息头,定位请求消息头格

20、式: struct LocateRequestHeader_1_2 unsigned long request_id; TargetAddress target; ;,(5)定位应答消息(LocateReply),包含元素:,GIOP消息头 定位应答消息头 定位应答消息体,定位应答消息头格式:,struct LocateReplyHeader_1_2 unsigned long request_id; LocateStatusType_1_2 locate_status; ;,(6)关闭连接消息(CloseConnection),(7)消息错误消息(MessageError),(8)分段消息(

21、Fragment),仅包含GIOP消息头,仅包含GIOP消息头,当在写消息头的消息构造阶段无法确定消息长度时 可采用分段机制,4、IIOP,OMG为GIOP指定的基准传输协议是TCP/IP 用于支持TCP/IP的库的特定API可以不同 GIOP消息传输到TCP/IP的映射称为 Internet Inter-ORB协议(IIOP) 能够接受对象请求和提供对象位置的代理在 IOR中 公布TCP/IP地址 一旦建立起连接 客户可以向 socket 写入Request、LocateRequest、 CancelRequest等消息 服务器可以向 socket 写入Reply、LocateReply、

22、CloseConnection等消息,module IIOP / IDL struct Version char major; char minor; ; struct ProfileBody Version iiop_version; string host; unsigned short port; sequence object_key; sequence components; ; ;,5、IIOP IOR,IP、TCP、IIOP协议等之间的关系:,TCP头,IP头,GIOP头,IDL表示,消息头,消息体,1、IDL概述 2、IDL词法 3、IDL语法 4、IDL规范,三、OMG-ID

23、L,1、IDL概述 IDL: Interface Definition Language 接口定义语言 用OMG IDL编写的接口定义 较完整地定义了接口 并且 指定了每个操作的参数 OMG IDL接口提供的信息 被用于 开发使用接口操作的客户 客户程序不用纯描述性语言OMG IDL编写 而是用事先定义的映射 从OMG IDL概念映射到的语言编写,CORBA规范中最有意义的内容之一 IDL文件类似于应用程序接口(API)文档 在客户代码与对象实现(服务)之间定义了 一个清晰的边界 OMG IDL是一个稳定的标准 自1991年公布以来基本未改变 是OMG其它被采纳规范的基础 已经被ISO采纳(I

24、SO DIS 14750),一个IDL文件可以向多个编程语言映射 IDL是独立于语言的 CORBA规范包含IDL向具体编程语言的映射 已经发布映射规范的语言包括: C, C+, SmallTalk, Ada95 等,IDL支持平台独立性 IDL是独立于平台的 由IDL指定的接口可以在不同的ORB 不同的运行平台上 一致地表达 只要程序员使用由IDL定义的接口 不会遇到由于使用CORBA导致的 平台移植问题,IDL是一个纯规范,不涉及实现问题 IDL定义的接口不对对象实现进行任何约束 例如: 编程语言 进程 算法 等 将客户从对象实现细节中清晰地分离出来 有利于: 软件复用 软件演化 这是IDL

25、被广泛接收的重要原因,接口的设计质量至为重要 接口通常被用于定义应用系统中的重要接口 例如: 子系统接口 企业模型接口 库接口 等 这些接口是复用、互操作的关键部分 接口的变化将影响系统中的多个软件模块 好的接口将: 提高复用与互操作性 提高系统的适应性 降低维护费用,OMG IDL词法 遵循C+的词法规则,2、IDL词法,KeyWords:,OMG IDL语法 是已被提议的ANSI C+标准的子集 但比C+更严格: 函数返回类型是强制的 对操作声明的每个正式参数都必须提供名称 由单个符号void组成的参数列表 不允许作为 空参数列表的同义字 结构、discriminated联合和枚举要求被标

26、记 整数类型不能定义为简单的 int 或 unsigned 它们必须显式声明为short或long char不能由 signed 或 unsigned 关键字限定,3、IDL语法,4、IDL规范,IDL文档(模块),常量,类型,异常,接口,值类型,模块,常量,类型,异常,操作,属性,例子,(1) IDL 常量 (Constants) 例如: const octet O1 = 0x1; const long L = 3; const octet O2 = 5 + L; enum Color red, green, blue ; const Color FAVORITE_COLOR = red;

27、module M enum Size small, medium, large ; ; const M:Size MYSIZE = M:medium; const Color col = red; / is OK const Color another = M:medium; / is an error,IDL中类型定义的目的在于 支持操作基调的强类型检查 确保系统接受的表达式求值时不发生错误 类型声明包括: IDL中特殊类型的重命名 创建用户定义的类型 例如: 枚举 结构 数组 序列 联合 等,(2) IDL 类型(Type),例子: typedef unsigned long PhoneN

28、umber; typedef string GuestName, Address; enum ChargeCard MasterCard, Visa, AmericanExpress; struct GuestRecord GuestName name; Address address; PhoneNumber number; ChargeCard card_kind; unsigned long card_number, expiration; ; typedef sequence GuestList;,typedef struct Employeestruct string name; A

29、ddress address; unsigned long social_security_number; EmployeeRecord; typedef EmployeeRecord Employee100; enum PersonKind A_GUEST, AN_EMPLOYEE,AN_OTHER; union Person switch (PersonKind) case A_GUEST: GuestRecord guest_record; case AN_EMPLOYEE EmployeeRecord employee_record; default: string descripti

30、on; ;,与其它计算模型相比,CORBA作出了一个重要的保证 发出调用的客户总是可以接收到 一个成功的返回 或者一个例外 这是对分布计算复杂性的重要简化 并可以明显地降低客户方的代码量 例外值的声明类似于IDL结构类型 例如: exception CardExpired string expiration_date; ; exception CreditLimitExceeded unsigned long credit_limit; ; exception CardReportedStolen string reporting_instructions; unsigned long hot

31、line_phone_number; ;,(3) IDL 例外 (Exceptions),例外被分为两类: 用户定义的 与 CORBA定义的 标准例外 与标准例外相关的IDL: #define ex_body unsigned long minor; completion_status completed; ; enum completion_status COMPLETED_YES, COMPLETED_NO, COMPLETED_MAYBE ; enum exception_type NO_EXCEPTION, USER_EXCEPTION, SYSTEM_EXCEPTION ;,IDL接

32、口定义分布对象显露的细节 每个IDL接口定义了一个新对象类型 操作基调(Signature) 是接口的核心 是服务请求的入口点 接口 清晰地划分了服务的实现与客户之间的边界 接口的不足之处:未显示代码之间的关系,(4) IDL 接口 (Interface),例子: Interface Account /Account definitions Interface Cheking: Account /Inherits all Account definitions /adds Checking definitions ; Interface Saving: Account /Inherits al

33、l Account definitions /adds Savings definitions ; IDL 支持多继承,操作基调(Signature)的一般形式为: oneway(param1,.,paramL) raises(except1,.,exceptN)context(name1,.,nameM) 其中: 可选的oneway关键字指示对该操作的请求预期获得最佳效果 语义;如果操作成功返回结果,则默认语义是只有一次,如 果返回例外处理,则默认语义是最多一次 是返回结果的类型 为接口中的操作提供名称 操作所需的操作参数;它们以修饰符in、out或inout标记, 目的是指示信息流的方向(

34、相对于执行请求的对象) 可选的raises表达式指示可以引发的用户定义例外处理,它们 用于终止对该操作的请求;如果没有提供这样的表达式,那么 不会引发任何用户定义的例外处理 可选的context表达式指示将对对象实现有效的请求环境信息; 没有其它信息需要与请求一起传送,(5) IDL 操作,操作基调规范是IDL的基本目标 当IDL向特定语言编译时 每个基调对应于一个目标对象 目标对象的类型是接口的声明名字 例如: interface Hospital typedef string PatientId; PatientId admit_patient ( ); void release_pati

35、ent ( in PatientIdpatient ); ; 确省情况下, IDL操作是同步的 当 有 oneway 关键字时,IDL操作是异步的,(6)IDL属性 IDL 定义显露公共的属性与操作 如果属性或者操作是私有的 则它不应出现在IDL定义中 属性可以是 只读的(Read-only) 或者 可读写的(read-write) 每个属性都具有一个IDL数据类型 并出现在一个特定的IDL接口定义中,例如: interface foo enum material_t rubber, glass; struct position_t float x, y; ; attribute float

36、radius; attribute material_t material; readonly attribute position_t position; ;,IDL序列 (Sequence) 序列是IDL特有的特殊数据类型 其本质上是变长数组 下面的例子通过IDL向C语言的映射 显示了序列的实现方式 typedef sequence LongSeq; struct Automobile string make, model; unsigned short year; typedef sequence AutomobileSeq;,C: typedef struct CORBA_unsign

37、ed_long _maximum; CORBA_unsigned_long _length; CORBA_long *_buffer; LongSeq; typedef struct CORBA_char *make, *model; CORBA_unsigned_short year; Autumobile; typedef struct unsigned long _maximum; unsigned long _length; Automobile *_ buffer; AutomobileSeq;,(7) 值类型(Value Type) 一般情况下 在IDL定义的接口中 如果一个返回参

38、数是一般的类型 则它将总是返回参数的值 如果一个返回参数是一个对象的接口 则它通常返回参数(即服务对象)的引用 如果此时希望返回服务对象的值 则需要将该参数声明为值类型 值类型是CORBA为解决在操作过程中传递对象的值而引入的类型 值类型介于接口类型与结构类型之间 值类型的实现总是本地的,为IDL定义 创建 分离的名空间 防止不同领域中标识之间的冲突 模块可以嵌套 以创建 具有一定长度的 限定范围的 名字引用 名字引用例子: Part:Assembly:ComponentWidget,(8)IDL 模块 (Modules),3个模块例子: module Assembly typedef str

39、ing Widget; ; module Part typedef Assembly:Widget PartWidget; module ComponentPart typedef PartWidget ComponentWidget; ; ; CORBAServices 对模块进行扩充使用 每个服务定义了一个或多个模块,module CosNaming typedef string Istring; struct NameComponent Istring id; Istring kind; ; typedef sequence Name; enum BindingType nobject,

40、 ncontext; struct Binding Name binding_name; BindingType binding_type; ; typedef sequence BindingList; interface BindingIterator; interface NamingContext ,例如:NamingService的定义为:,一个完整的例子:,interface AirlineReservation typedef unsigned long ConfirmationNumber; enum SeatKind Window, Aisle, Middle ; exception BadFrequentFlyerNumber ; exception SeatNotAvailable ; ConfirmationNumber make_reservation( in string passenger_name, in unsigned long frequent_flyer_number, inout SeatKind seat_kind, ) raises (BadFrequentflyerNumber, SeatNotAvailable) context ( “TicketAgent”, “Agency”); ;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1