声明:此系列文章均为姜海宁老师原创,任何人不得转载.
我今天讲的内容涉及到教材上没有的重要概念和思想,它们大致属于软件体系结构范畴,当你从一个学生向软件工程师过渡时,掌握这些概念和思想是必需的。
组件及中间件技术综述
计算机软件的大厦是由不同层次的软件构成的。基础软件有操作系统和编译程序等,而应用软件更是无所不包,介入了几乎所有行业和很多家庭。近年来,随着网络应用的普及,一种新型的基础软件----中间件正在兴起,而组件技术做为软件复用和中间件的基础也为广大程序员所熟知。
|
应用软件component
|
|
中间件middleware
|
|
基础软件(操作系统,编译程序……)
|
对于一个软件开发人员,掌握组件及中间件技术是非常重要的,比操作系统和编译程序更重要,因为有机会开发操作系统和编译程序的程序员并不多,而组件及中间件几乎在任何软件开发中都要遇到。而且,在程序员将来的职业规划上,要上升到软件构架师,也必需对组件、中间件、设计模式、对象技术有很好的了解。
对于组件及中间件,同学们都有一些认识,比如WebService,COM/DCOM/COM+,JavaBean,EJB,CORBA等组件技术,我们不仅听说过还有一点编程经验;而IIS,ADO.NET等典型的中间件我们也比较熟悉。但这些知识散落在以前的不同专业课中,我们对组件及中间件的概念和思想缺少一个整体的认识,由于在软件方向的就业考试和研究生复试中,这类题目相当多,我用一节课的时间做个综述,使同学们能应付一下就业考试和研究生复试一般性的提问。
一、 面向对象、组件、中间件及它们之间的关系
1 面向对象
面向对象技术我们都很熟悉,也能掌握各种编程语言的类、对象、继承、多态等代码的写法。向向对象思想的本质,实际上是对人在进行抽象思维时----即从个别的具体对象发现一般规律时----思维习惯的模仿,也就是说从具体的对象到一般的类,再从一般的类回到具体的对象。面向对象技术的好处是:它将人的思维习惯与被开发的软件系统构架融合到一起,与早期面向过程的技术相比,更有利于对系统的分析设计及代码复用。
2 组件
组件是按一定标准和规范(比如WebService,COM,JavaBean,EJB,CORBA等)编写的,二进制的,可复用的软件构件。
3 中间件
什么是中间件?在中间件出现的早期(上世纪九十年代初),人们将中间件理解为介于操作系统和应用软件之间的软件,使远距离相隔的(分部式的)应用软件能协同工作。后来,国外学术界开始明确地给出了它的定义:“中间件是一种软件,它能使处于应用层的各应用成份之间实现跨网络的协同工作,这时允许各应用成份之下的系统结构、操作系统、通信协议、数据库及其它应用服务各不相同。”
|
应用软件
|
可协同工作
|
应用软件
|
|
中间件
|
中间件
|
|
网络协议
|
网络协议
|
|
操作系统
|
操作系统
|
|
硬件平台
|
硬件平台
|
|
|
|
与操作系统一样,中间件也是一种基础软件。它的种类比操作系统更多,这一点后面再讲。
3. 面向对象、组件、中间件的关系
面向对象、组件、中间件是三个相关性很强的不同的概念。
(1)组件和面向对象很相似,但组件和面向对象并没有直接的关系,早期它们是各自独立发展起来的,但现在所有的组件技术都是面向对象的也是不争的事实。比如开发一个WebService组件和写一个类差不多。
(2)中间件和组件有什么关系呢?组件是实现中间件的必要条件(这种说法理论上不通,但实际如此),也就是说中间件更多的只是一种思想,中间件具体的实现是一般是要通过某种组件技术的。但并不是所有组件都是中间件,一个组件是否中间件,要看它的软件系统架构中的作用和抽象程度。像IIS或其它的WEB服务器,以及ADO.NET、JDBC等数据连接工具则是很典型的中间件,它们本身实现为组件,在作用和抽象程度上也是中间件。比如ADO.NET是一个DLL文件,它即是组件,又是中间件。我们可以这样说,ADO.NET的物理形式是一个动态链接库DLL,它是由组件技术实现的,在功能和作用上又是一个中间件。JAVA程序员都知道JAVA应用服务器,JAVA应用服务器种类很多,但它们都遵J2EE规范,而J2EE的核心又是EJB---一种组件技术。所以基本我们可以说,JAVA应用服务器是一些组件的集合,这些组件的功能和作用相当于中间件,所以JAVA应用服务器基本上可以说是一些中间件的集合。
我们看到,面向对象、组件、中间件都体现了抽象和软件复用的思想,但存在形式和作用范围有区别,面向对象更多的是一种设计方法,我们可以用面向对象方法编写程序,将面向对象程序封装成符合某种规范的组件,如果该组件作用于操作系统和应用软件之间实现跨网络的协同工作,又有足够的抽象程度(即通用程度),那该组件就是中间件。
二、组件技术component
前面说过,组件是中间件的必要条件,先从组件讲起。
组件是按一定标准和规范(比如WebService,COM,JavaBean,EJB,CORBA等)编写的,二进制的,可复用的软件构件。组件技术实际上是为了满足软件重用要求而制定的规范。
软件组件的思想来自于工业化的实物装配生产,这种生产的特点是标准化的零件组成标准化的部件,标准化的部件组成标准化的产品,一种零件可用于多种部件,一种部件可用于多种产品。这种生产方式的好处是:分工细致,生产率高,质量好,维修服务方便。如果软件生产也采用这种方式,软件将从个体手工业劳动转化为工业化生产,一种标准化的软件组件就可以重复通用于不同的程序,这对软件行业有决定性的意义,这种生产方式我们已有所体验:对.NET或JAVA类库的使用,这些类库都由组件构成,我们用.NET 或JAVA编程,实际上就是用组件搭建自已的程序。
目前,常见的组件标准及产品有以下四个系列:
|
公司/组织
|
简称
|
|
|
微软
|
COM/DCOM
|
组件对象模型/分布式组件对象模型
|
|
COM+
|
|
|
.NET
|
|
|
SUN
SUN/IBM等
|
JavaBeans
|
|
|
EJB
|
企业版JavaBean
|
|
OMG
|
CORBA
|
公共对象请求代理
|
|
OMG
|
WebService
|
|
上述标准及产品内部细节不同,适用的平台也不同,但是设计思路是基本相同的。
组件技术主要用于本机和分布式环境下,不同程序间的协同工作,如果学过操作系统,我们就应该知道,组件技术其基本问题是进程间通信(IPC)问题。也就是说两个不同组件之间如何相互调用及传送信息。
程序间的协同工作本机在环境下比较简单,用操作系统的多进程共享内存(互斥、同步。。。)技术即可解决。但是组件是在分布式环下运行的,不太可能共享内存,所以要采用其它IPC机制。组件技术除了进程间通信(IPC)技术,还有其它技术,归结起来,组件包含的主要技术有:
(1) 进程间通信(IPC)技术:解决组件分布式环境下,信息传输的网络协议及信息传输格式等问题。
(2) 代理技术:一个组件调用另一个组件时,两个组件并不直接通信,而是通过各自的代理间接通信。代理技术还提供组件的位置透明服务。
(3) 组件的服务。
(4) 组件开发工具。
下面一一讲述。
1进程间通信(IPC)技术和代理技术
由于现有的组件技术无一例外的都是通过代理来实现IPC的,所以放在一起讲。
代理,其对应的英文单词有三个:agent , broker, proxy。Agent来自于人工智能,隐含“智能化的代理”,broker英文原意是“掮客,中间人”,agent 和broker常用于特指组件代理,而proxy主要用于网络。
现有的组件技术无一例外的都是通过代理来实现IPC的,其基本模型为:
当客户组件要调用服务器组件时,只需给客户代理发一个请求,调用和返回的细节则由客户代理---服务器代理去做。为什么组件间的IPC不直接完成而是要通过代理间接完成?这是软件体系结构的合理抽象。
让我们回想一下操作系统是怎么来的:我们知道软件的早期是没有操作系统的,各个应用程序的开发人员要单独处理程序的资源管理问题(内存分配,进程调独,文件管理,设备竟争等等),非常困难和麻烦。后来人们发现,尽管应用程序功能各不相同,但其中资源管理的功能是一样的,可以把它抽取出来单独做成一个软件-----操作系统,为所有的应用程序开发人员提供一个资源管理平台,这样应用程序开发人员就不需要独自编写资源管理程序了,普通用户也更容易使用计算机。我们说操作系统是对计算机资源管理的抽象。
组件代理也是如此,分布式组件在进行IPC时,虽然不同组件整体上功能各不相同,但与IPC有关的部分是相同的:比如通讯协议、信息传送格式及方式等等,把不同组件的这些相同部分抽取出来,做成代理,软件得到了合理的分层。其优点之一是:一些厂商可以专注于代理技术的研发;而组件程序员专注于组件本身的功能,IPC的编程问题则不需考虑,捆绑到某厂商现成的代理框架即可。比如说我们开发WebService,不需要写代理程序,甚至不需要知道代理的存在,只需完成程序的功能就可以,.NET IDE可自动把你的程序捆绑到WebService代理框架。
下面我提一个问题:
我们学过用.NET写WebService,但客户端程序调用WebService时,需要“添加WEB引用”,这个动作隐含的意思是什么?
答:是为调用该WebService的客户端生成一个客户端代理,而WebService的服务器端代理在编译WebService时已生成,这样在客户端程序调用WebService时,实际上是两个代理之间在通信。
现在的组件开发工具一般都将组件代理对程序员透明,但我们仍可以观察到一些蛛丝马迹,比如在开发WebService时,如果客户要调用WebService,需进行“添加WEB引用”操作,这个操作实际上就是为客户代理提供服务器端WebService的位置、公用方法集等信息。
前面讲了代理的基本思想,下面介绍代理如何实现IPC,其基本步骤为:
(1) 客户组件要调用服务组件,首先发一个请求给客户代理,客户代理存有服务组件位置、公用方法等信息;
(2) 客户代理将客户请求打包成某种格式,这个打包操作英文名称有的叫marshal(编组,打包),有的叫Serialization(序列化)。然后用某种网络协议(如TCP/IP)将包发给服务器代理。
(3) 服务器代理解包,解包操作英文名称有的叫unmarshal(解组,解包),有的叫Deserialization(反序列化),将信息传给服务器组件。
(4) 服务器组件执行请求,将请求结果给服务器代理,服务器代理打包发给客户代理,客户代理解包将调用结果返回客户代理。
以上就是代理实现IPC的基本步骤。代理另外要做的一件事是提供组件的位置透明服务,即在理想的状况下,客户和服务器不需要知道彼此的位置,就可借助各自的代理通信,即“智能代理”。这是项很难的工作,也是现在比较热门的研究方向。组件技术是很重要的软件技术,不仅用在组件,也可用在人工智能、通信、移动网等很多领域。
通过代理实现IPC是现代几乎所有组件技术的共同特点,它们构成了组件技术的基础。最早期的代理技术叫RPC(远程过程调用,在我们操作系统教材中有介绍)。RPC的实质是实现网络七层协议的会话层的工作,在两个试图进行通信的进程之间建立逻辑信道,并利用该信道交换信息。
现有的组件技术使用的代理框架细节各不相同,但其基本思路都来自RPC,下表列出了常见组件技术的代理框架。
|
公司/组织
|
组件简称
|
代理框架
|
|
微软
|
DCOM
|
DCE RPC分布计算环境下的远程过程调用
(DCE RPC的specification总共有700多页)
|
|
COM+
|
DCE RPC
|
|
.NET
|
.NET Remoting
|
|
SUN
SUN/IBM等
|
JavaBeans
|
RMI(远程方法激活)
|
|
EJB
|
RMI-IIOP或RMI-JRMP
|
|
OMG
|
CORBA
|
ORB(对象请求代理)
|
|
OMG
|
WebService
|
SOAP+XML
|
上述代理框架一般都支持TCP/IP、UDP等网络协议,WebService还支持HTTP,SMTP等网络协议。
在上述代理框架中,服务器代理和客户代理的名称也不一样。比如微软的COM系列,将服务器代理称为框架(skeleton),将客户代理称为根(stub);而JavaBeans、EJB和CORBA则反过来称呼。
2组件的服务
前面介绍的代理技术是组件的基本技术,代理技术可确保组件之间的IPC,即相互调用和传送信息。但在分布式环境下这还不够,组件的事务、安全、服务质量也是重要问题。
解决这类问题采用的思路是,把组件配置在一个环境(或容器)内,比如EJB<