中间件的定义

前言

近日,与多人交流中,我发现了一个问题,很多人根本就不懂什么是中间件,哪些是中间件、哪些不是,他们区分不了。

所以,我查阅了很多外文资料,包括Oracle、IBM等大公司关于中间件的一些描述,做了一个总结和对照。


中间件的定义是什么?

目前很难给中间件一个严格的定义,国际上各家机构都有不同的定义。

我根据很多的定义和普遍的理解,综合了一下:

    中间件,通常指“应用中间件”,是一种独立的系统软件或服务程序,能“独立部署和运行”,且处于“应用程序”和“基础设施或运行环境”之间,不直接处理业务逻辑,而是为上层“使用广泛的应用程序”提供“运行时服务”。补充一点:大部分中间件是通过网络与应用程序连接。

注意这句话有很多的限定词,另外“基础设施和运行环境”在后面会定义。

根据这个定义,可以确定和排除很多的东西,比如:

  • 排除Dubbo,Spring,gRPC,因为不是独立部署和运行的软件或服务,应该归类为应用框架/库。

  • 排除Maven和NPM,一是因为它们不能独立运行,二是因为它们不是为应用程序提供运行时服务,应该归类为研发工具。

  • 排除NodeJS和Java,因为它们是应用程序运行的基础环境,而自身不能独立运行,所以应该归类为基础环境。

  • 排除Git、Gitlab、Nexus、Sonar,因为不是为应用程序提供运行时服务,可以归类为研发工具/平台。

  • 排除PostMan、IBM ClearCase、JMeter等,因为不是为应用程序提供运行时服务,可以归类为测试工具/平台。

  • 排除Jenkins,Logstash,因为不是为应用程序提供运行时服务,可以归类为运维工具/平台。

另外,有一些比较难区分:

  • 像Tomcat、Nginx,比较特殊(不是通过网络与应用程序连接),但由于是专门为应用程序提供运行支持,所以也属于特殊中间件,只是更接近于基础设施。

  • 而NodeJS的进程管理工具PM2,虽然也是为应用程序提供运行支持,但是更偏底层(应用无感知和交互),所以归类为基础设施比较好。

  • Cinder/Ceph/NAS块存储软件,主要应用场景,已经抽象成了基础设施(块存储),应用程序没有直接调用Cinder/Ceph的API,而是通过操作系统API间接去访问,所以归类为基础设施比较好。同理,Calico等网络组件,也是基础设施。

  • 但是对象存储或者偏对象存储使用的存储软件,例如FastDFS、SeaweadFS,归类为中间件比较好。

所谓的“软件基础设施和运行环境”,是指操作系统,块存储、网络组件,以及其他直接或间接为应用程序“提供运行条件或底层网络、存储及硬件相关功能”的软件或服务程序。下面举例分析,有一些比较容易混淆:

  • 像Docker、Kubernetes,VMWare等,属于基础设施。

  • JDK、NodeJS等属于基础设施。

  • 上面提到的PM2,以及iptables、LVS等组件,属于基础设施。

  • 像Zabbix、Prometheus,不属于基础设施,因为它们不属于常规意义上为应用程序“提供运行条件或底层网络和存储相关功能”的软件。将其归类为运维工具比较好(但若是将Prometheus当做时序数据库来使用,则可以归为中间件)。

  • 显卡驱动,属于基础设施。

注意,基础设施,包括软件基础设施 和 硬件基础设施。其中,软件基础设施,包括了操作系统、存储管理软件和网络管理软件,包括了管理硬件的驱动及嵌入式软件。


综上,IT公司所有的软件/程序,可归类为:

  • 应用程序/平台(面向客户的)

  • 研发工具/平台(面向开发、运维、测试等使用的工具/平台)

  • 应用中间件

  • 软件基础设施


    可见,中间件,处在基础设施和应用程序的中间。向左偏一点,就是应用程序/平台,向右偏一点,就是基础设施/环境。所以,有些软件是否属于中间件,不容易界定,这很正常。

    总之一句话,不用太纠结,怎么叫,其实都无所谓。


    另外,在划分研发团队和部门时,也不好界定——有的中间件可以当做主力来支撑业务(比如消息推送)甚至嵌入业务逻辑,有的中间件又完全与业务无关、偏技术底层(比如存储、Web服务器)。到底该由哪个团队来负责?

    对于团队划分,我个人的倾向是,把所有“非业务应用程序”都划归到“基础设施研发部”负责(有些公司又叫"架构与基础服务部”、“技术工程部”……等),这个“基础设施”是广义的概念,包括组件/工具/平台、中间件、操作系统、网络/存储软件、驱动软件等,这个部门是业务研发部、运维管理部、测试服务部的支撑部门,研发体系内部的所有工具、平台、中间件等都由这个部门来负责开发和维护,可以看做是架构开发组、测试开发组、运维开发组等的超集。这个部门实行项目制管理,由各领域的虚拟专家团队来指导工作。具体参见《研发组织体系和岗位职级设计》一文。


© 2009-2020 Zollty.com 版权所有。渝ICP备20008982号