开发自定义 Lua 插件
自定义 Lua 插件可以在请求/响应生命周期的不同阶段执行自定义逻辑,从而扩展 API7 网关功能。本指南将带你创建一个简单的 Lua 插件,在 API7 网关中注册该插件,并将其应用到路由。
前置条件
- 具备 Lua 编程语言基础知识。
- 熟悉 OpenResty 和 NGINX 请求生命周期。
- 能够访问 API7 网关实例及其控制台。
- 从控制台获取 Token。
插件结构
Lua 插件是一个导出 table 的模块,其中包含配置 Schema、优先级和阶段处理函数。
标准字段
每个插件都应定义以下字段:
name:插件的唯一名称。version:插件版本。priority:决定同一阶段内插件的执行顺序,优先级越高越先执行。schema:定义插件配置参数的 JSON Schema。
执行阶段
API7 网关先完成路由匹配,然后执行该路由上配置的插件。路由匹配和插件的 rewrite 阶段都发生在 NGINX 的 access 处理过程中。即使请求未匹配任何路由,全局规则仍可能执行,随后网关返回 404。
之后,API7 网关按以下顺序执行插件阶段:
rewrite:路由匹配后的第一个插件阶段。可以修改发往上游的请求,例如 URI 或请求头,但不会使 APISIX 重新匹配路由。access:主要处理阶段,例如身份认证和限流。before_proxy:在 access 阶段之后、请 求代理到上游之前执行。header_filter:修改响应头。body_filter:修改响应体。log:响应发送给客户端后记录日志。
分步开发
1. 创建插件文件
为插件新建 Lua 文件。本示例使用名为 custom-header 的插件。
2. 定义 Schema 和优先级
使用 apisix.core 根据 JSON Schema 校验插件配置。
local core = require("apisix.core")
local schema = {
type = "object",
properties = {
header_name = {
type = "string",
default = "X-Custom-Lua"
},
header_value = {
type = "string",
default = "loaded"
}
}
}
local plugin_name = "custom-header"
local _M = {
version = 0.1,
priority = 1500,
name = plugin_name,
schema = schema,
}
function _M.check_schema(conf)
return core.schema.check(schema, conf)
end
3. 实现阶段处理函数
在适当阶段实现逻辑。若要在请求到达上游前添加请求头,请使用 access 阶段。
function _M.access(conf, ctx)
core.request.set_header(ctx, conf.header_name, conf.header_value)
end
4. 完整插件示例
以下是 custom-header 插件的完整代码:
local core = require("apisix.core")
local schema = {
type = "object",
properties = {
header_name = {
type = "string",
default = "X-Custom-Lua"
},
header_value = {
type = "string",
default = "loaded"
}
}
}
local plugin_name = "custom-header"
local _M = {
version = 0.1,
priority = 1500,
name = plugin_name,
schema = schema,
}
function _M.check_schema(conf)
return core.schema.check(schema, conf)
end
function _M.access(conf, ctx)
core.request.set_header(ctx, conf.header_name, conf.header_value)
end
return _M
在 API7 网关中注册插件
在 API7 网关中,自定义插件由控制面管理。通过控制台上传单个 Lua 文件或 ZIP 软件包,即可让该插件供对应网关组中的路由、服务、消费者和全局规则使用。
1. 在控制台中添加插件
自定义插件属于上传到的那个网关组。在控制台中打开需要运行该插件的网关组,进入 Custom Plugins,然后点击 Add Custom Plugin。
对于单文件示例,请上传 Lua 源文件并提供所需插件元数据:
- Plugin Source Code File:上传
custom-header.lua。 - Plugin Description:简要说明插件功能。
- Plugin Documentation Link:可选,填写插件文档链接。
- Plugin Author:标明插件所有者。
文件上传成功后,API7 网关会解析插件,并在添加前于对话框显示检测到的 name 和 version。
添加插件后,可以在该网关组的路由和服务 新增插件 对话框中选择它。若要在其他网关组中运行,请同样上传到该组,详见跨网关组发布。
有关产品操作流程,请参阅自定义插件。
3.10.6 之前,自定义插件在 Gateway Settings 中按控制面统一管理,由 Deployed Gateway Group 字段决定分发到哪些网关组。升级前已存在的插件会被迁移到它当时部署的每一个网关组中。
2. 确认插件可用
在该网关组中打开路由或服务,确认 新增插件 对话框中出现 custom-header