<?xml:namespace prefix = o />
中间件技术综述与实现
班 级: 05算2
学 号: 0500402211
姓 名: 樊振华
成 绩:
<?xml:namespace prefix = st1 />2008年 01 月 11 日
一、 中间件技术综述
计算机技术迅速发展。从硬件技术看,CPU速度越来越高,处理能力越来越强;从软件技术看,应用程序的规模不断扩大,特别是Internet及WWW的出现,使计算机的应用范围更为广阔,许多应用程序需在网络环境的异构平台上运行。这一切都对新一代的软件开发提出了新的需求。在这种分布异构环境中,通常存在多种硬件系统平台(如PC,工作站,小型机等),在这些硬件平台上又存在各种各样的系统软件(如不同的操作系统、数据库、语言编译器等),以及多种风格各异的用户界面,这些硬件系统平台<?xml:namespace prefix = v /> <?xml:namespace prefix = w />还可能采用不同的网络协议和网络体系结构连接。如何把这些系统集成起来并开发新的应用是一个非常现实而困难的问题。
中间件(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
§ 通信介质
§ 连接的持续性:固定、移动。
通信方式:
§ 同步
§ 延迟同步
§ 单向
CORBA应用实现过程
对象实现:对象接口实际上是分布式对象向外提供服务的规格说明,是客户程序与对象实现之间的一种合约,双方必须严格遵守对象接口定义中的约定,包括操作名字,参数表,返回表,异常表,上下文等,对象接口定义存放在一个或多个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 } } |
|
AccountManager.java |
|
public class AccountManager //账户管理员的对象实现 extends Storehouse.AccountManagerPOA { protected Hashtable accountList; // 该帐户管理员所负责的帐户清单 public AccountManager(){ accountList = new Hashtable(); } public synchronized StoreHouse.Account open(String name){ StoreHouse.Account account=(StoreHouse.Account)accountList.get(name); if (account == null) { Random random = new Random(); float balance = Math.abs(random.nextInt())%100000/100f; AccountImpl accountServant = new AccountStorehouse(balance); try { org.omg.CORBA.Object obj = default_POA().servant_to_reference(accountServant); account = StoreHouse.AccountHelper.narrow(obj); } catch(Exception exc) { exc.printStackTrace(); } accountList.put(name, account); System.out.println("新开帐户:" + name); } return account;
}
}
|
|
Server.java |
|
public class Server //服务程序, 服务程序创建伺服对象供客户端使用 { public static void main(String[] args) { try { org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); //初始化ORB POA rootPOA = POAHelper.narrow( orb.resolve_initial_references("RootPOA")); org.omg.CORBA.Policy[] policies = { rootPOA.create_lifespan_policy(LifespanPolicyValue.PERSISTENT) }; //创建一个POA POA myPOA = rootPOA.create_POA("StoreHousePOA", rootPOA.the_POAManager(), policies); AccountManager managerServant = new AccountManager(); //创建提供服务的伺服对象 myPOA.activate_object_with_id( "StoreHouseManager".getBytes(), managerServant); //激活伺服对象 rootPOA.the_POAManager().activate(); //激活POA管理器 System.out.println("帐户管理员StoreHouseManager已就绪 .../n"); orb.run(); //等待客户程序发来请求 } catch(Exception exc) { exc.printStackTrace(); }//catch }//main }//Server |
|
Client.java |
|
public class Client //客户端程序 { public static void main(String[] args) { org.omg.CORBA.ORB orb=org.omg.CORBA.ORB.init(args, null); // 利用POA全称与对象标识"StorehouseManager"查找帐户管理员 StoreHouse.AccountManager manager = StoreHouse.AccountManagerHelper.bind( orb, "/StoreHousePOA", "StoreHouseManager".getBytes()); String name = args.length > 0 ? args[0] : "fanzhenhua"; // 请求帐户管理员找出一个指定名字的帐户,无此帐户则新开一个 StoreHouse.Account account = manager.open(name); System.out.println(name + “的帐户的货物剩余量为” + account.getBalance() + "件"); account.deposit(200); System.out.println(“存货200件后,货物剩余量为” + account.getBalance() + “件()”); if (account.withdraw(600)) { System.out.println(“取货600件后,货物剩余量为” + account.getBalance() + "件"); } else { System.out.println("货物剩余量不足600件,取货失败,余量保持不变"); } } }
|
三、参考文献
1.《中间件技术原理与应用》:清华大学出版社(张云勇,张智江等著)
2.《分布式对象技术》:机械工业出版社(李文军著)
3. 《精通Java中间件编程》: 中国水利水电出版社(李华飚等著)
4. 《IT体系结构与中间件——建设大型集成系统的策略》:人民邮电出版社([美]布里顿 著,刁联旺,李彬 译)
5.《分布式系统技术内幕》:首都经济贸易大学出版社(张军编著)
6.《网络时代的关键技术-“中间件”》 作者:梁兰芝,李月霞;
7.《计算机控制系统》,清华大学出版社(何克忠,李伟)
8.《Web Services技术、架构和应用》[M] 作者:柴晓路 梁宇奇,电子工业出版社2003年1月第1版
9.《承上启下中间件》作者:车勇,选自《互联网周刊》2000年47期;
10. 《新一代面向Internet的数据库访问技术研究》[J]作者:盛明颖. 顾君忠,选自《计算机应用》 2003年06期
11. 《新一代的分布式计算技术——Web服务》[J] 作者:宁葵,腾金芳选自《计算机工程》2003年3月 第29卷第3期
12. 《CORBA 实现系统性能优化策略研究》谢俊清、蔡敏、顾冠群,选自《计算机研究与发展》,1999,36(7),824-829;
13.《 New Features for CORBA 3.0》作者:S. Vinoski. 选自《Communications of the ACM》, 1998,41(10), 44-52