390 likes | 668 Views
IIOP. 8 IIOP. IIOP:Internet Inter-ORB Protocol 基于 Internet 的 ORB 间互操作协议 GIOP 的一个实例 GIOP:General Inter-ORB Protocol. IIOP. 内 容 GIOP 设计目标 GIOP 功能 CDR GIOP 消息格式 GIOP 传输假定 IIOP 消息传输. (1) GIOP 设计目标. IIOP. 最大可能范围的可用性 基于最广泛使用和灵活的通讯传输机制( TCP/IP ) 并定义在 ORB 之间传输请求所需的其它协议 简单性 可扩展性
E N D
IIOP 8 IIOP IIOP:Internet Inter-ORB Protocol 基于Internet的ORB间互操作协议 GIOP的一个实例 GIOP:General Inter-ORB Protocol
IIOP 内 容 GIOP设计目标 GIOP功能 CDR GIOP消息格式 GIOP传输假定 IIOP消息传输
(1) GIOP设计目标 IIOP 最大可能范围的可用性 基于最广泛使用和灵活的通讯传输机制(TCP/IP) 并定义在ORB之间传输请求所需的其它协议 简单性 可扩展性 它们的大小接近或超过今天Internet的大小
IIOP 低耗费 对现有的或新的ORB设计添加对GIOP/IIOP的支持 应该需要小量的工程投资 一般性 IIOP开始是为TCP/IP定义的 GIOP设计为在其它面向连接的传输协议上实现 体系结构 中立性 GIOP将ORB看成体系结构未知的不透明实体。
(2) GIOP功能 IIOP 少量、简单消息 仅仅用七个消息格式 GIOP就可以支持ORB之间的全部CORBA功能 以及支持对象地点服务的 扩展功能 动态迁移 和 对通讯资源的有效管理 GIOP语义不要求格式或绑定协议 在大多数情况下 客户可以在打开连接后立即向对象发送请求 动态对象地点 许多ORB的体系结构 允许 在不同地点激活还没有过期的对象实现 并且 允许动态迁移对象 GIOP消息为对象地点和迁移提供支持 但在不需要或不适合ORB的体系结构时 不要求ORB实现这样的机制
IIOP 完全的CORBA支持 GIOP消息直接支持CORBA要求的所有功能和行为 包括例外情况报告、传送操作环境和远程对象引用操作 (例如CORBA::Object::get_interface) GIOP支持传送特定于服务的环境 例如由事务服务定义的事务环境 该机制的设计目的是 支持要求在请求中隐式传送与服务相关环境的任何服务
(3) 公共数据表示(CDR) IIOP CDR是传输语法 它将用OMG IDL定义的数据类型映射到 双向规范的低级表示 以便在代理之间进行传输 CDR有如下功能: 可变的字节次序 有公共字节次序的机器 可以在不进行字节交换的情况下进行消息交换 当与字节次序不同的机器进行通讯时 消息发起者决定消息字节次序 接收者负责交换字节以便匹配它的本地次序 每个GIOP消息(以及CDR封装)包含 指出正确字节次序的标记
IIOP 对齐的主类型 在GIOP消息内基本OMG IDL数据类型 在它们的自然边界对齐 这样强制在内存中进行数据对齐的体系结构 可以有效地处理它们 完整的OMG IDL映射 CDR描述所有OMG IDL数据类型 (包括可传输的伪对象,例如TypeCode)的表示 如果需要,CDR为CORBA Core规范中 表示未定义或与实现有关的数据类型定义表示方法
IIOP (4) GIOP 消息格式 module GIOP { enum MsgType { Request, Reply, CancelRequest, LocateRequest, LocateReply, CloseConnection, MessageError }; struct MessageHeader { char magic [4]; Version GIOP_version; boolean byte_order; octet message_type; unsigned long message_size; };
(5) GIOP 传输假定 IIOP 传输是面向连接的 GIOP使用连接来定义请求ID的作用域和范围 传输是可靠的 传输保证字节按发送时的次序至多传输一次 并且有一些传输的肯定确认 传输对错误的连接丢失提供一些合理的通知 如果对等进程失败、对等主机崩溃或者网络连接丢失 则连接所有者应该接收到这种情况的一些通知 初始化连接的传输模型可以映射到TCP/IP的一般连接模型 代理将已知的网络地址发布在IOR中 客户在初始化连接时使用它
IIOP 服务器不主动初始化连接 但它准备接收对连接的请求 例如,它侦听TCP/IP terms的连接 其它知道地址的代理(称为客户)可以 尝试通过对地址发送connect请求来初始化连接 侦听的服务器可以 接受请求、与客户建立新的唯一连接 或者它可以拒绝请求 一旦连接打开后,两端都可以关闭连接 候选的传输协议可能不直接支持这种特定的连接模型 只有传输模型可以映射到该视图才是必要的
IIOP (6) IIOP OMG为GIOP指定的基线传输协议是TCP/IP 用于支持TCP/IP的库的特定API可以不同 GIOP消息传输到TCP/IP的映射称为 Internet Inter-ORB协议(IIOP)
IIOP IIOP IOR • module IIOP { // IDL • struct Version { • char major; • char minor; • }; • struct ProfileBody { • Version iiop_version; • string host; • unsigned short port; • sequence <octet> object_key; • }; • };
ORB 产品 9 ORB 产品 IONA 公司的Orbix Inprise公司的visibroker Digital公司的ObjectBroker IBM公司的ComponentBroker OOC公司的OminiBroker Frankfurt大学的MICO
Orbix ORB 产品 • IONA公司的Orbix 是目前市场占有率最高的ORB产品 • 已经在金融、电信等多个领域得到广泛应用 • 目前在 UNIX • Windows 95/NT • MVX等 多种操作系统上运行 • 对IDL的映射基本上包含了CORBA规范的内容 • 例如C++、Java、Ada、Cobol等 • 所实现的COS包括Naming Service、Event Service、 • Transaction Service、Security Service、Event Service等 • 另外IONA公司还提供了ORB与DCOM的桥接产品:OrbixCOMet • 以及完全用Java 实现的ORB:OrbixWeb • 可以被WEB浏览器加载,增强WEB功能 • 网址:www.iona.com
ORB 产品 • Visibroker • 1997年11月原Borland公司与Visigenic公司合并成立Inprise • 原属于Visigenic公司的ORB产品Visibroker • 成为Inprise的重要产品 • 并被集成到Delphi 4.0 中 • Visibroker 对IDL的映射包括:C++、Java • 所实现的COS包括Naming Service、Event Service等 • Visibroker已经被集成到Netscape 的Communicator中 • 在其它嵌入式系统中也有所应用 • 网址:www.inprise.com
ORB 产品 • ObjectBroker • 这是中间件厂商BEA公司从Digital公司获得的ORB产品 • 已经被集成到BEA的其它环境之中 • 主要完成了向C++的映射 • 所实现的COS包括 Naming Service • Event Service • Transaction Service等 • M3是BEA的一个集ORB、COS等功能于一身的产品 • 网址:www.beasys.com
ORB 产品 • ComponentBroker • IBM公司的ORB增强产品 • IBM最初曾提出兼容CORBA规范的DSOM模型 • 随着CORBA规范的逐步完善 • IBM将模型中与ORB直接相关的部分抽取出来 • 称之为ComponentBroker • ComponentBroker完成的IDL映射包括 C++ • Java • Smalltalk • COBOL等语言 • 所实现的COS包括Naming Service • Event Service • Transaction Service • Concurrent Services等 • 网址:www.software.ibm.com
ORB 产品 • OB • 美国OOC公司开发ORB产品──OB(OmniBroker) • 最初是完全free的 • 其所有源代码皆可以自由下载 • 完成的IDL包括C++、Java • OB所实现的COS包括Naming Service、Event Service等 • 1998年开始,OOC以OB为核心实现了商业ORB产品:Orbacus • 所实现的COS增加了Trading Service、Security Service等 • 网址:www.ooc.com
ORB 产品 • MICO • 德国Frankfurt大学开发的ORB产品──MICO(Mico Is COrba) • 所完成的IDL包括C++、Java • 所实现的COS包括Naming Service • Event Service • Security Service等 • 自2.0开始,MICO的版本号与CORBA的正式版本号同步 • 目前为2.31版 • MICO是为教育目的而开发的 • 并且采用了与Linux类似的发展途径 • 版权归GNU组织 • 因而具有较好的发展前景 • 网址:www.vsb.cs.uni-frankfurt.de/~mico/
开发过程 10 CORBA应用程序开发过程 Client developer Server developer IDL IDL compiler IDL compiler Client Server
开发过程 例子 - Grid Object client server Grid object remote calls width height get(row,col) set(row,col,value) 1 2 3 5 8 13 21 34 55 89 144 233
开发过程 Step-by-Step Define the IDL interface Compile the IDL interface Write a client Implement the interface Write a server mainline Register the server
开发过程 An IDL Interface 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); };
开发过程 编译成C++: grid.idl grid.hh common declarations Client Server gridC.cc client stubs gridS.cc server skeleton ORB client library ORB server library
开发过程 IDL to C++ 映射 IDL operations (操作)映射为C++ 的成员函数 - parameter types 映射为 C++ types IDL attributes (属性)映射为 C++的成员函数 - 一个用于获取值 - 另一个用于设置值 (如果不是只读属性) IDL data types 映射为 C++ data types 一 个interface 映射为一个 C++ class.
开发过程 所产生的C++ code: 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 &); };
开发过程 Writing a Client #include “grid.hh” #include <iostream.h> main () { Grid_var p; // Like a C++ pointer // Connect to a remote Grid object p = Grid::_bind(“myGrid:GridSrv”, GridHost); // Now use it like a regular C++ object cout << “height is “ << p->height() << endl; cout << “width is “ << p->width() << endl; p->set(2,4,123); // a remote call cout << “grid[2,4] is “ << p->get(2,4) << endl; };
1 2 3 5 8 13 21 34 55 89 144 233 开发过程 如何工作? client remote CORBA calls server C++ calls Grid proxy - a local C++ object Grid implementation
开发过程 Implementing the Interface 编写一个C++ class 继承ORB functionality 加入数据成员以及其它C++ 函数 - 根据具体的需求 重定义IDL 函数 - 提供具体的功能
开发过程 Grid implementation // Define a C++ implementation class Grid_i // Inherit distributed capability #include ”grid.hh” class Grid_i: public virtual GridBOAImpl { // Add application data and functions short m_height, m_width; long **m_array; public: Grid_i(short h, short w); // Constructor virtual ~Grid_i(); // Destructor
开发过程 Grid_i 还包括... // Re-define the IDL functions 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&); };
开发过程 IDL 具体功能 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]; }
开发过程 什么是 ‘server mainline’? server 是 objects的 容 器 - ORB 能激活的可执行代码 ‘server mainline’ - 在server中创建初始对象 - 将控制权交给 ORB 以等待调用。 各个对象分别实现自己的功能 - ORB 将接受到的调用分发给具体的对象。
开发过程 编写server mainline #include “grid_i.h” #include <iostream.h> main() { // Create some initial objects // (only one in this case) Grid_i myGrid(100,100); try { //Give control to the ORB CORBA::Orbix.impl_is_ready(); } catch { .... } cout << “Server terminating” << endl; }
开发过程 Registering the server Servers 可以由ORB 自动启动 - 响应客户请求 注册过程告诉ORB: - 哪个可执行代码是服务器 - 服务器的激活模式 - 安全等功能 存在多种激活模式 - 共享服务器,独享服务器等
开发过程 编程小结 从IDL起步 - client 与server 间的契约 编写Client 与server 代码 - ORB 支持的代码是从IDL产生的。 ORB 负责对象的分布,用户可以将精 力放在具体应用程序的功能上,而不 是实现技术上。
CORBA小结 1、OMG与CORBA 2、CORBA对象模型 3、CORBA概述 4、IDL 5、ORB接口 6、IR 7、POA 8、IIOP 9、ORB产品 10、开发过程
其他相关问题 CCM:CORBA Component Model CORBA /COM interworking CORBA Common Object Service ...