中间件技术综述与实现
班 级: 05算2
学 号: 0500402211
姓 名: 樊振华
成 绩:
一、 中间件技术综述
计算机技术迅速发展。从硬件技术看,CPU速度越来越高,处理能力越来越强;从软件技术看,应用程序的规模不断扩大,特别是Internet及WWW的出现,使计算机的应用范围更为广阔,许多应用程序需在网络环境的异构平台上运行。这一切都对新一代的软件开发提出了新的需求。在这种分布异构环境中,通常存在多种硬件系统平台(如PC,工作站,小型机等),在这些硬件平台上又存在各种各样的系统软件(如不同的操作系统、数据库、语言编译器等),以及多种风格各异的用户界面,这些硬件系统平台
中间件(Middleware)是一种软件,处于系统软件(操作系统和网络软件)与应用软件之间,它能使应用软件之间进行跨网络的协同工作(也就是互操作),这时允许各应用软件之下所涉及的“系统结构、操作系统、通信协议、数据库和其它应用服务”各不相同。
中间件可以满足大量应用的需要,可运行于多种硬件和os平台,它支持分布式计算,提供跨网络、硬件和os平台的透明性的应用或服务的交互功能,支持标准的协议,支持标准的接口。
中间件具有两个部分:
1. 执行环境(Execution Environment)软件: 如果一个网络的各个节点上安装了EE软件,各节点上的应用软件之间就可以实现相互合作。这时允许各节点可为不同的机器和操作系统。也即EE软件使各节点下层的设备对应用软件来说变成了透明的。所以EE软件是实现可互操作功能的关键,是中间件中的主体部分。应用开发(Application Development)工具。
2.应用软件要能透明地动用远方合作者的资源,该软件中应有作出此种透明动用的相应指示。为此必定要有一组工具,它可以用来开发含“透明动用对方”成分的应用软件,或改造原有的无透明动用能力的应用软件。这组AD工具含有一些专用语言(如界面描述语言和界面调整语言等)和有关的编译器。有了它,用户(特别是应用软件开发人员)将得到极大的方便,所以AD工具是一个完善的中间件所必备的部分。
中间件的分类:
按照IDC的分类方法,中间件分为:远程过程调用中间件,数据库访问中间件,事务处理中间件,消息中间件,分布式中间件。这里主要介绍分布式对象中间件。
简单地说,对象中间件就是用面向对象技术实现的、支持面向对象开发和集成应用的中间件。
对象技术的封装、继承及多态性提供了良好的代码重用功能,并且对象的对外透明性也符合中间件技术的要求。面向对象的中间件技术基本思想是提供一种统一的接口.使对象之间的调用和数据共享不再关心对象的位置、实现语言及所驻留的软硬件系统。分布式对象技术就目前主流主要有三个OMG组织的CORBA、Microsoft的COM/DCOM、SUN的J2EE等,当前,CORBA、DCOM、RMI等RPC中间件技术已广泛应用于各个领域。下面主要以CORBA为例介绍分布式对象技术。
CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程序体系规范。OMG组织是一个国际性的非盈利组织,其职责促进在分布式系统开发中面向对象技术的理论与实践的发展。由OMG制定的最关键的规范——对象管理结构(Object Management Architecture, OMA)和它的核心(也就是CORBA规范),提供了一个完整的体系结构。这个结构以足够的灵活性、丰富的形式适用了各类分布式统。C-ORB-A: “Common” + “ORB” + “Architecture” 通用“orb”体系结构。由三部分组成:作为分布式对象通信基础设施的对象请求代理ORB的体系结构,接口定义语言IDL的语法和语义以及到各种程序设计语言的映射,保证可互操作性的标准ORB间的通信协议GIOP/IIOP。
二、中间件技术实现
一个Corba 应用程序开发过程及环境如下:
运行平台:
§ 集成遗留系统
§ 性能和通用性的权衡
网络传输:
§ 编程模式:DEC RPC, java RMI, GIOP/IIOP
§ 通信协议:TCP/IP
§ 通信介质
§ 连接的持续性:固定、移动。
通信方式:
§ 同步
§ 延迟同步
§ 单向
对象实现:对象接口实际上是分布式对象向外提供服务的规格说明,是客户程序与对象实现之间的一种合约,双方必须严格遵守对象接口定义中的约定,包括操作名字,参数表,返回表,异常表,上下文等,对象接口定义存放在一个或多个IDL文本文件中,指明每一对象对外提供的服务,以及客户程序如何使用这些服务或处理服务的返回结果。IDL是一种说明性语言,定义组件接口,不定义实现,再通过编译器将IDL映射到具体程序设计语言,产生桩代码和框架代码。这里使用JAVA语言编写对象实现和服务程序,产品提供商(sun)提供IDL到语言的映射,代码必须继承或使用某些生成的接口和类。
服务程序:利用POA激活伺服对象供客户程序使用,一般是一个循环执行的进程,不断监听客户请求并为之服务
客户程序: 1.初始化ORB:获取ORB伪对象的引用,调用ORB内核所提供的操作,基础设施中的一个对象,本地的统一观点,不依赖于对象适配器的操作,获取初始对象引用、创建策略对象、运行和终止进程等。2.获取分布式对象的引用,利用提供的服务。
创建并部署应用程序:1.编译:客户代码和生成的IDL桩代码及对象实现、服务程序和框架代码。2.部署:工具和步骤一般和ORB产品有关。
下面以远程出入库管理系统来说明一个Corba 应用程序开发过程(编程语言使用java实现)。
远程仓库出入库管理系统:
远程仓库管理公司大量的货物,提供基本的注册开户(不同种类货物使用不同账户)、存货、取货、查询货物数量的功能,一个仓库管理员管理。
首先写一个storehouse.idl的程序,定义仓库管理系统的对象接口, 此程序经由IDL编译器(Visibroker for java提供的编译器idl2java)映射到java语言,产生java语言的桩代码和框架代码(Stub与Skeleton),还有一些辅助文件。VisiBroker for Java的IDL编译器idl2java为每个接口自动生成7个文件(生成在一个storehouse的包中):AccountOperations.java,Account.java,_AccountStub.java,AccountPOA.java,AccountPOATie.java,AccountHelper.java,AccountHolder.java ,其中Account.java和AccountOperations.java定义了IDL接口Account的完整基调。AccountOperations.java(操作接口)定义了Account接口中定义的所有常量和方法。AccountStub.java是Account对象在客户端的桩代码,它实现了Account接口,AccountPOA.java是Account对象的服务端框架代码, AccountHolder.java声明的AccountHolder类为传递对象提供支持。
然后再根据生成的桩代码和框架代码,编写货物账户和仓库管理员程序。
最后,可以再编写一个名为Server.java的服务程序,服务程序创建伺服对象供客户端使用。
按一定顺序执行应用程序即可。
|
§ 一个账户的实体模型。 § balance:表示此货物当前的数量。 § deposit:存货 § withdraw:取货 § getBalance:查询货物剩余量
|
||
|
¨ 仓库管理员的实体模型。 ¨ accountList :记录当前已开设的所有帐户。 ¨ open:根据帐户标识查找某一帐户,如果该标识的帐户不存在则创建一个新帐户。
|
||
附上原代码: |
|||
Storehose.idl |
|||
// idl文件,本程序的作用是仓库帐户管理系统的对象接口定义 module Storehouse { interface Account { // 帐户 void deposit(in float amount); // 存货 boolean withdraw(in float amount); // 取款 float getBalance(); // 查询货物剩余量 }; interface AccountManager { // 仓库管理员 Account open(in string name); // 查询指定名字的帐户,查无则新开帐户 }; }; |
|||
AccountStorehouse.java |
|||
public class AccountStorehouse extends Storehouse.AccountPOA { //货物账户的对象实现 protected float balance; // 属性定义,货物余量 public AccountStorehouse(float bal){ // 构造方法,按货物余量创建新的帐户 balance = bal; } public void deposit(float amount){ // 往货物账户中存货 balance += amount; } public boolean withdraw(float amount){ // // 从货物账户中取货,不足则返回false if (balance < amount) return false; else { balance -= amount; return true; } } public float getBalance(){ // 查询货物账户货物剩余量 return balance }
|