1 / 20

接触 CORBA 内幕

接触 CORBA 内幕. —— 揭开 CORBA 实现 ORB 互操作、 OS 中立性以及编程语言无关性的奥秘. 编程语言无关性的实现. 一种纯粹的描述性语言 —— 接口定义语言( IDL ) 为应用接口定义提供一致的、可移植的构架的 IDL  编程语言映射:. IDL C++ 语言映射规范 IDL JAVA 语言映射规范 IDL C 语言映射规范 IDL Ada 语言映射规范 … …. 接口定义语言( IDL). 提供了将对象的接口与其实现分离的能力 提供了一套通用的数据类型并可以使用它们来定义更为复杂的类型 摆脱了对特定编程语言的依赖.

Download Presentation

接触 CORBA 内幕

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 接触 CORBA 内幕 ——揭开CORBA实现ORB互操作、OS中立性以及编程语言无关性的奥秘

  2. 编程语言无关性的实现 • 一种纯粹的描述性语言 —— 接口定义语言(IDL) • 为应用接口定义提供一致的、可移植的构架的IDL 编程语言映射: • IDL C++语言映射规范 • IDL JAVA语言映射规范 • IDL C语言映射规范 • IDL Ada语言映射规范 • … …

  3. 接口定义语言(IDL) • 提供了将对象的接口与其实现分离的能力 • 提供了一套通用的数据类型并可以使用它们来定义更为复杂的类型 • 摆脱了对特定编程语言的依赖

  4. IDL文件例子 // Bank.idl module Bank { interface Account { float balance(); }; interface AccountManager { Account open(in string name); }; };

  5. IDL编程语言映射规范的实现——IDL编译器

  6. ORB 互操作体系架构

  7. 可互操作对象引用 (IOR) IOR 中嵌入的是: type_id、一个或多个标记描述文件。 • type_id 字符串是以资源库标识格式描述的接口类型. • 一个描述文件支持一个或者多个协议并封装所有的基本信息,这些信息是其支持的协议识别一个对象所需的。例如在使用IIOP协议的时候,包括: IIOP 版本、主机地址和端口号以及对象密钥. • IIOP 版本将帮助 IOR 阅读器(通常是 ORB)正确了解 IOR 是哪种格式. • 主机地址和端口号将让我们接触到与期望的对象通信的ORB • 对象密钥帮助ORB定位最终的目标对象

  8. 客户端代理对象(STUB)实现 public class _AccountManagerStub implements Bank.AccountManager { public Bank.Account open (java.lang.String name) { while (true) { if (!_is_local()) { Bank.Account _result; try { org.omg.CORBA.portable.OutputStream _output = this._request("open", true); _output.write_string((java.lang.String)name); org.omg.CORBA.portable.InputStream _input = this._invoke(_output); _result = Bank.AccountHelper.read(_input); return _result; }//异常处理省略 } else { final org.omg.CORBA.portable.ServantObject _so = _servant_preinvoke("open", _opsClass); if (_so == null) { continue; } final Bank.AccountManagerOperations _self = (Bank.AccountManagerOperations)_so.servant; try { return _self.open(name); }finally { _servant_postinvoke(_so); } }//if }//while }//open }

  9. 客户端代理对象(STUB)创建 public final class AccountHelper { //… private static Bank.Account narrow (final org.omg.CORBA.Object obj, final boolean is_a) { if (obj == null) { return null; } if (obj instanceof Bank.Account) { return (Bank.Account)obj; } if (is_a || obj._is_a(id())) { final org.omg.CORBA.portable.ObjectImpl _obj = (org.omg.CORBA.portable.ObjectImpl)obj; Bank._AccountStub result = new Bank._AccountStub(); final org.omg.CORBA.portable.Delegate _delegate = _obj._get_delegate(); result._set_delegate(_delegate); return result; } throw new org.omg.CORBA.BAD_PARAM(); } //…… }

  10. CORBA的解决方案: 制定通用 ORB 间协议 (GIOP),定义消息结构和格式。这包括如下要素: • 公用数据表示(CDR) • GIOP消息格式 • GIOP传输层假设 数据编排/传输/解编排的可互操作解决方案 存在的问题: • 客户机调用接口操作时,它必须将操作数据(in 和 inout 参数)发送到服务器。此时的困难在于将数据转换成公共格式,这样服务器抽取操作数据时不会误解或错误对齐数据。因为服务器可以是任意数量不同的平台,我们应该预计到客户机和服务器之间的体系结构差异。 • 服务器端向客户端返回操作结果时(out和inout参数以及返回值)面对的是同样的问题。

  11. 通用 ORB 间协议 (GIOP) • 通用 ORB 间协议 (GIOP) 用来为这个由不同计算机及其各种体系结构组成的凌乱世界中传送消息定义结构和格式。 • GIOP 有三个版本:1.0 、 1.1和1.2。这就意味着我们的消息根据其符合的 GIOP 版本可能有不同的格式。

  12. 公用数据表示(CDR) CDR将OMG IDL定义的数据类型应射成低级的二进制表示,它具有如下特点: • 可变的字节顺序具有相同的字节顺序的机器交换消息时不需要字节转换。当通信的机器具有不同的字节顺序时,消息的产生者决定字节的顺序,接收者负责交换字节来与它的本地顺序相匹配。 • 对齐的基本类型GIOP消息中,基本OMG IDL数据类型在它们的自然边界对齐,这样内存中执行数据对齐的体系结构可以更有效的处理数据。 • 完整的OMG IDL映射CDR描述了所有OMG IDL数据类型的表示,包括可传递的伪对象,例如TypeCodes。

  13. GIOP消息格式 GIOP 请求消息分成三部分: • GIOP 消息头包含 GIOP 版本、消息类型、消息大小,然后根据是使用 1.0、1.1 还是 1.2,包含字节次序 (GIOP 1.0) 或一个位标志字段,该字段包括字节次序以及一些保留位标志。GIOP 1.1 添加了对消息存储碎片的支持,GIOP 1.2 添加了双向通信支持。更新的版本都是向下兼容的。 • GIOP 请求头包含请求标识、是否期望应答标志、对象密钥、调用的操作名等 • 请求主体被打包进CDR封装,并紧接在请求头后,这包括:所有的in和inout参数,一个可选的Context伪对象.

  14. GIOP消息举例 0x47 0x49 0x4f 0x50 -> GIOP, 消息标志 0x01 0x00 -> GIOP 版本 0x00 -> 字节序 0x00 -> 消息类型(请求消息) 0x00 0x00 0x00 0x2c -> 消息大小(44) 0x00 0x00 0x00 0x00 -> 服务上下文 0x00 0x00 0x00 0x01 -> 请求ID 0x01 -> 期望得到响应 0x00 0x00 0x00 0x24 -> 对象密钥字节数(36) 0xab 0xac 0xab 0x31 0x39 0x36 0x31 0x30 0x30 0x35 0x38 0x31 0x36 0x00 0x5f 0x52 0x6f 0x6f 0x74 0x50 0x4f 0x41 0x00 0x00 0xca 0xfe 0xba 0xbe 0x39 0x47 0xc8 0xf8 0x00 0x00 0x00 0x00 -> ORB实现者定义的对象密钥 0x00 0x00 0x00 0x04 -> 操作名称长度(4字节) 0x61 0x64 0x64 0x00 -> 操作名("add") 0x20 -> 为对齐而产生的填充字节

  15. GIOP传输层假设 GIOP可以在很大范围的传输协议上实现,GIOP对其所使用传输层有如下假设: • 传输是面向连接的 • 传输是可靠的 • 传输可以看成一个字节流 • 传输提供无序连接损失的合理通知 • 初始化连接的传输模型可以映射到TCP/IP的一般模型上。特别是,一个服务器在IOR中公布已知的网络地址,客户端代理使用它初始化连接。

  16. Internet ORB间协议(IIOP) GIOP 是 CORBA 方法调用的核心部分。GIOP 不基于任何特别的网络协议,如 IPX 或 TCP/IP;但是仅有详细和简洁的消息规范,并不能提供互操作性,因为供应商可能使用不同的传送机制来实现此消息规范。为了确保互操作性,OMG首先在最广泛使用的通信传输平台 -- TCP/IP 对GIOP进行了标准化。 GIOP + TCP/IP = IIOP

  17. OSI 的结构 vs. IIOP 协议堆栈

  18. 可移植对象适配器(POA)

  19. 服务器端框架(Skeleton) public abstract class AccountManagerPOA implements Bank.AccountManagerOperations { //... public org.omg.CORBA.portable.OutputStream _invoke( java.lang.String opName, org.omg.CORBA.portable.InputStream _input, org.omg.CORBA.portable.ResponseHandler handler) { int[] method = (int[]) _methods.get(opName); if (method == null) { throw new org.omg.CORBA.BAD_OPERATION(); } switch (method[0]) { case 0: java.lang.String name; name = _input.read_string(); Bank.Account _result = _self.open(name); _output = _handler.createReply(); Bank.AccountHelper.write(_output, _result); return _output; default: throw new org.omg.CORBA.BAD_OPERATION(); } } //... }

  20. 参考资料 • 《CORBA企业解决方案》(《 Enterprise CORBA》 )机械工业出版社2001年1月第1版——ISBN 7-111-07565-x • 《基于C++ CORBA高级编程》清华大学出版社2000年7月第1版——ISBN 7-302-03956-9/TP.2316 • 《VisiBroker for Java程序员指南 》机械工业出版社 2000年11月第一版——ISBN 7-111-08236-2 • 《CORBA 系统结构、原理与规范》[美] OMG 编著 电子工业出版社 2000年6月第1版——ISBN 7-5053-5944-4/ TP 3109 • 《 J2EE 构建企业系统》清华大学出版社 2001年6月第1版——ISBN 7-900635-71-8 • 《接触 CORBA 内幕:IOR、GIOP 和 IIOP 》 Dave Bartlett 专栏文章

More Related