第十章 构建平台与典型架构
10.1 OMG 方式
对象管理组 OMG,通过规范化对象 开放市场的 所有层次上的互操作性。
10.1.1 对象请求代理
CORBA 的主要目标就是 使用不同语言、不同实现、不同平台 能进行交互。
CORBA 三个基本部分:一套调用接口、对象请求代理 ORB、一套对象适配器。
10.1.2 公共对象服务规范
两类服务:一类服务应用于企业计算系统。一类服务应用于细粒度的对象操作,但目前这些服务的实用价值较差。
1、支持企业分布式计算的服务
1.命名服务、交易器服务
命名服务 允许 任意地给对象赋予一个名字,这个名字在其所属的命名语境中是唯一的。
命名语境所形成的层次结构,使得所有的名字形成名字树。
交易器服务 允许给对象 赋予一个复杂的描述,从而允许客户基于该描述来定位所需的对象。
搜寻结果往往是 满足查询条件的 一组对象列表。
2.事件服务、通告服务
事件服务 允许定义那些 从 时间生产者 被 发送到时间消费者 的事件对象。
信息只能从生产者流向消费者,事件必须通过事件通道传播,事件可以具有类型,而通道可以根据类型过滤事件。
事件通道支持“推”“拉”两种方式 的事件通告模型。
通告服务为事件服务增加了几个重要的特征——服务质量 QoS 规范 和 管理。
3.对象事务服务
对象事务服务 OTS,是建立分布式应用最重要的服务之一。
OTS 实现必须支持平坦事务,而嵌套事务是可选的。
在基于构件的系统中,嵌套事务似乎不可避免。
平坦事务在构件系统中的价值有限,实际上,现有的主流事务中间件也不支持嵌套事务。
6.并发控制服务
支持对象资源进行 加锁、解锁。
锁必须依赖于 事务的语境 或 其他语境才能获得。
读锁、写锁、升级锁。
读锁允许多个客户同时执行读操作,写锁允许一个客户写操作,升级锁是可以升级为写锁的读锁 支持互斥读。
每个受保护的资源都拥有一个锁集合。锁集合 不是事务型 就是非事务型,并可与其他锁集合建立关联。
8.生命周期服务
支持 创建、复制、移动、删除 CORBA对象,及其相关的对象组。
包含关系支持嵌套复制。
11.外部化服务
支持对象网 和 对象流 之间的双向映射。对象网外部化后 再内部化 意味着创建该对象网副本。
外部化服务并不保证引用的完整性,仅保留同时外部化的对象之间的引用。
对象必须实现 Streamable 接口才能被外部化。
12.属性服务
允许将任意的属性与对象关联起来,被关联的对象必须实现 ProperySet接口。
13.对象查询服务
依靠属性定位对象。
15.时间服务
拥有众多异步时钟的分布式系统 固有的误差问题。
10.1.3 CORBA 构件模型
CORBA 对象适配器主要的作用 就是在一个 ORB 和 真正接收调用并且返回结果的 对象之间 进行交互。
10.2 SUN 公司的方式
10.2.1 Java 构件技术的概述
Java中,编译器会检查 Applet 代码的安全性,通过了编译器检查的 Applet 代码不会带来安全隐患。
由于编译得到的字节码仍然可能被人修改,代码在装载时刻会被再次检查(称为“校验”)。
运行环境(Runtime Environment,RE)、软件开发工具包(Software Development Kit,SDK)、参考实现。
运行环境是 Java 虚拟机 和 必须具有的 J2SE API 的实现。
10.3 Microsoft 的方式
微软选择的是最简单的路线,他没有提出一整套标准;相反,他不断对已有的应用和平台基础进行再工程,这就可以获益于以前的成功技术。
语言无关性,作为 CLR 的一条主要原则。
10.3.1 第一个基础关联模型——COM
COM 所定义的一个基础实体是接口。在二进制层面上,一个接口被表示为指向一个接口节点的指针。
接口节点 唯一被指定的部分是 置于其内部第一个域的 另一个指针,这个指针指向一个过程变量表(或者说,函数指针表)。
每个 COM 对象都有 IUnknown接口,通常置于 COM对象图的顶端。
他的“真实”名字是他的 IID,即 00000000-0000-0000-C000-000000000046 为了方便,所有接口也有一个 可读名。
根据习惯,可读接口名以字母I开头。与 IID 不同,可读接口名 并不保证是唯一的。因此,编程中的接口引用均使用 IID。
IUnknown 接口的首要用途是在 最抽象的情况下 标志 COM对象,此时 COM对象 没有任何特殊功能。
IUnknown 接口 只提供对任何 COM接口都必须的三个强制性方法。QueryInterface、AddRef、Release,后两个强制性方法被用来控制对象的生命周期。
类型 HRESULT 被大多数 COM接口的方法用来表示调用成功或失败。 QueryInterface表明查询的接口是否被支持。
每个 COM对象都会进行引用计数,引用计数变量被共享使用的情况下,COM对象 不能释放接口节点。
一般这样做没有问题,也是通常的做法。
某些情况下占用很多资源,可以使用独立的引用计数变量,以便节点可以尽早释放。这种根据需要创建和删除接口节点的技术有时被称作“快速装卸接口(Tear-Off Interface)”
10.3.2 COM对象重用
COM不支持任何形式的实现继承。
COM支持两种形式的对象组装:包含(Containment)和 聚集(Aggregation)。
包含 是一个对象 拥有 指向另一个对象的唯一引用。
外部对象 只是把请求转发给内部对象,所谓转发 就是调用内部对象的方法。
包含能重用内含于其他构件的实现,是完全透明的。
如果包含层次较深,或者被转发的方法本身相对简单,包含会存在性能上的问题。因此 COM定义第二类重用形式,聚集。
聚集直接把内部对象接口引用传给外部对象的客户,而不是再转发请求。
保持透明性是很重要的,因为外部对象的客户无法辨别哪个特定接口是从内部对象聚集而来的。
10.3.3 接口和多态
COM接口可通过(单)接口继承 从其他 COM接口中派生。
COM 的接口继承与其支持的多态无关。
接口和版本化,一旦公布,COM 接口和他的规范不允许以任何形式改变。
既解决了语法问题,也解决了弱基类问题。
IID 可用于标志接口中的版本,因为接口总是通过IID被请求。
CORBA 讨论中所提及的传递性版本冲突问题 在COM中不会发生。
构件可以选择实现接口的多个版本,处理方式就像处理 别的不同接口一样。
基于COM的系统能并发支持旧接口和新接口。
10.3.4 COM对象的创建 和 COM库
创建 COM类 的实例对象时,COM需要把给定的 CLSID 映射为包含所请求的类的实际构件。COM 支持系统注册器,它类似 CORBA存储器。
进程内(inprocess)服务器、本地服务器、远程服务器。
10.3.5 从 COM到分布式 COM(DCOM)
代理(Proxy)对象 和 服务器 桩(Stub)对象。
为支持 跨进程 或 跨机器 的透明通信,COM在客户端创建代理对象,在服务器端创建桩对象。
跨进程传递的 接口引用需要被映射为 对象引用。
DCOM 将数据整理成平台无关的网络数据表达(NDR)形式。
10.3.6 复合文档 和 OLE 对象
OLE 可被 概括为 一组预定义的 COM 接口。
文档容器 和 文档服务器。
文档服务器 是提供某种内容模型 和显示、操作内容的能力。文档容器没有自己的内容,但可以接受任意文档服务器提供的内容成分。
许多文档容器也是文档服务器,即是说,他们支持外来的成分,同时也有自己的内容。
10.3.7 .NET 框架
没有原始类型。