中间件一般由执行环境和应用开发工具两部分组成,可以分成事务处理中间件、消息中间件和分布式中间件等三种类型。
Sun公司于1997年在Java的JDK 1.1中引入了JavaBean组件技术,后来又于2000年随J2EE(Java 2 Platform, Enterprise Edition,Java 2平台企业版)引入服务器端的组件技术EJB(Enterprise JavaBeans企业爪哇豆)和网页编程工具JSP(JavaServer Page, Java服务器网页)。至此,Java成为了一种功能完备的分布式计算环境。这对(一心想进入利润丰厚的服务器端网络应用软件领域的)微软公司,造成了极大的威胁。
COM(Component Object Model组件对象模型)是微软公司于1993年提出的一种组件技术,是软件对象组件之间相互通信的一种方式和规范,它是一种平台无关、语言中立、位置透明、支持网络的中间件技术。
COM是OLE(Object Linking and Embedding对象链接和嵌入)的发展(而OLE又是DLL [Dynamic Link Libraries动态链接库]的发展),DCOM(Distributed COM分布式COM,1996年)和COM+(DCOM+管理,1999年)则是COM的发展。ActiveX控件是COM的具体应用(如VBX和DirectX都是基于ActiveX的)。ATL(Active Template Library活动模板库)是开发COM的主要工具,也可以用MFC来直接开发COM,但是非常复杂。
作为组件技术的进一步发展,微软公司又于2002年推出了.NET框架,其中的核心技术就是用来代替COM组件功能的CLR(Common Language Runtime公共语言运行库),可采用各种编程语言,利用托管代码来访问(例如C#、VB、MC++),使用的是.NET的框架类库FCL(Framework Class Library)
微软公司的各种组件技术之间的关系与发展可以参见下图:
DLL(Dynamic Link Libraries动态链接库)还不能算组件技术,但它是软件重用的鼻祖。
OLE(Object Linking and Embedding对象链接和嵌入)是微软公司于1991年推出的一种简单的组件技术,它允许Windows中的程序相互之间进行合作——一个(客户)程序调用另一个(服务器)程序,以完成特定的功能。而且客户/主程序的界面不变,就似将服务器程序嵌入到客户程序中一样。
实际上,OLE是一套可扩充的协议(OLECLI.DLL和OLESVR.DLL),能使客户和服务器应用程序通过一组DLL彼此进行通信。1993年随VC1.0又推出OLE2.0,对1.0版进行了若干改进,使客户和服务器的结合更加紧密,还允许服务器继承客户的主菜单,使得用户感觉不到在不同应用之间的切换,并且提供了C++的开发接口(1.0版只支持C语言开发)。
OLE使用DDE(Dynamic Data Exchange动态数据交换)作为客户和服务器应用程序间通信的传输机制。
3)COM
OLE 1.0实际上只是一种复合文档,而OLE 2.0已经具有标准组件的特性了,显然它是受了CORBA的影响。所以从OLE 1.0到OLE 2.0,是微软公司在组件技术上的一次飞跃。这时,OLE的名称就有一些名不副实了,因此,在增加了一些功能和规范之后,微软公司于1993年在OLE 2.0的基础上又推出了COM,用来替代原有的OLE。这样一来,OLE就不再是一种独立的组件技术,而只是COM技术在链接和嵌入方面的一个具体应用。而1996年3月推出的ActiveX控件,也只是COM的一个具体应用,它是用来替代原有的VBX控件的。
COM(Component Object Model组件对象模型)的核心是一组组件对象间交互的规范,它定义了组件对象如何与其使用者通过二进制接口标准进行交互,COM的接口是组件的球类型纽带。
除了规范之外,COM还是一个称为COM库的实现,它包括若干API函数,用于COM程序的创建。COM还提供定位服务的实现,可以根据系统注册表,从一个类标识(CLSID)来确定组件的位置。
COM采用自己的IDL来描述组件的接口(interface),支持多接口一解决版本兼容问题。COM为所有组件定义了一个共同的父接口IUnknown。GUID 是一个 128 位整数(16 字节),COM将其用于计算机和网络的唯一标识符。
在COM模型中,所有将CLSID传递给COM并获得实例化的对象,都被称为COM客户(程序)。最简单的实例化方式,是调用COM函数CoCreateInstance。也可以通过调用CoGetClassObject函数来为CLSID获得类工厂(Class Factory)对象的接口指针。
与COM客户程序相比,COM服务器在于实现类工厂和其生产的对象类,并将工厂提供给COM使用。
DCOM(Distributed COM,分布式COM)是COM的网络化。COM具有进程透明性,组件对象和客户代码不必考虑调用传递的细节,只须按照普通函数方式进行调用即可。而DCOM将COM的进程透明性扩展为位置透明性,形成分布式的组件对象模型。
COM组件有两种进程模型:进程内组件和进程外组件。由于本地进程外组件与客户运行在不同的进程空间,所以客户程序对组件对象的调用,并不是直接进行的,而是用到了操作系统支持的一些跨进程通信方法,主要有OSF(Open Software Foundation开放软件基金会,现在改为Open Group[开放小组http://www.opengroup.org/])开发的DCE RPC(Distributed Computing Environment 分布式计算环境Remote Procedure Call 远程过程调用)和LPC(Local Procedure Calls本地过程调用)。
为了将组件服务延伸到网络,DCOM建立在自己的网络协议上,并通过SCM(Service Control Manager服务控制管理器)来创建远程对象。
COM的"ORB"结构
COM+是COM-based services and technologies(基于COM的服务与技术)的简称,+表示将COM组件技术和MTS(Microsoft Transaction Server微软事务服务器)应用程序主机技术结合在一起。它是一个面向应用的高级COM运行环境,它在COM基础上实现了许多面向企业应用的分布式应用程序所需要的服务。COM+是1999年随Windows 2000推出的。
COM+是Windows DNA(Distributed interNet Application [Architecture]分布式网间应用程序[体系结构])框架的重要组成部分。DNA为Windows环境下开发分布式应用程序提供了工具和框架,而COM+则是DNA的中间件技术和粘结剂。COM+会自动处理不同的编程任务,诸如资源集池、分离应用程序、事件发布、预定和分布式事务。
其中:
IE = Internet Explorer因特网探索者(微软的网页浏览器)
HTTP = Hypertext Transfer Protocol超文本传输协议(W3C制定的万维网的数据传输协议)
IIS = Internet Information Services因特网信息服务(微软的因特网服务器平台组件)
ASP = Active Server Page动态服务器网页(微软的Web服务器端的动态网页脚本语言)
Visual InterDev = VS中针对因特网应用程序的专用开发工具(使用ASP)
MTS = Microsoft Transaction Server微软事务服务器(协调组件和数据库、负责管理资源的缓存和共享、实现可伸缩性,通常被用作组件的容器,可以视为组件管理器或代理程序)
MSMQ = Microsoft Message Queue Server微软信息队列服务器(负责复杂的、涉及发送和接收、同步和异步之信息获取的协调工作)
ADO = ActiveX Data Objects,ActiveX数据对象(微软的关系数据库访问组件)
SQL = Structured Query Language结构化查询语言(关系数据库的通用查询语言,国际标准)
Web服务
|
|
框架和库
(ASP.NET、ADO.NET、Windows窗体)
|
|
交互标准
(SOAP、WSDL)
|
开发工具
(Visual Studio .NET/2005)
|
组件模型
|
|
对象模型和CLS
|
|
CLR
|
① COM缺乏对组件依赖性的描述。因此,没有办法来解析COM组件(或者其约定的定义),也不能确定它所需要的其他组件,从而无法保证它的正确运行。由于缺少相关信息,使得部署基于COM的应用程序,很难确定它需要哪些DLL,也不能静态确定所需要的是哪个版本的组件,这让对版本问题的诊断变得极其复杂;
为了解决COM所存在的这些问题,微软公司的COM和MTS小组,计划开发一个新的组件平台。开始时叫COM3或COM+ 2.0,后来又叫COR(Component Object Runtime组件对象运行时)和URT(Universal Runtime通用运行时),最后才被命名为CLR(Common Language Runtime公共语言运行时[库/层])。它是现在(由微软提交的)成为国际标准的CLI(Common Language Infrastructure公共语言基础结构)在Windows平台上的一种具体实现。
CTS(Common Type System公共类型系统)——被编译器、工具和CLI本身所共用的一种统一类型系统。 它是一个模型,定义了在声明、使用和管理类型时,CLI应遵循的规则。CTS建立了一个框架,使跨语言集成、类型安全和高性能的代码执行成为可能;
CLS(Common Language Specification公共语言规范)——语言设计者和框架(类库)设计者之间的一种协定(agreement)。它指定了CTS的一个子集和一个用法常规(usage conventions)集;
metadata(元数据)——描述和引用CTS所定义类型的数据。元数据被以一种独立于任何特定的程序设计语言的方式存储。从而,元数据为操作程序的工具(如编译器和调试器)之间,以及这些工具和VES之间提供了一种公共交换机制。
VES(Virtual Execution System虚拟执行系统)——该系统实现和实施CTS模型。VES负责装入和运行为CLI编写的程序。它在运行时,利用元数据将分开产生的模型连接在一起,并为执行托管代码和数据提供所需要的服务。VES也被称为执行引擎;
CIL(Common Intermediate Language公共中间语言)——可被VES理解的指令集,也被称为MSIL(微软IL)。
与COM相比,CLR的组件技术有了质的飞跃,前面提到的各种COM问题都迎刃而解、一扫而光。
相同点——约定(类型)
不同点1——约定的描述(元数据)
不同点2——约定的类别(逻辑结构)
不同点3——CIL
COM向CLR过渡