概述
中间件是为应用提供通用服务和功能的软件,数据管理,应用服务,消息传递,身份验证和API管理通道通常都要通过中间件
中间件可以帮助开发人员更有效地构建应用,他就如同是应用,数据与用户之间的纽带,
对于具有多云和容器化环境的企业而言,中间件可以帮助大规模,经济高效的开发和运行应用
中间件这个术语第一次出现时1968年在德国的一次软件工程大会上,结束后的一份报告种包含的
作用
尽管原生开发存在诸多好处,但他同事也增加了复杂性,从本地系统到公共云,可能会跨多种基础框架来部署应用,而应用架构本身也是多种多样,所以开发人员需要兼顾多种工具,语言和架构,同时还要竭力争取在更短的时间内以更低的成本完成更多工作,压力倍增
为了应对这种复杂环境,企业纷纷选择了中间件来保持高速。经历有效的应用开发,中间件可以有力支持应用在高度分布式平台上平稳,一致地运行,
构建于此,而部署于彼,由于应用下层有中间件,所以跨环境也能稳定运行
种类
从广义上讲,中间件涵盖了从Web服务器,到身份验证系统,再到消息传递工具等一切内容,
- 新应用开发
中间件可支持各种用例地现代常用运行时化境,开发人员和架构师可以采用以下基本运行时,框架和编程语言,跨平台灵活地开展工作,此外中间件还可以提供一些常用功能,例如Web服务器,单点登陆(SSO),消息传递和内存中缓存
- 优化现有应用
中间件可帮助开发人员将传统单体式应用转换为云原生应用,从而以更高地性能和更强地可移植性让有价值地工具焕发新生
- 全面集成
中间件集成工具连接了关键地内部外部系统。转换、连接、组合和企业消息传递等集成功能和SSO身份验证想结合,时开发人员可以更轻松地在不同应用之间扩展功能
- 应用编程接口(API)
许多中间件服务都是通过API访问地,API时一组允许应用之前相互通信地工具、定义和协议地集合。正是借助API,才有可能通过公共层连接完全不同地产品和服务
- 数据流
API是在应用之间共享数据地方法之一,另一种方法是异步数据流,这种方法是在中间存储中复制数据集,其中地数据可在多个应用之间共享,Apache Kafka是一款常见地用于实时数据流地开源中间件工具
- 智能业务自动化
中间件可以帮助开发人员,架构师,IT和业务主管将手动决策自动化,自动化可以改善资源管理和整体效率
经过精心设计,现代业务应用可以在本地或跨云端大规模运行,为了搭建这些应用,开发人员需要一种具备统一基础功能的应用环境,中间件正式打造这种环境的关键,
将功能分为四层,外加相应的工具
- 容器层
中间件的这一层将以统一的方式管理应用生命周期的交付,它提供带有CI/CD的DevOps能力、容器管理功能以及服务网格功能,
- 运行时层
该层包含了自定义代码的执行环境,中间件可以为高度分布式云环境(比如微服务)、内存中缓存(用于快速访问数据)和消息传递(用于快速数据传输)提供轻量级运行时和框架
- 集成层
集成中间件可提供相关服务,以通过消息传递、集成和PAI来连接自定义与购买的应用及SaaS资产,从而形成功能正常的系统,此外,它还可以提供内存数据库和数据缓存,数据/事件流以及API管理功能
- 流程自动化和决策管理层
这是开发中间件的最后一层,旨在强化关键智能,实现优化和自动化,以及加强决策管理
TP中间件原理
TP中间件:https://www.jianshu.com/p/531e1e0a4253
就是定义好几个中间件,利用责任链模式,串联起来,挨个执行,从而达到过滤,控制的效果
1 2 3 4 4个中间件 是控制器
首先是执行1 传入后续中间件以及控制器 1 —> 2 3 4
进入到2中间件执行, 传入后续中间件以及控制器 2 —> 3 4
进入到3中间件执行,发现是后置的,不处理 传入后续中间件以及控制器 3 —> 34
进入到4中间件执行,发现是后置的,不处理 传入后续中间件以及控制器 4 —> *
最终执行控制器,然后执行中间件4 跟中间件3,
完成
<?php
//模拟的控制器
class Controller {
public function index($request) {
echo '控制器方法体',$request,'<br>';
}
}
//中间件
class Before1 {
public function handle($request, Closure $next) {
echo 'before1-前置-'; //业务逻辑,注意前置与后置中间件业务逻辑代码的位置
return $next($request);
}
}
//中间件
class Before2 {
public function handle($request, Closure $next) {
echo 'before2-前置-';
return $next($request);
}
}
//中间件
class After1 {
public function handle($request, Closure $next) {
$response = $next($request);
echo 'after1-后置-'; //业务逻辑,注意前置与后置中间件业务逻辑代码的位置
return $response;
}
}
//中间件
class After2 {
public function handle($request, Closure $next) {
$response = $next($request);
echo 'after2-后置-';
return $response;
}
}
class Middleware {
public static $queue; //中间件队列
public static function init() {
//模拟的中间件,数量任意添加
self::$queue[] = [[After1::class, 'handle'], null];
self::$queue[] = [[After2::class, 'handle'], null];
self::$queue[] = [[Before1::class, 'handle'], null];
self::$queue[] = [[Before2::class, 'handle'], null];
//模拟的控制器
self::$queue[] = [[Controller::class, 'index'], null];
}
//调用中间件
public static function dispatch($request) {
call_user_func(self::resolve(), $request);
}
//返回闭包函数
public static function resolve(){
return function($request){
$middleware = array_shift(self::$queue);
if ($middleware != null) {
list($call, $param) = $middleware;
//函数执行中间件,并且带入后续回调函数,循环执行本闭包函数
call_user_func_array($call, [$request, self::resolve()]); //执行中间件
}
};
}
}
$request = "模拟的request对象";
Middleware::init();
Middleware::dispatch($request);