插件
本文档将介绍 APISIX 中插件(Plugins)的基本概念以及为什么需要插件。你将了解一些相关概念,包括插件启用、插件配置文件的优先级、插件执行过滤器和顺序,以及插件开发。
在文档末尾探索其他资源,以获取有关相关主题的更多信息。
概述
APISIX 插件(Plugins)扩展了 APISIX 的功能,以满足组织或用户在流量管理、可观测性、安全性、请求/响应转换、无服务器计算等方面的特定需求。
APISIX 提供了许多现有的插件,可以根据你的需求进行自定义和编排。这些插件可以全局启用以在每个传入请求上触发,或者绑定到其他对象,例如 路由、服务、消费者、消费者组 或 插件配置。参见 插件 中心 获取插件清单及其用法。
如果现有的 APISIX 插件不能满足你的需求,你还可以用 Lua 或其他语言(如 Java、Python、Go 和 Wasm)编写自己的插件。
插件安装
默认情况下,大多数 APISIX 插件都已 安装:
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 时,插件的相应方法将在以下一个或多个 阶段执行:rewrite、access、before_proxy、header_filter、body_filter 和 log。这些阶段很大程度上受 OpenResty 指令 的影响。

要了解有关自定义插件开发阶段的更多信息,请参阅 插件开发操作指南。
插件执行顺序
一般来说,插件按以下顺序执行:
-
全局规则 中的插件
- rewrite 阶段的插件
- access 阶段的插件
-
绑定到其他对象的插件
- rewrite 阶段的插件
- 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 创建插件。
其他资源
- 快速入门 - 配置限流限速
- 参考 - 插件通用配置
- 插件中心
- 用 Lua 创建插件