什么是中间件?
中间件(英语:Middleware),是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通,特别是应用软件对于系统软件的集中的逻辑,在现代信息技术应用框架如Web服务、面向服务的体系结构等中应用比较广泛。如数据库、Apache的Tomcat,IBM公司的WebSphere,BEA公司的WebLogic应用服务器,东方通公司的Tong系列中间件,以及Kingdee公司的等都属于中间件。
好吧,作为一个前端渣渣,看不懂。再看看百度百科吧,下面是一些相关中间件:
- 企业服务总线(ESB : Enterprise Service Bus):ESB 是一种开放的、基于标准的分布式同步或异步信息传递中间件。通过 XML、Web Service接口以及标准化基于规则的路由选择文档等支持,ESB 为企业应用程序提供安全互用性。
- 事务处理(TP:Transaction Processing)监控器:为发生在对象间的事务处理提供监控功能,以确保操作成功实现。
- 分布式计算环境(DCE:Distributed Computing Environment):指创建运行在不同平台上的分布式应用程序所需的一组技术服务。
- 远程过程调用(RPC:Remote Procedure Call):指客户机向服务器发送关于运行某程序的请求时所需的标准。
- 对象请求代理(ORB:Object Request Broker):为用户提供与其他分布式网络环境中对象通信的接口。
- 数据库访问中间件(Database Access Middleware):支持用户访问各种操作系统或应用程序中的数据库。SQL 是该类中间件的其中一种。
- 信息传递(Message Passing):电子邮件系统是该类中间件的其中一种。
- 基于XML的中间件(XML-Based Middleware):XML 允许开发人员为实现在Internet中交换结构化信息而创建文档。
OK,到这里,还是一脸懵逼。。。别灰心,因为术业有专攻,中间件是一个比较宽泛的概念,我们缩小一下范围,了解一下web相关的中间件,简单点:
- 将具体业务和底层逻辑解耦的组件。
- 数据从底层到应用端的中转站。
Node中间件
说了这么多,好像并没有什么实质性的内容,都是一些抽象的概念,来点实际的,了解一下Node中间件。 近几年来,在企业开发中越来越推崇微服务架构,而它在不经意间却导致前端同学和后端同学之间关于 API 接口颗粒度的争吵,越来越多见:
- 「你自己请求 2 个接口再组装不就行了?」 - 后端同学追求服务下沉和解耦。
- 「少一次 HTTP 啊,加一个接口有那么难么?」 - 前端同学离用户最近,需要考虑用户体验灵活性。
归结为一个问题:『服务端设计的接口究竟是面向 UI 还是只是通用服务?』
BFF 的提出
2015 年,Sam Newman 对此提出了 Pattern: Backends For Frontends,简称 BFF,国内也俗称为粘合层。
可以看出,这一层一直都存在,只不过是由后端同学维护而已。 但我们知道,前端贴近用户侧,需求的变化太快了,后端同学来维护会很累。 在 BFF 理念中,最重要的一点是:服务自治,谁使用谁开发,即它应该由前端同学去维护。
- 服务自治减少了沟通成本,带来了灵活和高效。
- 自己吃自己的狗粮。
- BFF 并不限制具体技术,团队根据自己的技术栈来选型: Java/Node/PHP/Python/Ruby...
- 基于 GraphQL 技术的通用中间层网关,也是刚刚出现一种很不错的方案。
- 在大部分前端团队中,都会倾向于选择生态更优,语法更熟悉的 Node.js 。
为什么是Node?
无它,就是需要这样的一个中间层,但后端同学不太想管了(也管不过来),所以大部分前端同学选择了一个更顺手的 Node.js ,仅此而已。
那么,上Node?
不,你需要根据你的业务场景,还有团队的技术架构,来具体情况具体分析。切记, BFF 不限制具体技术选型。 BFF 不可避免的会带来:研发成本一定程度上的增加,对开发者的能力要求增加。
Express中间件
Express和Koa是目前最主流的基于node的web开发框架,他们的开发者是同一班人马。貌似现在Koa更加流行,但是仍然有大量的项目在使用Express,所以这里我们说说Express中间件的原理。以下所说中间件皆为Express中间件。
中间件的功能和分类
中间件的本质就是一个函数,在收到请求和返回相应的过程中做一些我们想做的事情。Express文档中对它的作用是这么描述的:
执行任何代码。 修改请求和响应对象。 终结请求-响应循环。 调用堆栈中的下一个中间件。
Express文档中把他们分为了五类,但是他们的原理相同,只是用法不同:
应用级中间件 路由级中间件 错误处理中间件 内置中间件 第三方中间件
用法
非常简单。
var express = require('express')
var app = express();
app.use('/user', function (req, res, next) {
//TODO
next();
});
app.listen(8080)
总结: 面向前端的Node中间件并不能提高我们的应用性能,而是规范我们的开发流程,提高我们的工作效率,遇到问题能够更快的解决,至于是否使用,就要因地制宜了。