首页计算机计算机软件高级软件工程 02 CORBA概述.pptx

02 CORBA概述.pptx

页数:41页文件大小:394.7 KB来源: 高级软件工程ppt课件

本课件系统讲解CORBA的整体结构:先以Grid对象为例说明客户、ORB与对象实现之间的请求链路,再逐项解释ORB核心、ORB接口、客户、对象实现、对象引用、OMG IDL及其语言映射、客户存根与DII、实现骨架与DSI、对象适配器、接口池与实现池等结构元素,随后介绍ORB的四种实现方式、客户与对象实现的结构、对象适配器的职责,最后给出一次完整请求的典型处理过程并附上客户程序与对象实现的核心代码。

CORBA概述章节页,说明其设计目的是集成大量不同的对象系统并列出六项讲述内容
Grid对象示例图,展示服务端网格数据与width、height及get、set操作同客户端之间的调用关系
ORB结构概念页,说明客户、对象实现与ORB在请求通讯、查找实现与准备接收中的职责分工
查看本课件的文字版(共 41 页,供检索与复制)

第1页:CORBA 概述

公共对象请求代理体系结构(CORBA)的设计目的是集成大量不同的对象系统。内容:

  1. 对象请求代理结构概念
  2. ORB实现的方式
  3. 客户的结构
  4. 对象实现的结构
  5. 对象适配器的结构
  6. 一个请求的完整过程例子

第2页:Grid Object 示例

例子:Grid Object:服务端 Grid object 维护 width、height 与二维数据(1 2 3 5 8 13 21 34 55 89 144 233),提供 get(row,col) 与 set(row,col,value) 操作,由 client 发起调用。

第3页:对象请求代理的结构

(1)对象请求代理的结构:客户如何通过ORB向对象实现发出请求。

  • 客户:希望在对象上执行操作的实体
  • 对象实现:实现对象的代码和数据
  • ORB:负责组成请求的数据的通讯、查找请求所需对象实现的机制、准备接收请求的对象实现

第4页:ORB 请求代理结构图

本页为对象请求代理结构示意图,源文件仅提取到页面标签文字,建议对照原图查看客户、ORB与对象实现之间的连接关系。

第5页:客户利用 Stub 或 DII 发出请求

客户利用存根(stub)或者DII(动态调用接口)发出请求。

本页以结构示意图为主,建议对照原图查看两种调用途径的差别。

第6页:对象实现经骨架或DSI接收请求

对象实现通过Skeleton(静态骨架)或者DSI(动态骨架接口)接收请求。

本页以结构示意图为主,建议对照原图查看两种接收途径的差别。

第7页:接口池与实现池

接口池存放IDL接口定义信息,实现池存放对象实现的定位与激活信息,二者共同支撑ORB的运行时访问。

本页以结构示意图为主,建议对照原图查看。

第8页:CORBA 结构元素一览

对CORBA结构中元素的解释:

  • ORB及接口
  • 客户
  • 对象实现
  • 对象引用
  • IDL及向编程语言的映射
  • 客户存根与DII
  • 实现骨架与DSI
  • 对象适配器
  • 接口池
  • 实现池

第9页:对象请求代理(ORB)

对象请求代理(ORB):不要求将ORB实现为单独的构件,而仅定义其接口;任何提供正确接口的ORB实现都是可以接受的。

  • ORB的具体实现包括:ORB Core、IDL编译器、IR、Object Adapter
  • ORB可以有多种实现,它们对对象引用有不同的表示方法,并且有不同的调用执行方法
  • ORB Core 提供对象的基本表示以及请求的通讯,特别地:编排/反编排(Marshal/Unmarshal),将高层语言的参数等表示转换为便于底层网络传输的形式

第10页:ORB 接口

ORB接口:是客户与对象实现可以直接访问到的ORB功能接口;其它多数功能提供给对象适配器(stub、skeleton、动态调用)。ORB接口对所有ORB都是一样的,不依赖于任何对象的接口或对象适配器。

第11页:客户(Client)

客户(Client):(对象的)客户访问对象的对象引用并且调用对象上的操作;客户只知道对象的逻辑结构——根据它的接口,并通过调用感受对象的行为。

  • 一般认为客户是向对象发出请求的程序或进程
  • 客户只是相对于特定对象而言的,是一个相对概念
  • 一个对象的实现可以是其它对象的客户(客户与服务器的角色可互换)

第12页:对象实现的定义

对象实现:通过为对象实例定义数据和为对象方法定义代码提供对象的语义。对象可以具有不同的实现方式,包括:单独的服务器、库、每个方法的程序、封装应用程序、面向对象的数据库等等。

对象实现不依赖于ORB或者客户调用对象的方式,可以通过选择 Object Adapter 达到选择与ORB相关服务的接口的目的。

第13页:对象引用的性质

对象引用(Object Reference):提供在ORB内指定对象时所需要的信息;对象引用对于客户和对象实现都是一个位流(opaque)的概念,因此客户与对象实现可以与引用的实际表示分离。

  • 在选择对象引用表示上,不同的ORB可以有所差别
  • 传递给客户的对象引用表示仅在客户的生命期内有效
  • 对于一个特定的编程语言,所有的ORB都必须提供对象引用(通常称为对象)的相同语言映射,这就允许程序在独立于特定ORB的情况下访问对象引用

第14页:OMG 接口定义语言

OMG接口定义语言(OMG IDL):通过指定对象接口定义对象类型,接口包括一组已命名的操作和这些操作的参数。

  • IDL是一个分析设计结果,描述ORB操纵的对象
  • 其源代码的存在对ORB正常工作不是必须的;在运行时刻,以 stub 程序或者运行时接口 repository 的形式提供等价的信息
  • 通过IDL,特定对象实现告诉它潜在的客户:什么是有效的操作以及如何调用这些操作
  • 从IDL定义可以将CORBA对象向特定编程语言或者对象系统映射

第15页:grid.idl 示例

例子:grid.idl

interface Grid { readonly attribute short height; readonly attribute short width; void set(in short row, in short col, in long value); long get(in short row, in short col); };

CORBA中主要构件的接口全部由IDL进行定义,例如ORB接口、Stub、Skeleton、对象适配器;更主要的用途是定义应用对象。

第16页:IDL 向具体语言的映射

语言映射包括定义特定于语言的数据类型和通过ORB访问对象的过程接口。它包括:

  • 客户 stub 接口的结构(面向对象的语言不需要)
  • 动态调用接口
  • 实现骨架
  • 对象适配器和直接ORB接口

语言映射也包括对象调用之间以及客户或实现中控制线程之间的交互。最常见的映射提供同步调用:当对象操作完成时子程序返回。编译开关(选项)控制映射具体策略。

第17页:编译 IDL 生成的文件

编译 IDL:由 grid.idl 经 IDL 编译器生成:

  • grid.h:common declarations(公共声明)
  • gridC.cpp:client stubs(客户存根),与 ORB client library 一起构成 Client
  • gridS.cpp:server skeleton(服务骨架),与 ORB server library 一起构成 Server

第18页:生成的 C++ 头文件

所产生的C++头文件(Orbix):

class Grid : public virtual CORBA::Object { public: static Grid_ptr _bind(....); virtual CORBA::Short height(CORBA::Environment&); virtual CORBA::Short width(CORBA::Environment&); virtual void set(CORBA::Short row, CORBA::Short col, CORBA::Long value, CORBA::Environment &); virtual CORBA::Long get(CORBA::Short row, CORBA::Short col, CORBA::Environment &); };

第19页:客户存根(Client Stub)

客户存根(Client stub):由IDL编译器根据IDL文件生成,是客户访问对象操作的主要方式,实现对象位置透明性。

  • 向非面向对象语言映射时,将为每个接口类型产生一个 stub 编程接口
  • 面向对象的编程语言不需要 stub 接口,它通过伪对象的方式提供访问对象的操作

第20页:动态调用接口(DII)

DII(动态调用接口):客户指定要调用的对象、要执行的操作和调用或调用序列中操作的参数集,而不是调用特定于特殊对象上特殊操作的 stub 子程序;客户代码必须提供要执行操作的信息和传送参数的类型。动态调用接口的特性可能因编程语言映射的不同而不同。

CORBA_Create_request(...) … CORBA_Request_add_arg(...) CORBA_Request_add_arg(...) … CORBA_Request_invoke(...) … CORBA_Request_delete(...)

客户通过静态还是动态接口发出请求,对于对象实现是透明的。

第21页:实现骨架(Skeleton)

实现骨架(Implementation Skeleton):由IDL编译器根据IDL文件生成,是对象适配器访问对象实现中方法的主要形式。

  • 对于一种特定映射语言,以及可能的特定对象适配器,Skeleton 与 stub 不是必然对应的
  • 客户也可以通过动态调用接口发出请求
  • 也可以编写不使用 skeleton 调用实现方法的对象适配器

第22页:动态骨架接口(DSI)

动态骨架接口(DSI):通过一个“提供访问操作名与参数的接口”获得一个对象的实现;实现代码必须向ORB提供所有操作参数的描述,ORB提供任何输入参数的值以便在执行操作时使用;在执行操作后,实现代码向ORB提供任何输出参数的值或者例外处理。

适配器通过静态还是动态骨架接口访问对象实现,对于客户是透明的。

动态骨架与动态调用可以被一起用于创建网关(Gateway):不同ORB环境之间的网关、不同防火墙软件之间的网关、安全网关。

第23页:对象适配器

对象适配器(Object Adaptor):是对象实现访问ORB所提供服务的主要方式。ORB通过对象适配器提供的服务通常包括:

  • 生成和解释对象引用
  • 方法调用
  • 交互的安全性
  • 对象和实现激活及取消激活
  • 将对象引用映射到实现
  • 注册实现

对象粒度、寿命、策略、实现风格等的明显区别,使得ORB核心很难为所有对象提供方便和有效的单一接口;通过对象适配器,ORB可以将一组特定的对象实现作为目标。

第24页:接口池

接口池(Interface Repository):提供持久对象的服务,这些对象在运行时以可用的形式表示IDL信息。ORB可以使用接口池信息执行请求,例如:如果程序在编译时遇到接口未知的对象,那么使用接口池中的信息可以确定对象的有效操作并对它发出调用。

除了在ORB运行时提供职能外,接口池也是存储与ORB对象接口相关的其它信息的公共地点,例如调试信息、stub 或 skeleton 库、形式化或浏览特定对象等等。

第25页:实现池

实现池(Implementation Repository):包含的信息允许ORB定位和激活对象实现。尽管实现池中的大多数信息特定于ORB或者操作系统,但是实现池是习惯上记录这些信息的地点;安装实现和与激活及执行对象实现的策略控制是通过实现池上的操作完成的。

除了提供ORB运行时的职能外,实现池也是存储与ORB对象实现相关的其它信息的公共地点,例如调试信息、管理控制、资源分配、安全性等等。

第26页:ORB 实现方式(一)

(2)ORB实现方式之位于客户和对象实现内部的ORB:如果有合适的通讯机制,那么ORB可以在客户和对象实现的程序中实现。客户中的 stub 使用位置透明的 IPC 机制或者直接访问地点服务建立与实现的通讯,与实现关联的代码负责为客户设置合适的数据库(操作定位)。

第27页:基于服务器的 ORB

基于服务器的ORB:所有客户和实现可以与一个或多个服务器通讯,服务器的任务是将请求从客户发送到对象实现。就底层操作系统而言,ORB可以是普通的程序,并且可以使用普通的IPC与ORB通讯。

这是主要的ORB实现方式,优点:客户与服务器目标码大小适度、便于配置。

第28页:基于系统与基于库的 ORB

基于系统的ORB:为增强安全性、健壮性和性能,可以将ORB作为底层操作系统的基本服务;对象引用可以永远不变,从而减少了每次请求时验证的开销;由于操作系统可以知道客户和实现的地点及接口,因此可以实现许多不同的优化,例如当客户与实现在同一台机器上时可以省缺编排活动。

基于库的ORB:对于小型、并且其实现可以共享的对象,实现可以在库中。

第29页:客户的结构

(3)客户的结构:客户在它们的程序中以库子程序的方式访问特定对象类型的 stub,客户程序在它的编程语言中以用普通方式调用该子程序;客户将对象引用传送给 stub 子程序以初始化调用。Stub 能够访问对象引用表示,并与ORB交互,以执行调用。

第30页:客户程序的组成

在最常见的情况下,客户通过调用拥有引用的其它对象并作为输出参数来获取对象引用;也可以采用从字符串转换的方法:服务器方将对象引用转换为字符串,然后将字符串存储在文件中,则客户方可以将它转换回对象引用。

客户程序的具体表现形式与ORB的实现方式有关。不论哪种形式,客户程序由两部分组成:

  • 程序员编写的代码
  • IDL编译器生成的代码

它们与ORB提供的功能一起,构成了抽象意义的CORBA客户方。

第31页:客户结构示意图

本页为客户结构示意图,源文件仅提取到页面标签“CORBA概述”,建议对照原图查看客户方代码的组织方式。

第32页:客户程序示例(GridC.cpp)

客户程序(GridC.cpp):

#include "grid.hh" #include <iostream.h> main () { Grid_var p; p = string_to_object("grid.ref"); cout << "height is " << p->height() << endl; cout << "width is " << p->width() << endl; p->set(2,4,123); cout << "grid[2,4] is " << p->get(2,4) << endl; };

第33页:对象实现的结构

(4)对象实现的结构:对象实现以不同的方式与ORB交互来建立它的表示、创建新对象、获取与ORB相关的服务等,它主要是通过对象适配器完成这些工作。由于对象实现与ORB实现方式、对象适配器实现途径密切相关,因此对象实现的具体结构不易描述。

第34页:发生调用时的处理过程

在发生调用时,ORB核心、对象适配器、skeleton 共同协商,确定调用针对的实现方法:方法的参数之一指定要调用的对象以便定位对象,其它参数则根据 skeleton 定义被提供;方法完成后返回,并导致输出参数或将例外结果传输回客户。

当创建新对象时,通常需要通知ORB,以便ORB知道如何找到该对象的实现。

第35页:对象实现结构示意图

本页为对象实现结构示意图,源文件仅提取到页面标签“CORBA概述”,建议对照原图查看。

第36页:对象实现核心代码(GridS.cpp)

对象实现的核心代码(GridS.cpp):

virtual CORBA::Short Grid_i::width(CORBA::Environment &) { return m_width; } virtual CORBA::Short Grid_i::height(CORBA::Environment &) { return m_height; } virtual void Grid_i::set(CORBA::Short row, CORBA::Short col, CORBA::Long value, CORBA::Environment&) { m_array[row][col] = value; } CORBA::Long Grid_i::get(short row, short col, CORBA::Environment &) { return m_array[row][col]; }

第37页:对象适配器的结构

(5)对象适配器的结构,对象适配器负责下列功能:

  • 生成和解释对象引用
  • 方法调用
  • 交互的安全性
  • 对象和实现的激活及取消激活
  • 将对象引用映射到相应的对象实现
  • 注册对象实现

这些功能由ORB核心与其它所需的附加构件实现;对象适配器将保持自己的状态来完成它的任务。特定的对象适配器可以代理核心的一个或多个职能,以定义大多数对象实现所依靠的来自ORB的服务。

第38页:面向特殊需求的适配器

由于某些对象实现有特殊要求,所以不同对象适配器可以提供不同的接口或功能。例如,面向对象的数据库系统可能希望隐式注册它的几万个对象,而不是对对象适配器做单独调用;此时,对象适配器维护每个对象的状态是不实际和不必要的。

通过使用为这样的对象实现调整过的对象适配器接口,可以利用特定ORB核心的细节提供最有效的方式访问ORB。

第39页:对象适配器结构示意图

本页为对象适配器结构示意图,源文件仅提取到页面标签“CORBA概述”,建议对照原图查看。

第40页:一个完整的典型请求过程

(6)一个完整的典型请求过程:

客户方:1. 客户获取对象引用;2. 向 Stub 发出请求;3. Stub 调用ORB接口、定位服务器;4. ORB对请求进行编排;5. 客户方ORB发送消息。

服务器方:1. 服务器方接收消息;2. ORB进行反编排;3. OA定位(激活)实现;4. 定位(激活)对象;5. 调用方法;6. 返回结果。

随后客户方ORB接收结果,由客户处理结果。

第41页:

顶部目录