前言
近日,与多人交流中,我发现了一个问题,很多人根本就不懂什么是中间件,哪些是中间件、哪些不是,他们区分不了。
所以,我查阅了很多外文资料,包括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服务器)。到底该由哪个团队来负责?
对于团队划分,我个人的倾向是,把所有“非业务应用程序”都划归到“基础设施研发部”负责(有些公司又叫"架构与基础服务部”、“技术工程部”……等),这个“基础设施”是广义的概念,包括组件/工具/平台、中间件、操作系统、网络/存储软件、驱动软件等,这个部门是业务研发部、运维管理部、测试服务部的支撑部门,研发体系内部的所有工具、平台、中间件等都由这个部门来负责开发和维护,可以看做是架构开发组、测试开发组、运维开发组等的超集。这个部门实行项目制管理,由各领域的虚拟专家团队来指导工作。具体参见《研发组织体系和岗位职级设计》一文。