声明:本文为作者阅读《软件系统架构与开发环境》后的摘录笔记。
1 概述
一般说,任何独立的系统软件或服务程序,只要其功能介于操作系统和应用软件之间,都可以称为中间件。
中间件的优势:
1)能屏蔽下层软件与硬件的复杂性(包括异构性),从而简化分布式应用系统的设计与开发过程,提高效率,降低应用系统的获取成本
2)能扮演“专家”的角色,承揽解决系统架构中与“分布式”三个字关系比较密切的问题,包括可靠性、可伸缩性和可维护性等问题,从而可以使应用开发者把注意力集中在特定应用相关的问题上,实现软件生产的社会分工, 提高效率。
2 传统中间件
传统中间件主要针对两个问题:
1)如何规范独立软件之间的互相调用,减少乃至消除上述调用对下层软件与硬件环境的依赖性,
2)独立运行软件之间如何实现与下层软硬件环境包括网络环境无关的消息交换
主要分为四种:
2.1 远程过程调用中间件
图1 stub-skeleton模型
Stub称为客户桩,是远程服务过程/对象的本地代理,其作用是使客户端应用代码能够像调用本地子程序那样调用服务器端的程序。
Skeleton 称为服务器端骨架,负责与stub进行通信,从来自stub的请求中抽取变量信息,调用相应的服务过程或方法,并对调用的结果进行数据编码,再将其作为响应消息返还给stub。
图2 基于IDL的应用开发模型
IDL即接口定义语言(interface definition language),它是一种独立与软件开发语言的功能描述性语言,能够用一种中立的方式来描述服务器的应结构。注意IDL只能用于说明程序的某个功能,而不能够用于实现该功能,其详细语法通常作为某种规范颁布,以便用户与中间件开发商共同遵循。目前得到比较普遍认同的IDL规范是CORBA规范的重要组成部分,有OMG提供。
系统的开发从创建接口的IDL文件开始,上述IDL文件经过IDL编译器转换成Skeleton和stub的源代码,再分别与服务器端程序及客户端程序的源代码进行联编,最终成为在服务器端和客户端独立运行的程序。
远程过程调用无论如何发展,本质上还是一种可以串联的阻塞式同步调用,其有个主要特点是业务流程的各个环节都是通过API相连,这些API可能成为一条调用链,最终吧客户端与服务器端紧紧耦合在一起。因此,在同步业务流程中,前面的调用依赖与后面的调用,只要有一个调用出现异常,则整个业务流程就有可能处于停滞状态,基于以上考虑,设计人员经常在系统中有意的引入异步计算环节,特别是基于消息的异步计算环节,以改善性能。
2.2 消息服务中间件
消息服务中间件提供的是一种消息交换服务,它以标准化应用接口屏蔽下层软硬件环节的复杂性,可以在松散耦合的应用程序之间提供与底层平台无关的信息传输。
消息通常有消息头和消息体组成。其中消息头是对消息属性的描述,是中间件能够理解的、与消息体相关的系统消息;消息体就是消息承载体。
目前消息服务中间件主要采用两种消息服务模型:
1)消息队列(messagequeuing)模型
主要基于一个先进先出的逻辑队列实现点对点的消息交换,故也称为P2P服务模型
2)发布/订阅(public/subscribe)模型
主要基于主题来建立消息的发布操作与订阅操作之间的逻辑关系,可用于实现点对多的消息交换。
图 3 P/S消息服务模型
以上两种模型,消息的生产这和消费者都无需为交换信息而建立双方之间的连接;只要知道一个消息目的地名称。无论是队列名还是主题名,消息生产者都可以往该目的地发送消息,而消息消费者都可以从该目的地接受消息;再次,两个消息服务模型都可以支持消息的一部接收,即允许消息消费者吧消息处理句柄注册到目的地上。
以上两种该模型的主要差别在于消息的传递方式
P2P采用“存储转发”方式,特点如下:
1)生产这把消息发送到指定消息队列所代表的虚拟信道中
2)中间件负责把消息可靠地递送进目的地队列
3)目的地队列保存所有消息直到它们依次被消费者提取为止
注意消息队列独立于发送程序和接收程序,既是发送者发送消息的目的地,也是接收消息的消息源。
P/S模型实现的是观察者模式,要点如下:
1)消费者必须事先对其感兴趣的主题进行订阅
2)生产者把消息提交给中间件时指定一个主题
3)中间件负责把消息广播给该主题的所有订阅者
由于采用的是广播方式,P/S服务并不保证消息可以被所有订阅者收到。
2.3 数据库连接中间件
2.4 事务处理中间件
3 Java EE中间件
RMI 和会话EJB用于支持Java平台上的远程方法调用,后者名为组件,实际上更香是前者的一种应用框架,它们都是为Java EE其他服务技术的基础。包括用于支持Java平台上的消息服务的JMS技术、用于支持Java平台上的事务处理JTA/JTS技术,以及数据连接中间件移植到Java平台之后产生的JDBC数据源技术。
Java中间件产品例如JBOSS(开源的)和Weblogic(商品化的)。
3.1 Java的RMI技术
Java RMI技术用于在Java平台上支持远程方法调用
Java RMI的技术两个核心元素,其一是Java远程接口,即服务器程序提供远程客户调用的接口。第二核心元素,是Java的远程类,java.rmi.server.UnicastRemoteObject,且至少实现一个远程接口。
3.2 EJB技术
EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDrivenBean)。
EJB采用双接口,引入了所谓的home接口,home接口是EJB对象工厂的接口,用户可以通过home接口在参与EJB对象的生命周期管理。
3.3 JMS技术
JMS(Java Message Service)即Java消息服务,是在JavaEE 平台上实现上述消息服务模型的技术规范。
3.4 JDBC数据源与JTA/JTS
JTS (java transactionService)
4 Web Services 中间件
图4 WS应用系统框架之一