在码农的日常工作中, 经常会提到中间件,然而大家对中间件的理解并不一致,导致了一些不必要的分歧和误解。“中间件”一词被用来描述各种各样的软件产品,在不同文献中有着许多不同的中间件定义,包括操作系统(和/或网络)和应用程序之间的软件层,以及两个应用程序之间的“粘合剂”。它也被描述为一种重要的集成工具,或支持与分布式软件的模块化连接。
那么——
中间件已经成为分布式计算的一个不可或缺的部分。如果不涉及中间件,实际上不可能构建大规模的分布式应用程序。相比之下,试图构建一个没有中间件的分布式应用程序就像试图在没有操作系统的个人计算机上编写一个简单的应用程序。随着中间件的发展,它所提供的主要目标、设计、体系结构和特性也在不断演变。温故知新,本文希望能够对中间件有一个系统的理解。
在计算机科学中,系统通常分为两类: 软件和硬件。然而,在这两者之间还有一个额外的层,称为中间件,它是一个软件“管道”,一个操作、一个进程或者一个在操作系统和最终用户之间的应用程序。这个术语是在20世纪80年代初引入的,当时包含了复杂的软件解决方案,通过软件和应用组件等新特性对遗留系统进行现代化改造。最初,它仅用于扩展网络层和应用程序层。随后,扩展到作为操作系统和网络层之上的一层,以及应用层之下的一层。这意味着中间件现在可以促进应用程序组件和分布式网络之间的通信。
CORBA 于1991年问世,为应用集成和数据接口问题提供了一个很好的解决方案,从而产生了第一个具体的中间件定义。从那时起,中间件这个术语就与 CORBA 纠缠在一起,并且在接下来的许多年里,如果有人提到中间件,那么每个人都会自动地认为是 CORBA。然而,随着时间的推移,出现了一些问题和限制,CORBA 无法为所有类型的分布式应用程序提供解决方案。此外,它对应用程序施加了高开销,这使得它不适用于网格、云、无线传感器网络和移动应用程序。因此,术语中间件开始摆脱与 CORBA 的关联,并开始覆盖更广泛的工具和服务,以支持不同的分布式计算/服务需求。
中间件的一个可能定义是“中间件是帮助应用程序与其他应用程序、网络、硬件和/或操作系统进行交互或通信的软件,提供了提高服务质量(QoS)的工具”。该定义可能描述了目前可用的大多数中间件产品。2000年的一次IETF研讨会将中间件定义为“在传输(即通过TCP/IP)层服务集之上,但在应用程序环境之下的那些服务”(即在应用程序级API之下)。在这个更具体的意义上,中间件可以被描述为客户端—服务器中的“—”,包括web服务器、应用服务器、内容管理系统以及支持应用程序开发和交付的类似工具。通过中间件,程序员可以选择实现分布式的解决方案,而不必分析不同的组件在进行交互,很有些外观模式升级版的味道。
中间件是一种软件,它在一个或多个应用程序和其他应用程序之间,或者在一个或多个应用程序和基础设施之间起着“粘合剂、中介、代理、中间人、解释器、抽象提供者、合并者、集成者、促进者或连接器”的作用。
在实际工作中,根据所在领域的不同,人们对中间件使用了不同的定义。例如,软件工程师和 DevOps 工程师都将中间件描述为通过不同的系统组件“粘合”软件的层,网络工程师会说中间件是网络连接的容错和错误检查的集成,换句话说,将中间件定义为通信管理软件。与此同时,数据工程师将中间件视为负责协调、触发、处理和发布来自各种来源的数据的技术。鉴于没有统一的中间件定义,而沟通的前提是概念的统一,所以在谈论中间件的时候最好限定于特定的领域分类。
对于中间件而言,一般可以从两个视角进行分类:架构视角和应用程序的视角。架构视角适合于按照每个体系结构的集成来精确定义中间件,而不是它的应用程序属性。
在系统架构的视角,中间件以特定方式集成到其异构系统环境中,每一类中间件在其他软件之间都有不同的通信协议或操作方式。
面向过程的中间件使用同步通信,特点是使用客户端stub和服务器skeleton。客户端stub将过程的参数转换为消息,并将该消息发送到服务器。服务器skeleton将消息转换回参数,并将过程调用发送到处理它的服务器应用程序。一旦执行了该程序,就会发生相反的过程。客户端stub还会检查错误,将结果发送到调用软件,然后挂起线程。
这一类中间件的优点是使用标准类型的名称服务,远程处理进程,即使出现网络问题也能返回响应,支持异常,并且可以管理多种类型的数据格式和异构的系统级服务。缺点是不可伸缩,因为它不包含复制机制,不具有反射性,并且是一个非常严格的过程,与过程紧密耦合。
面向对象中间件结合了面向对象程序设计/设计原则,支持分布式对象请求,使用线程策略,对象(客户端对象和服务器对象)之间的通信可以是同步、延迟同步和异步的。对象中间件通过将来自多个客户端对象的类似请求分组到一个事务中来支持多个事务。首先,中间件使用客户端对象对远程对象进行逻辑方法调用。本地ORB代理封装数据并将其传输到代理。代理可以联系多个数据源,获取它们的参考ID,收集数据,有时还可以重新组织数据。服务器对象从代理接收消息,远程代理解析数据。数据被提交到一个远程服务对象,在那里执行特定的过程,返回的结果与上述相反。
这一类中间件的优点包括对服务器对象的负载管理和可伸缩性的支持,并解决了面向过程中间件的缺点。它还可以对许多不同的数据类型、形式和状态进行操作,并且是分布式对象的自我管理器。缺点是要在执行前预链接,以及对于一些遗留系统需要封装代码。
面向消息的中间件可以细分为两种类型——消息传递和消息发布/订阅。在消息传递类型中,应用程序使用客户端发送消息(针对一个或多个客户端),服务器以某种预定顺序(FIFO、基于优先级方案或基于负载平衡方法)从队列中拾取请求。中间件服务充当消息的路由器,通常不与消息交互。
发布/订阅类型的工作原理略有不同,这是一个事件驱动的过程。如果客户想要参与,它首先加入一条消息总线。然后,根据其作为发布者、订阅者或两者的功能,它在总线中注册一个事件侦听器。发布者向总线(在中间件服务器上)发送事件通知。然后,中间件服务已注册的订户发送一条通知,说明数据可用。当订阅者向特定的发布者请求一些数据时,该请求被包装在一条消息中并发送到总线。然后,总线向发布者发送一个请求数据的事件。
组件被描述为“执行特定功能的程序,其设计方式便于与其他组件和应用程序一起操作”。这种类型的中间件是一种组件配置。这些组件要么在构建时选择,要么在运行时选择。这种类型的中间件拥有广泛的组件库和组件工厂,支持在多个平台上构建。由于分布式计算环境中的变化(即资源可用性、新要求的协议、网络连接)一直都在增加,因此需要组件或反射型中间件提供不断增加的QoS要求。
该中间件的优势在于可配置性,配置可以在运行时完成,这为满足大量应用程序的需求提供了很大的灵活性。
代理型中间件由几个组件组成:实体(对象、线程)、介质(一个代理和另一个代理之间的通信)和规则(代理通信协调规则)。介质可以是监视器、通信链路或更复杂的类型(例如管道)。规则确定了代理的交互性质,例如同步或命名的类型。代理型中间件能够自主地执行操作以满足其设计目标,涵盖了广泛的策略基础,范围覆盖了算法、负载平衡策略、资源适应性等。
代理型中间件的优点是代理可以代表用户执行任务,并且可以根据周围的环境适应范围广泛的策略。然而,操作的复杂性、理解操作的困难,以及将其纳入系统所需的大量人力,一直是这一类型中间件的主要弱点。
应用程序可以包含适合特定功能的中间件,例如数据访问、基于Web、实时操作等专门用于应用程序的中间件。
数据访问中间件用于应用程序与本地和/或远程数据库(关系数据库和非关系数据库)、数据仓库或其他数据源的交互。这类中间件包括事务处理监视器、数据库网关和分布式事务处理中间件。这种类型的中间件可以帮助满足特殊的数据库需求,如安全性(身份验证、机密性和访问控制)、保护和ACID属性。如果DBMS不可用或无法处理事务,该数据库中间件甚至可以自己执行请求的事务。由于数据可能会保留在多个数据库中,因此中间件(特别是事务处理监视器)会跟踪每个事务的进度,并在请求的一部分失败时请求回滚。中间件通知请求的状态,并传递所有返回的数据。一些中间件甚至修改了返回数据的外观,使数据更易于应用程序或用户使用。
数据访问中间件在多个源和数据库之间的透明通信,将应用程序编程语言转换为目标数据库可接受的语言,以及将响应集转换为请求应用程序可接受的格式,能够直接查询数据库或与DBMS通信。
桌面中间件可以根据用户的要求,通过跟踪和协助应用程序,对数据的表示方式进行更改,管理任何传输服务(例如终端仿真、文件传输、打印服务),并在中断最少的情况下提供备份保护和其他操作后台功能。中间件服务包括图形管理、排序、字符和字符串操作、记录和文件管理、目录服务、数据库信息管理、线程管理、作业调度、事件通知服务、软件安装管理、加密服务和访问控制等等。
基于Web的中间件帮助用户进行浏览,使用界面提前搜索感兴趣的页面,并从浏览历史中识别用户感兴趣的变化。它为大量应用程序提供身份验证服务,并提供独立于底层操作系统、网络协议和硬件平台的进程间通信。与网络紧密相连的中间件被称为应用服务器,它们提高了对性能、可用性、可扩展性、安全性、信息检索以及对协作管理和使用的支持。当服务器和客户端之间获得更好的通信时,中间件可以直接连接到应用程序。基于web的中间件提供的一些核心服务包括目录服务、电子邮件、计费、大规模供应管理、远程数据访问(包括下载、程序访问和浏览)和远程应用程序等。
例如,电子商务中间件涉及了通过网络进行的两个或多个企业(或用户和企业)之间的通信。该中间件控制对客户配置文件信息的访问,允许业务功能(如购买和销售物品)的操作,并协助应用程序之间的财务信息交易。这种中间件可以提供一个模块化平台来构建web应用程序[,对安全性、QoS、经济高效且快速的交易以及不同环境下的透明度的需求至关重要。
面向移动应用的中间件是基于Web中间件的另一个主要分支。它集成了分布式应用程序和服务器,为移动用户提供对电子邮件、日历、联系信息、任务列表等的安全无线访问。
实时型中间件支持时间敏感的请求和调度策略,通过提高用户应用程序效率的服务来实现这一点。实时中间件可分为实时数据库应用、传感器处理和信息传递等。
随着物联网的普及,实时信息处理中间件的数量急剧增加。实时型中间件提供了一个决策过程,确定了解决时间敏感过程的最佳方法,并可以帮助操作系统分配资源,以帮助时间敏感的应用程序满足其实时性需求。
专有用途中间件一般为满足特定需求而创建的,把不便于分类的中间件类型归类于此。
在互联网的广泛使用和高速连接的改造之前,大多数应用程序是作为单体独立的软件解决方案开发的。这个软件为了特定的目的和活动而构建,因此不设计为连接和软件组件的交互。单体软件需要一个复杂的中间件解决方案,以便与不同的模块(如客户机/服务器)共享信息,或者向主机/资源管理软件发出请求。
在互联网彻底改变了运作方式,越来越多的业务由连接到大型分布式计算机网络的多个计算设备所驱动。分布式计算引入了面向服务的体系结构, 由多层软件解决方案组成,这些解决方案实现了实体和服务的分离,从而将每个组件分解为微服务。这是通过降低系统的复杂性和进一步增加其模块性来实现的。在这个场景中,每个实体被视为唯一且自治的。
这时,中间件是一种将单个应用程序开发成的一套小型服务,每个应用程序都在自己的进程中运行,并与轻量级机制(通常是 HTTP 资源 API)通信。中间件与 API紧密相连,使用不同API软件包。这意味着中间件可以简化复杂的应用程序,因此开发人员不仅关注组件的通信,还关注业务逻辑和系统的交互。
另外,在开发应用程序的时候,一般需要考虑的三个必要因素是可伸缩性、维护和自动化。首先横向扩展只是增加资源以扩展主系统的功能,在整个网络上最优地分配作业调度。至于维护,关注点分离原则非常重要,不管是使每个实体可重用(模块化)还是捆绑它的属性(封装)。典型的模块化示例包括 Linux 内核,其中不同的元素可以被多次使用来构建一个系统。此外,重点一般会放在自动化操作上,以减少错误,并使应用程序全天候可用。
中间件可以作为实现可伸缩性、维护和自动化的促进者。这意味着中间件在软件开发过程中提供了灵活性,同时减少了整个软件周期的时间,也为开发人员提供了更容易扩展性。此外,中间件可以通过结合“快速失败,快速成功”的原则来支持快速的原型实现,还可以降低项目成本,普遍促进创业和创新。
综上所述,中间件提供的注意用途如下:
物联网描述了一个由多个智能感应设备融合的实时数据收集的大型互联设备网络。为了实现这一目标,电子设备将数据发送到外部服务,这些服务托管在云端或边缘计算的基础设施中。物联网网络不仅可以与周围环境互动,而且不需要用户的干预就可以自主行动。在这个范围内,普适计算被定义为“源于数字世界的、通过物理世界感知的服务整体”。
此外,开发物联网应用的体系结构原则包括安全性、能源消耗和监控、可靠性、可解释性和通信。根据其软件许可,它可以分为企业维护、开源或设备专用。物联网中间件是基于以下关注点分离来处理其操作的:
一些关于物联网中间件的最有前途的开源项目,包括: 针对云传感器系统的 OpenIoT; 针对设备间通信协议的 FIWARE; 针对数据存储和机器学习的快速部署和高可扩展性的 LinkSmart; 针对通信、控制和管理的自动化层的物联网抽象的 DeviceHive; 针对针对智能应用的工业物联网框架 ThingSpeak等等。类似地,IBM、 AWS 、Azure、谷歌和甲骨文都开发了企业中间件,专注于自动化特定任务或核心业务活动流程。
随着云服务的普及,中间件促进了在单一多用途环境中的分布式部署。尤其是容器的指数级增长,这种情况变得更加明显,软件环境可以通过同一台服务器在一个沙箱环境中快速而方便地部署多次。容器是一个独立的软件环境,具有唯一的代码、库、运行时环境和依赖关系。中间件层也已经从虚拟化转移到了集装箱化,用于优化通信和抽象通信协议以开发软件管道。
云原生是一种利用基础云计算技术的应用程序开发方法,其目标是在内部部署、私有云或公共云环境中提供一致的开发、部署和管理。实际上,云原生应用是从微服务构建的应用程序,部署在使用Kubernetes编排的容器中。微服务是松散耦合的应用程序组件,包含了自己的堆栈,可以彼此独立部署和更新,并使用REST API、消息代理和事件流的组合相互通信。容器将应用程序代码(如微服务)以及在任何传统IT或云基础设施上运行该代码所需的操作系统库和依赖项打包在一起。
中间件可以解决其中一些复杂性,但使用传统中间件运行容器化应用程序会增加其自身的复杂性。出于这个原因,流行的云应用开发平台,已经演变为包含了容器化中间件,即模块化中间件,以便只需将所需功能打包到一个容器中。
从开发者的角度来看,向云计算解决方案的转变意味着代码更少。云基础设施中的大部分工作都是在“引擎下”完成的。以前由本地中间层处理的分布式编程现在可以远程处理,更具体地,需要处理的常见问题包括扩展性、弹性、可观察性、资源管理以及持续的集成和交付。这意味着企业将限制中间件开发人员的数量,更关注架构和应用程序开发,而不是部署。
中间件一词已被用于包含许多不同类型的软件,因此很难确定到底指的是什么。简单地说, 中间件是连接分布式环境中的任何组件集,以提供更好的功能。
实际上,从体系结构、开发到部署,中间件可以在其软件周期中使用。对业务数字化转换的持续需求表明中间件将继续存在。无论是微服务,还是在计算机之间的传输数据,或者创建一个通用网关,都可以依靠中间件来实现不同设备、应用程序和软件层之间的通信。通过微服务架构,通过中间件可以相对轻松地开发一个全局的分布式生态系统。
尽管中间件这一术语本身的使用越来越少,但它仍然存在于移动和传感器网络、面向服务的架构、网格计算、云计算、在线多人游戏、网络机器人、物联网等等。因此,中间件实际上仍然无处不在,并且很可能在很长一段时间内无处不在。
【参考资料】