发布于 

中间件的定义及其分类

中间件是一类介于底层操作系统与上层应用软件中间的软件,对下管理操作系统的计算和网络资源,对上为应用软件提供开发与运行时环境;同时提供标准能力用于支持应用程序之间的交互与协同;从而让应用软件专注于解决业务问题。

中间件的定义

顾名思义,中间件 (Middleware) 是一个从位置来命名的概念,字面意思理解就是处在中间的软件,实际上,中间件也正是因此而得名。

核心特征

广义上来说,处于操作系统和应用软件之间的软件,都可以称为中间件。从广义的定义上来看,数据库也属于一种中间件,但一般来说,同操作系统一样,我们倾向于认为数据库也是一类基础软件。于是前面的定义可以扩展为:处于操作系统和应用软件、数据库和应用软件之间的软件。现在业界公认的第一个中间件也是在这个定义的场景下工作的,帮助应用软件解决网络通信、屏蔽并发控制和事务管理等实现细节。

在分布式架构大行其道的今天,中间件充当了不同技术、工具和数据库之间的沟通媒介,目的是降低分布式系统的复杂度。写代码的同学都知道,在代码层面为了减少重复代码,高频共性问题的解决方案(例如:字符串处理、规则校验等),通常会被抽取成工具类。同样的,在分布式系统架构层面,一些共性问题(例如:并发控制、负载均衡、消息共享、事务处理等)的解决方案也可以被抽取成可以单独部署的中间件,由中间件提供标准的能力接口,从而降低解决这些共性问题时的难度和工作量。

各种定义

虽然上面我们浅显的解释了中间件的核心特征,但时至今日,对于中间件仍然没有一个统一的概念。从不同的场景不同的角度,有不同的含义:

  • IDC

    中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。

  • Amazon aws

    中间件是指不同应用程序用于相互通信的软件。它提供智能、高效连接应用程序的功能,从而使您能够更快速地创新。中间件相当于不同技术、工具和数据库之间的桥梁,因此,您可以将它们无缝集成到单个系统中。单个系统随后向其用户提供统一服务。例如,Windows 前端应用程序通过 Linux 后端服务器发送和接收数据,但应用程序用户并不知道这一差别。

  • IBM

    中间件是一种软件,支持在分布式网络中的两个或多个应用或应用组件之间建立一种或多种通信或连接。中间件允许更轻松对连接那些根据设计不能相互连接的应用,并允许通过智能方式来连接它们,从而简化应用开发流程并加快上市速度。

  • Microsoft Azure

    中间件是介于操作系统和在其上运行的应用程序之间的软件。中间件实质上充当隐藏转换层,实现了分布式应用程序的通信和数据管理。它有时被称为管道,因为它将两个应用程序连接在一起,使数据和数据库可在 “管道” 间轻松传递。通过中间件,用户可执行很多请求,例如在 Web 浏览器上提交表单,或者允许 Web 服务器基于用户的配置文件返回动态网页。

总结一下

“中间件是指网络环境下处于操作系统、数据库等系统软件和应用软件之间的一种起连接作用的分布式软件,主要解决异构网络环境下分布式应用软件的互连与互操作问题,提供标准接口、协议,屏蔽实现细节,提高应用系统易移植性”。

  • 这个定义限定了只有用于分布式系统中的此类软件才能被称为中间件,同时此定义还可以把中间件与支撑软件和实用软件区分开来。
  • 中间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。形象地说就是 “上下” 之间的 “中间”。
  • 中间件主要为网络分布式计算环境提供通信服务、交换服务、语义互操作服务等系统之间的协同集成服务,解决系统之间的互连互通问题。形象地说就是所谓 “左右” 之间的 “中间”。

中间件的发展历程

私以为,中间件的发展离不开这个真理:

在计算机科学领域,任何问题都可以通过增加一个中间层来解决

早期阶段

在中间件诞生之前,前台应用和数据库之间往往是直连的,前台应用的数据请求会直接请求到数据库上,这对于现在的开发同学来说,可能是难以理解的,因为这会带来诸如:数据库链接管理、事务管理、网络安全性等等许多问题。

graph LR
  A(Application) -->|Connect| B[(fa:fa-database Database)]

既然前台应用和数据库直连会带来诸多问题,那就引入一个中间层。

graph LR
  A(Application) -->|Request| B(Middleware)
  B -->|Connect| C[(fa:fa-database Data Services)]

目前大家公认的第一个中间件,是上世纪九十年代开始流行的 Tuxedo。它的作用是屏蔽分布式环境中各种通信协议、硬件体系结构、操作系统、数据库和其它应用服务等方面的差异,使分布于网络节点上的应用程序的各个单元部件之间能够进行互操作,并协调操作的一致性和完整性,最大限度地节省系统资源,提高系统性能。笔者在前东家工作期间,就经常听同事提起 Tuxedo 系统,早年间在银行、电信等行业从事 C 语言和 COBOL 语言编程的同学应该也都有接触过。同一时期,IBM 的中间件 MQSeries 及其他许多中间件产品也逐渐发展并成熟起来。

graph LR
  A(Client) -->|Request| B(Tuxedo)
  B -->|Connect| C[(fa:fa-database Data Services)]

发展阶段

这一阶段,中间件是伴随着分布式系统以及云原生技术的推广而逐渐发展起来的。随着人类社会的发展,各类业务系统处理的流量和数据呈现除指数倍的增长。面对这种大数据量的处理任务,人们很自然的会对问题进行分治处理也就是系统的分布式化演进。系统拆开了之后,随之而来的是系统间的通信、互操作、协同、事务、安全等共性问题。本着避免重复劳动、最大化实现能力复用的原则,为了提升开发效率、降低运维成本,一些用于解决这些共性问题的优秀方案一定会被抽离出来,慢慢的就形成了现在我们常看到的各种典型的中间件。例如常见的 Kafka、各类 MQ 等消息中间件是为了平滑大流量环境下系统的请求处理压力;MyCat、Sharding-JDBC、TDDL 等数据库中间件可以实现数据库的分片分表、读写分离,以提升应用软件的数据访问效率。

中间件的分类

中间件的发展方向