跳到主要内容

插件

本文档将介绍 APISIX 中插件(Plugins)的基本概念以及为什么需要插件。你将了解一些相关概念,包括插件启用、插件配置文件的优先级、插件执行过滤器和顺序,以及插件开发。

在文档末尾探索其他资源,以获取有关相关主题的更多信息。

概述

APISIX 插件(Plugins)扩展了 APISIX 的功能,以满足组织或用户在流量管理、可观测性、安全性、请求/响应转换、无服务器计算等方面的特定需求。

APISIX 提供了许多现有的插件,可以根据你的需求进行自定义和编排。这些插件可以全局启用以在每个传入请求上触发,或者绑定到其他对象,例如 路由服务消费者消费者组插件配置。参见 插件中心 获取插件清单及其用法。

如果现有的 APISIX 插件不能满足你的需求,你还可以用 Lua 或其他语言(如 Java、Python、Go 和 Wasm)编写自己的插件。

插件安装

默认情况下,大多数 APISIX 插件都已 安装

apisix/cli/config.lua
local _M = {
...
plugins = {
"real-ip",
"ai",
"client-control",
"proxy-control",
"request-id",
"zipkin",
"ext-plugin-pre-req",
"fault-injection",
"mocking",
"serverless-pre-function",
...
},
...
}

如果你想调整插件安装,请将自定义的 plugins 配置添加到 config.yaml。例如:

plugins:
- real-ip
- ai
- client-control
- proxy-control
- request-id
- zipkin
- ext-plugin-pre-req
- fault-injection
# - mocking # 不安装
- serverless-pre-function
... # 其他插件

有关完整的配置参考,请参阅 config.yaml.example

重新加载 APISIX 以使更改生效。

插件执行生命周期

安装的插件首先被初始化。然后根据定义的 JSON Schema 检查插件的配置,以确保插件配置架构正确。

当请求通过 APISIX 时,插件的相应方法将在以下一个或多个阶段执行:rewriteaccessbefore_proxyheader_filterbody_filterlog。这些阶段很大程度上受 OpenResty 指令 的影响。


Routes Diagram

要了解有关自定义插件开发阶段的更多信息,请参阅 插件开发操作指南

插件执行顺序

一般来说,插件按以下顺序执行:

  1. 全局规则 中的插件

    1. rewrite 阶段的插件
    2. access 阶段的插件
  2. 绑定到其他对象的插件

    1. rewrite 阶段的插件
    2. access 阶段的插件

在每个 阶段 内,你可以选择在插件的 _meta.priority 属性中定义一个新的优先级值,该值在执行期间优先于默认插件优先级。具有较高优先级值的插件首先执行。有关示例,请参阅插件 通用配置

插件合并优先级

当同一个插件在全局规则中全局配置,并在对象(例如路由)中局部配置时,两个插件实例都会按顺序执行。

但是,如果同一个插件在多个对象上局部配置,例如在 路由服务消费者消费者组插件配置 上,则只使用一个配置副本,因为每个非全局插件只执行一次。这是因为在执行期间,这些对象中配置的插件按照特定的优先级顺序合并:

Consumer > Consumer Group > Route > Plugin Config > Service

如果同一个插件在不同对象中有不同的配置,则合并期间具有最高优先级的插件配置将被使用。

插件执行过滤器

默认情况下,所有插件都由匹配路由中配置规则的传入请求触发。但是,在某些情况下,你可能希望对插件执行进行更细粒度的控制;即有条件地确定哪些插件被请求触发。

APISIX 允许通过将 _meta.filter 配置应用于插件来动态控制插件执行。该配置支持评估各种 内置变量APISIX 表达式

有关示例,请参阅插件 通用配置

插件开发

APISIX 支持多种语言的插件扩展,包括 Lua、Java、Python、Go 和 Wasm。 插件以三种主要方式运行:

  • Lua 插件在 APISIX 中原生运行。
  • Java、Python 和 Go 插件在其相应的 APISIX 插件运行器中运行,通过 远程过程调用 (RPC) 进行通信。
  • Wasm 插件在 APISIX Wasm 插件运行时中运行。

要了解有关开发插件的更多信息,请参阅 用 Lua 创建插件

其他资源