什么是中间件

中间件分类(IDC分类):大致可以分为6类:终端仿真/屏幕转换中间件、数据访问中间件、远程过程调用中间件、消息中间件、事务中间件、对象中间件。
中间件涵盖的范围很广,针对不同的应用需求,出现了各种独特的中间件产品。但是到目前为止,中间件还没有一个精确的定义,所以中间件的分类会从不同的角度或层次有所不同。因为中间件需要屏蔽分布式环境下的异构操作系统和网络协议,所以必须能够在分布式环境下提供通信服务,我们称之为平台。根据目的和实现机制的不同,我们将平台分为以下几大类:
远程过程调用中间件(远程过程调用)
面向消息的中间件
对象请求代理(对象请求代理)
它们可以提供不同形式的通信服务,包括同步、排队、订阅和发布、广播等。在这些基本的通信平台上,可以构建各种框架来为应用程序提供不同领域的服务,如事务监控、分布式数据访问、对象事务管理器OTM等。平台为上层应用屏蔽了异构平台之间的差异,其上的框架定义了相应领域应用的系统结构和标准服务组件。用户只需要说出框架关心的事件,然后提供处理这些事件的代码。当事件发生时,框架调用用户的代码。用户代码不需要调用框架,用户程序不需要关心框架结构、执行流程、调用系统级API等。这些都是框架做的。因此,基于中间件开发的应用具有良好的可扩展性、可管理性、高可用性和可移植性。
远程过程得
远程过程调用是一种广泛使用的分布式应用处理方法。应用程序使用RPC“远程”执行位于不同地址空间的过程,效果与执行本地调用相同。实际上,一个RPC应用程序分为两部分:server和Client。服务器提供一个或多个远程过程;客户端对服务器进行远程调用。服务器和客户端可以位于同一台计算机上,也可以位于不同的计算机上,甚至可以运行在不同的操作系统上。他们通过网络交流。相应的存根和操作支持提供数据转换和通信服务,从而屏蔽不同的操作系统和网络协议。RPC通信在这里是同步的。使用线程可以进行异步调用。
在RPC模型中,只要客户端和服务器有相应的RPC接口和RPC运行支持,就可以完成相应的互操作,而不局限于特定的服务器。因此,RPC为客户机/服务器分布式计算提供了强大的支持。同时,远程过程调用RPC提供基于过程的服务访问。客户端与服务器直接相连,没有中间代理来处理请求,因此也有一定的局限性。比如RPC通常需要一些网络细节来定位服务器;在客户端发出请求的同时,服务器必须是活动的,以此类推。
面向消息的中间件
MOM是指使用高效可靠的消息传递机制的独立于平台的数据交换,以及基于数据通信的分布式系统的集成。通过提供消息传递和消息队列模型,它可以扩展分布式环境中进程之间的通信,并支持多种通信协议、语言、应用程序、硬件和软件平台。流行的MOM中间件产品包括IBM的MQSeries和BEA的MessageQ。消息传递和排队技术有以下三个主要特征:
通信程序可以在不同的时间运行
程序在网络上不直接相互对话,而是间接把消息放入消息队列,因为程序之间没有直接的连接。它们不必同时运行。当消息被放入适当的队列时,目标程序甚至根本不需要运行;即使目标程序正在运行,也不意味着应该立即处理消息。
对应用程序的结构没有限制
在复杂的应用中,通信程序不仅可以有一对一的关系,还可以有一对多和多对一的方法,甚至是上述方法的组合。多种通信模式的构建不会增加应用的复杂性。
程序与网络复杂性无关
程序将消息放入或取出消息队列进行通信。与此相关的所有活动,如维护消息队列、维护程序和队列之间的关系、处理网络重启和移动网络中的消息,都是MOM的任务。程序不与其他程序直接对话,也不涉及网络通信的复杂性。
对象请求代理
随着对象技术和分布式计算技术的发展,它们结合形成了分布式对象计算,成为软件技术的主流。1990年底,OMG首次引入了OMA(对象管理架构),对象请求代理(Object Request Broker)是该模型的核心组件。它的功能是提供一个通信框架,在异构分布式计算环境中透明地传输对象请求。CORBA规范包含了ORB的所有标准接口。1991年引入的CORBA 1.1定义了接口描述语言OMGILD和支持特定ORB上客户机/服务器对象互操作性的API。CORBA 2.0规范描述了不同厂商提供的orb之间的互操作性。
对象请求代理(Object Request Broker,ORB)是一种对象总线,在CORBA规范中起着核心作用。它定义了异构环境中对象透明地发送请求和接收响应的基本机制,是建立对象间客户机/服务器关系的中间件。ORB使对象能够透明地向其他对象发送请求或从其他对象接收响应,这些对象可以位于本地或远程。ORB截获请求调用,负责寻找能完成请求的对象,传输参数,调用相应的方法,返回结果。客户端对象不知道与服务器对象通信、激活或存储服务器对象的机器制,也不必知道server对象位于何处、它是用何种语言实现的、使用什么操作系统或其他不属于对象接口的系统成分。
  值得指出的是client和server角色只是用来协调对象之间的相互作用,根据相应的场合,ORB上的对象可以是client,也可以是server,甚至兼有两者。当对象发出一个请求时,它是处于client角色;当它在接收请求时,它就处于server角色。大部分的对象都是既扮演client角色又扮演server角色。另外由于ORB负责对象请求的传送和server的管理,client和server之间并不直接连接,因此,与RPC所支持的单纯的Client/Server结构相比,ORB可以支持更加复杂的结构。
  事务处理监控
  事务处理监控(Transaction processing monitors)最早出现在大型机上,为其提供支持大规模事务处理的可靠运行环境。随着分布计算技术的发展,分布应用系统对大规模的事务处理提出了需求,比如商业活动中大量的关键事务处理。事务处理监控界于client和server之间,进行事务管理与协调、负载平衡、失败恢复等,以提高系统的整体性能。它可以被看作是事务处理应用程序的”操作系统”。总体上来说,事务处理监控有以下功能:
  进程管理,包括启动server进程、为其分配任务、监控其执行并对负载进行平衡。
  事务管理,即保证在其监控下的事务处理的原子性、一致性、独立性和持久性。
  通讯管理,为client和server之间提供了多种通讯机制,包括请求响应、会话、排队、订阅发布和广播等。
  事务处理监控能够为大量的client提供服务,比如飞机定票系统。如果server为每一个client都分配其所需要的资源的话,那server将不堪重负(如图2所示)。但实际上,在同一时刻并不是所有的client都需要请求服务,而一旦某个client请求了服务,它希望得到快速的响应。事务处理监控在操作系统之上提供一组服务,对client请求进行管理并为其分配相应的服务进程,使server在有限的系统资源下能够高效地为大规模的客户提供服务。
  这一节我们主要来学习一下什么是中间件,为什么使用中间件和主要中间件的分类。
  中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。
  执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或 OS 环境。
  中间件是介于操作系统和应用软件之间,为应用软件提供服务功能的软件,有消息中间件,交易中间件,应用服务器等。由于介于两种软件之间,所以,称为中间件。
  具体地说,中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上的移植而重复工作,从而大大减少了技术上的负担。
  中间件带给应用系统的,不只是开发的简便、开发周期的缩短,也减少了系统的维护、运行和管理的工作量,还减少了计算机总体费用的投入。
  1. Hadoop
  当一个大的任务由一台机器在规定的时间内不能完成时,人们就要采用分布式计算,即很多台机器联合起来共同完成任务。换句话说,就是把大任务拆分成许多个小任务,然后再把这些小任务分配给多台计算机去完成。参与计算的多台计算机组成一个分布式系统,需要运行一系列的分布式基础算法。
  Hadoop 就是一个分布式计算平台,用 Java 语言开发,包含 Common、MapReduce 和 HDFS 三个核心部件(HDFS 和 MapReduce 是最核心的两个部件)。其中:
  Common 为 Hadoop 的其他项目提供了一些常用工具,主要包括系统配置工具 Configuration、远程过程调用 RPC、序列化机制和 Hadoop 抽象文件系统等。
  MapReduce 是处理海量数据的计算模型。
  而 HDFS 用于存储海量数据,它具备高度容错性,能在低成本的通用硬件机器上稳定运行。
  Hadoop 实现了分布式计算中的基础算法(如一致算法、选举算法、故障检测、快照等),同时为用户提供了编程和命令接口。程序员调用这些函数能轻松写出分布式应用程序,我们都知道,如果一切从头开始,要完成一个分布式程序的编写是异常艰难的。
  Hadoop 在海量非结构化数据处理方面能充分展示它的优势,如消费者购买行为分析、商品推荐、关键词检索、信贷风险评估等。
  如图 1 所示,Hadoop 其实就是一个分布式计算平台,它“覆盖”在操作系统之上,向上提供函数调用(API)和命令接口,在水平方向完成分布式系统的基础算法。作为编程人员和用户,只要了解 API 和命令即可。
  图 1 Hadoop
  基于 Hadoop 平台衍生出来的开源项目主要有 Yarn、HBase、Hive、ZooKeeper、Avro、Sqoop、Mahout、Crossbow 等。
  以 Hadoop 为基础的生态目前已经成为大数据的标准方案,被广泛用于金融、市场、电信、交通等行业的海量数据分析,在即将到来的大数据时代,它将会发挥更大的作用。
  在中国,很多行业(如银行、电信、移动、电力、石油、交通等)沉淀了大量的业务数据,对这些海量数据进行挖掘和分析,将会带来巨大的价值。
  用 Hadoop 构建的应用实例对于计算资源的消耗具备两个明显的特征:
  资源需求大:表明 Hadoop 需要大量的存储、计算和网络带宽。
  资源需求具备季节性:表明除存储需求是经常性占用外,在运行 Mapreduce 时才需要大量的计算和网络资源,而分析大量数据的工作并不是经常性的――称为季节性
  因此,云计算是大数据天生的计算资源供应途径,云计算的资源弹性很好地满足了大数据的季节性计算资源需求。也就是说,大数据是云计算经典的应用案例。当然,也可以按照大数据对计算资源的波峰需求静态配给计算资源,但是这种方案会造成资源的巨大浪费。
  2. LVS
  LVS 是 Linux Virtual Server 的首字母缩写,意为 Linux 虚拟服务器,即把许多台物理 Linux 计算机逻辑上整合成一台超级计算机,对用户来说感觉只有一台计算能力很强的服务器,如图 2 所示。
  LVS 就是一个由软件实现的负载均衡器,工作在网络 OSI 的第四层(应用层),是中国人章嵩开发的,代码已经并入了 Linux 内核。利用它,再加上一台廉价的计算机,就能构建一台企业级的负载均衡器。而那些外国大公司的负载均衡器,售价都要十几万元,甚至几十万元,便宜的也要几万元,LVS 出来后,这些产品都不得不降价。
  负载均衡器的作用就是把任务分配给最合适的服务器。比如一个大型购物网店,有 100 台同样配置的服务器在运行,如果某一时刻有 10 万用户在线购物,那么通过负载均衡器,每台服务器差不多承担 1000 个在线购物用户。
  LVS 的官网网站是 http://另外,两个较为流行的第七层负载均衡器是 Nginx 和 HAProxy,针对应用做均衡,所以能适应的负载种类没有 LVS 多。
  图 2 LVS原理图
  3. Linux-HA
  也许有读者会问:“负载均衡器本身故障怎么办?”是的,如果负载均衡器出现故障,那么整个系统(如网店)将会瘫痪。所以人们开发了各种集群软件,如 Linux-HA 和 Keepalive 等,而微软干脆就在 Windows 服务器版中集成故障转移集群软件。
  集成故障转移集群软件的核心思想是,实时检测故障机器并及时让好的机器接管工作,对外提供高可用性。Linux-HA 意为 Linux 高可用性项目,此项目具体包含如下几个组件。
  名称
  作用
  Heartbeat
  负责维护集群中各节点的信息及它们之间的心跳通信。
  Pacemaker
  集群资源管理器,是核心组件,客户端通过 Pacemaker 来配置、管理并监控整个集群。此组件的社区网站为 http://clusterlabs.org/。OpenStack 高可用性部署实例中一般都采用 Pacemaker 和 HAProxy。
  Resource Agent
  为用于控制服务启停、监控服务状态的脚本集合,本地资源管理器(LRM)调用这些脚本来启动、停止、监控各种集群资源。
  Cluster Glue
  包含一套函数库和工具,在集群栈中,除集群消息传输(由 Heartbeat 承担)、集群资源管理(由 Pacemaker 承担)和资源代理(由 Resource Agent 承担)功能外,其他功能都由 Cluster Glue 来完成。它包含的两个主要部分是 LRM 和 Stonith,前者是本地资源管理器,后者的任务是隔离故障机器。
  通过心跳信号(Heartbeat)检测故障,一台好的计算机会不断向其他计算机发送心跳信号,也会接收其他计算机发送过来的心跳信息。当在规定的时间内没有收到对方计算机的心跳信号时,就启动应急预案,进一步确认故障并准备接管那台计算机的任务。
  例如,我们采用两台 LVS 计算机,并分别安装和配置 Linux-HA,一台 LVS 计算机作为工作机,另一台作为备份机,两台 LVS 计算机互相监督对方的运行状态。当工作机故障时,备份机接管负载均衡任务并报警。相反,当备份机出故障时,只报警,提醒技术员维修备份机。
  两台LVS计算机同时出故障是比较糟糕的情况,不过这种情况发生的概率很小,除非机房断电或者遭到雷击。对于一些非常关键的应用,可以增加参与负载均衡的服务器数量来提高可靠性,如民航飞机上采用 5 台服务器。
  4. 静态网站服务器
  我们浏览一家公司的网站时,很可能就是跟那家公司服务器上的 Apache 程序打交道,网页浏览器与 Apache 成了标准的 C/S 模式,浏览器是客户端,而 Apache 是服务端。Apache 首先把主页对应的文件 index.html 发给我们,我们看到主页内容后,点击主页上的某个链接,它又把该链接对应的文件发给我们,过程如图 3 所示。
  图 3 访问静态网页的过程
  配合 PHP 引擎,Apache 也支持 PHP 动态网页。过程为:
  1)当 Apache 收到用户要浏览的 PHP 文件后,把这个 PHP 文件发给 PHP 执行引擎。
  2)PHP 执行引擎执行该 PHP 文件,产生一个临时的静态网页文件并发回给 Apache。
  3)最后 Apache 把这个临时的静态网页文件发给用户。
  采用 Perl、Python 和 Ruby 脚本语言编写的动态网页,其工作过程与 PHP 类似。
  Apache 是最流行的开源网站服务器,在世界排名前 100 万的网站中,有 60.6% 的网站采用 Apache;在排名前 1000 的大型网站中,Apache 占到了 34.5%,而 Ngnix 占到了 34.9%,略胜于 Apache。
  5. 动态应用服务器
  开源的动态应用服务器有 JBoss、Tomcat、Geronimo、JOnAS,关于这些项目更详细的介绍,请参考相应的官方网站。