什么是中间件?

核心要点

  • 中间件通过提供结构化的协议,促进应用程序之间的连接,简化开发流程并实现高效的数据传输。
  • 中间件支持更快速地适应变化,并提供便捷的工作场所工具。
  • 中间件是一种模块化机制,有利于在各种层级的编程中应用,从高级抽象到低级实现。

你可能在不同场合听到过“中间件”这个词,并且好奇它到底指的是什么。你会发现它涵盖了广泛的技术和流程。

中间件的多种含义

“中间件”是一个相当灵活的术语,人们用它来指代不同的事物。从最广泛的意义上讲,你可以将其理解为“运行在其他程序之间的程序”。 换句话说,任何软件只要依赖于独立的、提供输入并处理其输出的代码,都可以被认为是中间件。

一些中间件以成熟应用程序的形式存在,负责将数据从一种状态转换成另一种状态,并为其他代码提供明确的协议和数据格式。 但中间件也可以像一个精细的函数,嵌入到框架运行的一系列其他函数中。

如同许多软件一样,中间件利用了模块化的理念:将复杂的流程分解成更小、更易于管理的部分。

中间件是如何工作的?

中间件的强大之处通常取决于其协议和预定义的行为。 严格的通信协议使得程序员能够编写符合标准并正确运行的软件。

Web应用程序服务器是中间件的一个例子,它连接了用户在网站前端的体验与后端应用程序和数据库提供的逻辑和数据模型。 由于它与通信系统并非紧密耦合,因此在理论上,你可以在不重写应用程序代码或重组数据库的情况下,将应用程序服务器替换为兼容的服务器。

中间件组件通常使用JSON、REST、XML和SOAP等技术。 这些技术成熟、流行,并且基于文本,使得组件的更换或重新排序更加容易。 它们基于文本的格式和广泛的工具集也使得调试更简单、更可靠。

中间件的类型

由于“中间件”是一个非常广泛的术语,因此存在许多不同的示例和应用场景。 一些最常见的包括:

  • 消息代理:为进程间通信提供结构。
  • Web应用程序服务器和Web框架。
  • 游戏引擎:提供可以利用、扩展或替换的默认行为。
  • 事件流平台,如Apache Kafka。

在软件开发中使用中间件

中间件最实际的应用之一是通过Web框架。 大多数框架都提供了一个核心环境,你可以根据自己的需求进行自定义和扩展。 该模式通常涉及按照预定的顺序,通过一系列内置的和自定义的函数传递HTTP请求,并在最后返回HTTP响应。

Express.js框架使用了这种模式来支持自定义。 以下是一个用JavaScript编写的中间件函数的例子:

 app.use('/user/:id', (req, res, next) => {
  console.log('Request Type:', req.method)
  next()
})

这个函数的功能非常简单:

  • 处理以“/user/”开头,后接id的特定URL。
  • 记录请求方法的类型,例如GET、POST等。
  • 调用提供的函数以继续处理中间件函数链。
  • 对`next`的最后一次调用是中间件流程中的关键步骤,它展示了中间件的通用性。 只要每个中间件函数独立运行,你就可以轻松地替换、添加或重新排序它们,从而改变整个链的行为。

    PHP框架Laravel也具有类似的中间件设置。 注意命名空间是如何将此类明确定义为“中间件”的。

     namespace App\Http\Middleware;

    use Closure;
    use Illuminate\Http\Request;
    use Symfony\Component\HttpFoundation\Response;

    class EnsureTokenIsValid
    {
        
         * Handle an incoming request.
         */
        public function handle(Request $request, Closure $next): Response
        {
            if ($request->input('token') !== 'my-secret-token') {
                return redirect('home');
            }

            return $next($request);
        }
    }

    同样,这个特定类的角色非常明确:它所做的只是检查请求是否包含令牌。 在这种情况下,中间件函数可能会中断链,拒绝调用下一个函数,而是发送重定向。 重定向函数将返回一个适当的`Response`对象,这是中间件函数在其签名契约中必须返回的。

    最后一个例子展示了Django(一个基于Python的Web框架)如何处理中间件。 Django使用术语“插件”来描述它的中间件架构,这类似于你可能听到的其他相关术语,如“钩子”或“回调”。 本质上,这只是中间件设置的另一种体现,它在整个结构化流程中提供灵活性。

     def simple_middleware(get_response):
        

        def middleware(request):
            
            

            response = get_response(request)

            
            

            return response

        return middleware

    然后,你可以使用一个简单的数组来控制哪个中间件运行以及它们的运行顺序:

     MIDDLEWARE = [
        "django.middleware.security.SecurityMiddleware",
        "django.contrib.sessions.middleware.SessionMiddleware",
        "django.middleware.common.CommonMiddleware",
        "django.middleware.csrf.CsrfViewMiddleware",
        "django.contrib.auth.middleware.AuthenticationMiddleware",
        "django.contrib.messages.middleware.MessageMiddleware",
        "django.middleware.clickjacking.XFrameOptionsMiddleware",
    ]

    Django提供了像`CommonMiddleware`类这样的默认行为,大多数应用程序都会从中受益;它会阻止访问某些“恶意”用户代理并处理URL规范化。 关键的、注重安全的中间件通常会在管道的早期运行,但这种灵活性允许你根据应用程序的需求自定义顺序。

    为什么中间件有用?

    中间件使得连接原本不兼容的应用程序变得更加容易。 它提供了集成这些应用程序的功能,以及它们可以进行通信的强大的结构化协议。

    因此,中间件具有以下一些重要的优点:

    • 简化应用程序开发并缩短产品上市时间。
    • 实现高效的连接。
    • 支持更快速地适应变化。
    • 提供易于使用的工作场所工具。

    总而言之,中间件是一种模块化的形式,这一概念在应用于从最高层到最低层的所有形式的编程时都具有益处。