概述
中间件是为应用提供通用服务和功能的软件,数据管理,应用服务,消息传递,身份验证和API管理通道通常都要通过中间件
中间件可以帮助开发人员更有效地构建应用,他就如同是应用,数据与用户之间的纽带,
对于具有多云和容器化环境的企业而言,中间件可以帮助大规模,经济高效的开发和运行应用
中间件这个术语第一次出现时1968年在德国的一次软件工程大会上,结束后的一份报告种包含的
作用
尽管原生开发存在诸多好处,但他同事也增加了复杂性,从本地系统到公共云,可能会跨多种基础框架来部署应用,而应用架构本身也是多种多样,所以开发人员需要兼顾多种工具,语言和架构,同时还要竭力争取在更短的时间内以更低的成本完成更多工作,压力倍增
为了应对这种复杂环境,企业纷纷选择了中间件来保持高速。经历有效的应用开发,中间件可以有力支持应用在高度分布式平台上平稳,一致地运行,
构建于此,而部署于彼,由于应用下层有中间件,所以跨环境也能稳定运行
种类
从广义上讲,中间件涵盖了从Web服务器,到身份验证系统,再到消息传递工具等一切内容,

  1. 新应用开发

中间件可支持各种用例地现代常用运行时化境,开发人员和架构师可以采用以下基本运行时,框架和编程语言,跨平台灵活地开展工作,此外中间件还可以提供一些常用功能,例如Web服务器,单点登陆(SSO),消息传递和内存中缓存
image.png

  1. 优化现有应用

中间件可帮助开发人员将传统单体式应用转换为云原生应用,从而以更高地性能和更强地可移植性让有价值地工具焕发新生
image.png

  1. 全面集成

中间件集成工具连接了关键地内部外部系统。转换、连接、组合和企业消息传递等集成功能和SSO身份验证想结合,时开发人员可以更轻松地在不同应用之间扩展功能
image.png

  1. 应用编程接口(API)

许多中间件服务都是通过API访问地,API时一组允许应用之前相互通信地工具、定义和协议地集合。正是借助API,才有可能通过公共层连接完全不同地产品和服务
image.png

  1. 数据流

API是在应用之间共享数据地方法之一,另一种方法是异步数据流,这种方法是在中间存储中复制数据集,其中地数据可在多个应用之间共享,Apache Kafka是一款常见地用于实时数据流地开源中间件工具
image.png

  1. 智能业务自动化

中间件可以帮助开发人员,架构师,IT和业务主管将手动决策自动化,自动化可以改善资源管理和整体效率
image.png
经过精心设计,现代业务应用可以在本地或跨云端大规模运行,为了搭建这些应用,开发人员需要一种具备统一基础功能的应用环境,中间件正式打造这种环境的关键,
将功能分为四层,外加相应的工具

  1. 容器层

中间件的这一层将以统一的方式管理应用生命周期的交付,它提供带有CI/CD的DevOps能力、容器管理功能以及服务网格功能,

  1. 运行时层

该层包含了自定义代码的执行环境,中间件可以为高度分布式云环境(比如微服务)、内存中缓存(用于快速访问数据)和消息传递(用于快速数据传输)提供轻量级运行时和框架

  1. 集成层

集成中间件可提供相关服务,以通过消息传递、集成和PAI来连接自定义与购买的应用及SaaS资产,从而形成功能正常的系统,此外,它还可以提供内存数据库和数据缓存,数据/事件流以及API管理功能

  1. 流程自动化和决策管理层

这是开发中间件的最后一层,旨在强化关键智能,实现优化和自动化,以及加强决策管理

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,
完成

  1. <?php
  2. //模拟的控制器
  3. class Controller {
  4. public function index($request) {
  5. echo '控制器方法体',$request,'&lt;br&gt;';
  6. }
  7. }
  8. //中间件
  9. class Before1 {
  10. public function handle($request, Closure $next) {
  11. echo 'before1-前置-'; //业务逻辑,注意前置与后置中间件业务逻辑代码的位置
  12. return $next($request);
  13. }
  14. }
  15. //中间件
  16. class Before2 {
  17. public function handle($request, Closure $next) {
  18. echo 'before2-前置-';
  19. return $next($request);
  20. }
  21. }
  22. //中间件
  23. class After1 {
  24. public function handle($request, Closure $next) {
  25. $response = $next($request);
  26. echo 'after1-后置-'; //业务逻辑,注意前置与后置中间件业务逻辑代码的位置
  27. return $response;
  28. }
  29. }
  30. //中间件
  31. class After2 {
  32. public function handle($request, Closure $next) {
  33. $response = $next($request);
  34. echo 'after2-后置-';
  35. return $response;
  36. }
  37. }
  38. class Middleware {
  39. public static $queue; //中间件队列
  40. public static function init() {
  41. //模拟的中间件,数量任意添加
  42. self::$queue[] = [[After1::class, 'handle'], null];
  43. self::$queue[] = [[After2::class, 'handle'], null];
  44. self::$queue[] = [[Before1::class, 'handle'], null];
  45. self::$queue[] = [[Before2::class, 'handle'], null];
  46. //模拟的控制器
  47. self::$queue[] = [[Controller::class, 'index'], null];
  48. }
  49. //调用中间件
  50. public static function dispatch($request) {
  51. call_user_func(self::resolve(), $request);
  52. }
  53. //返回闭包函数
  54. public static function resolve(){
  55. return function($request){
  56. $middleware = array_shift(self::$queue);
  57. if ($middleware != null) {
  58. list($call, $param) = $middleware;
  59. //函数执行中间件,并且带入后续回调函数,循环执行本闭包函数
  60. call_user_func_array($call, [$request, self::resolve()]); //执行中间件
  61. }
  62. };
  63. }
  64. }
  65. $request = "模拟的request对象";
  66. Middleware::init();
  67. Middleware::dispatch($request);