Serverless 函数还是自定义插件
API7 网关提供两种在请求生命周期中运行自有 Lua 逻辑的方式:内置的 serverless-function 插件 和 自定义 Lua 插件。两者都会执行你编写的 Lua,并具有相同的网关运行时访问权限;区别在于代码的打包、配置、治理和复用方式。
经验法则是:小型、一次性代码片段使用 Serverless 函数;任何需要复用或较复杂的逻辑使用开发自定义 Lua 插件。
Serverless 函数
serverless-pre-function 和 serverless-post-function 插件运行直接粘贴到路由、服务、消费者或全局规则中的内联 Lua。无需上传或注册,代码就是资源配置中的一个字段。完整配置请参阅 Serverless Functions 插件参考。
每个实例在单个 phase 中运行一个 functions 列表。每个函数都是返回函数的 Lua 字符串。返回的函数接收插件配置和请求上下文,因此完整签名是 function(conf, ctx),也可以忽略它们而不接收参数:
{
"plugins": {
"serverless-pre-function": {
"phase": "access",
"functions": [
"return function(conf, ctx) local core = require('apisix.core'); core.request.set_header(ctx, 'X-Trace-ID', 'demo') end"
]
}
}
}
phase——运行逻辑的唯一阶段:rewrite、access、header_filter、body_filter、log或before_proxy,默认为access。functions——Lua 源代码字符串数组,每个字符串返回一个function(conf, ctx)。它们按顺序运行;如果某个函数返回状态码或响应体,请求会提前结束。
serverless-pre-function 较早运行(优先级 10000),serverless-post-function 较晚运行(优先级 -2000),因此它们通常用于在某个阶段的最开始或最末尾注入逻辑。
自定义插件
开发自定义 Lua 插件是通过控制台一次性上传的 Lua 模块。控制面解析其 name、version 和 schema,将其分发到选定的网关组,随后它会像内置插件一样出现在插件选择器中。你可以通过类型化字段为每个路由或服务配置插件,而不是粘贴代码。
local core = require("apisix.core")
local schema = {
type = "object",
properties = {
header_name = { type = "string", default = "X-Trace-ID" },
header_value = { type = "string" },
},
required = { "header_value" },
}
local _M = {
version = 0.1,
priority = 1500,
name = "custom-header",
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