中间件

是什么

定义

根据zend-framework中的定义:

所谓中间件是指提供在请求和响应之间的,能够截获请求,并在其基础上进行逻辑处理,与此同时能够完成请求的响应或传递到下一个中间件的代码。

在两个服务之间的模块,都可以称为中间件。

中间件应该一种架构方法,不局限于特定的语言。
例如提供不同应用之间消息通讯的消息中间件。淘宝下面很多产品之间都需要信息共享,通过一个中间人来专门传递消息。这样做很容易扩展,对上层应用提供统一消息操作接口就行了。
单个程序内部也可以有中间件,一个程序内部实现对中间件接口对支持。
把底层的接口包装一层,然后向上层提供接口。这样底层改变的话,上层也就是你写的代码不用动,只改中间件即可。由于只有中间件一个地方调用底层,改起来会比较方便。

有哪些

非底层操作系统软件、非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件,统称中间件。常见的有如下几种:服务中间件、集成中间件、数据中间件、消息中间件、安全中间件。

用Java实现的中间件,统称Java中间件。中间件,可以理解为类库,介于类库和产品之间。中间件真的是java世界的产物,我等phper能找的资料太少了。

说简单一点,就是你的程序A和程序B互相通信使用的协议,程序A,B可以由不同语言不同平台构建。但是协议可以保证他们能互相认识互发的东西。

简单说,中间件有个很大的特点,是脱离于具体设计目标,而具备提供普遍独立功能需求的模块。这使得中间件一定是可替换的。如果一个系统设计中,中间件是不可替换的,不是架构、框架设计有问题,那么就是这个中间件,在别处可能是个中间件,在这个系统内是引擎。

消息中间件

消息中间件就是一个临时存储器。主要解决应用耦合,异步消息,流量削锋等问题,是大型分布式系统不可缺少的中间件。

1.用于海量数据洪峰的临时存储,比如抢购秒杀,后端程序一下子处理不了这么多抢购请求,那就由消息中间件来存储抢购请求,后端程序再慢慢取出消息处理呗
2.用于多个系统之间的消息传递

目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。

数据库中间件

使用场景的比较多,比如:

1、读写分离
2、数据库从库的负载均衡
3、分布式事务
4、支持多种数据库(Mysql、PG、Oracle等)

框架中的中间件

CI框架和tp框架中的hook(钩子),就是中间件的一种。
laravel中可以使用php artisan 命令创建中间件,比如请求过滤器就是最常见的中间件使用方法一种。Laravel支持全局的中间件和根据具体路由规定的中间件两种,同时优先级又以定义顺序为准。
ZendFramework是由zend公司推出的php框架,其目标就是建立一套大而全的php框架。以满足企业应用开发的目标。其中”zend-stratigility” 负责提供中间件以及中间件执行流的功能。

附录

一片比较巧妙设计中间件的文章
https://blog.csdn.net/qq_20329253/article/details/52202811
一片用闭包实现中间件的文章
http://blog.csdn.net/allen_tsang/article/details/51777911