apisix
自定义插件
apisix有丰富的官方插件,已经很大程度上满足了开发者的需求,大多数功能可以选用官方插件解决,但是仍然很难满足有些业务的个性化需求。因此apisix提供了完整的插件开发规范,开发者可以根据规范实现业务特定的插件。本章将先以一个最简单的插件来讲解如何开发一个apisix插件,通过一个简单插件了解apisix 插件的基本组成。然后讲解开发插件的详细步骤以及插件中各个部分更详细的内容。
开发简单的插件
自定义header。通过该插件可以实现给请求添加自定义header的功能。添加header 的name和value可以在配置中进行定义。
开发自定义插件逻辑代码
local ngx = ngx
local core = require("apisix.core")
local schema = {
type = "object",
properties = {
header_name = { type = "string", default = "test_header" },
header_value = { type = "string" }
},
required = { "header_value" }
}
local _M = {
version = 0.1,
priority = 30,
name = "insert-header",
schema = schema
}
function _M.check_schema(conf, schema_type)
return core.schema.check(schema, conf)
end
function _M.access(conf, ctx)
-- 添加header头
ngx.req.set_header(conf.header_name, conf.header_value)
end
return _M
配置中添加插件
只有添加到配置文件中的插件才可以被apisix使用。在apisix 的conf 目录的config.yaml 中有个plugins字段,将示例插件的插件名"insert-header"添加到该字段下。
装载插件
需要对apisix 进行reload。直接运行 apisix reload 就可以装载插件
dashboard中添加插件
虽然apisix 提供了管理接口可以通过接口的方式给路由添加插件,但使用dashboard 操作会方便很多。
1、重新生成schema.json.
curl 127.0.0.1:9092/v1/schema > /usr/local/apisix/dashboard/conf/schema.json
2、重启dashboard
kill -9 0 !~/grep/ {print $2}' |tr -s '\n' ' ')
nohup manager-api -p /usr/local/apisix/dashboard/ &
插件开发方法
定义插件基本信息
local schema = {
type = "object",
properties = {
header_name = { type = "string", default = "test_header" },
header_value = { type = "string" }
},
required = { "header_value" }
}
local _M = {
version = 0.1,
priority = 30,
name = "insert-header",
schema = schema
}
version
插件的版本号。
name
插件名字。插件名字要求全局唯一,不能喝其它插件重名。示例中名字为insert-header
priority
插件优先级,决定了插件的执行顺序。优先级大的插件会先执行。示例中优先级为30
schema
插件的配置描述和校验信息。该字段指明了插件在使用时需要传递的配置信息。可以定义配置信息的字段类型、默认值、校验规则。类型有string、numner、bollean、array、object五种类型。示例中需要添加的配置为string类型的header_name和header_value,并且header_name有默认值test_header。
插件逻辑的执行阶段
示例中插件是在access阶段执行
插件的逻辑
示例中插件的逻辑只有一行
ngx.req.set_header(conf.header_name, conf.header_value)
metadata_schema
运行阶段
https://blog.csdn.net/weixin_45583158/article/details/121045556
_M.init 1
_M.init_worker
_M.ssl_certificate
_M.set
_M.rewrite 2
_M.access 3
_M.content
_M.balencer
_M.header_filter 4
_M.body_filter 5
_M.log 6
apisix 插件可执行的阶段
插件中可以实现的方法
init
在nginx每个工作进程启动时执行,因为nginx会创建多个工作进程,所以该方法中的逻辑会被执行多次
check_schema
该方法在插件被添加到特定路由时调用,用于检查插件配置参数是否和定义参数匹配。比如参数类型是否正确和必填参数是否缺失等。
destroy
rewrite
rewirte 阶段一般用于执行一些url改写,重定向的工作
access
access在请求访问阶段,即在请求转发到上游服务器之前执行,一般用于处理一些权限校验、访问控制之类的工作
before_proxy
header_filter
header_filter 从上游服务器接收到所有请求头之后执行,典型应用是可以用来增删改输出的请求头
body_filter
body_filter 从上游服务器接收到每个返回块时执行,可以拿到请求返回的内容,并对返回的内容进行改写。但是需要注意的是nginx是采用按块的流式传输,也就是如果一个返回体过大就可能会被拆分为多个块,每个块返回时都会调用该方法。所以单次请求可能会调用多次该方法。想要获取返回的块内容可以从变量ngx.arg[1] 中获取。
log
log 当所有字节都已经发送给客户端后调用,该阶段主要用于记录访问量、统计平均响应时间、日志输出等,特别是可以将日志输出到第三方平台这样的工作放在该阶段。因为log阶段是异步的,不会阻塞请求和返回。
综合来看init、rewrite、access、header_filter、body_filter、log是openresty中也存在的生命周期函数,apisix 只是对openresty生命周期函数进行了封装。check_schema和before_proxy是apisix特有的函数。