前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >apisix 自定义插件方法

apisix 自定义插件方法

作者头像
空盒子里的巧克力糖
发布2023-01-16 09:51:55
3.1K0
发布2023-01-16 09:51:55
举报
文章被收录于专栏:技术狂想

apisix

自定义插件

apisix有丰富的官方插件,已经很大程度上满足了开发者的需求,大多数功能可以选用官方插件解决,但是仍然很难满足有些业务的个性化需求。因此apisix提供了完整的插件开发规范,开发者可以根据规范实现业务特定的插件。本章将先以一个最简单的插件来讲解如何开发一个apisix插件,通过一个简单插件了解apisix 插件的基本组成。然后讲解开发插件的详细步骤以及插件中各个部分更详细的内容。

开发简单的插件

自定义header。通过该插件可以实现给请求添加自定义header的功能。添加header 的name和value可以在配置中进行定义。

开发自定义插件逻辑代码

local ngx = ngx

local core = require("apisix.core")

local schema = {

代码语言:javascript
复制
type = "object",

properties = {

    header_name = { type = "string", default = "test_header" },

    header_value = { type = "string" }

},

required = { "header_value" }

}

local _M = {

代码语言:javascript
复制
version = 0.1,

priority = 30,

name = "insert-header",

schema = schema

}

function _M.check_schema(conf, schema_type)

代码语言:javascript
复制
return core.schema.check(schema, conf)

end

function _M.access(conf, ctx)

代码语言:javascript
复制
-- 添加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

(ps -ef|grep "/usr/local/apisix/dashboard"|gawk '
(ps -ef|grep "/usr/local/apisix/dashboard"|gawk '

0 !~/grep/ {print $2}' |tr -s '\n' ' ')

nohup manager-api -p /usr/local/apisix/dashboard/ &

插件开发方法

定义插件基本信息

local schema = {

代码语言:javascript
复制
type = "object",

properties = {

    header_name = { type = "string", default = "test_header"        },

    header_value = { type = "string" }

},

required = { "header_value" }

}

local _M = {

代码语言:javascript
复制
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

image.png

_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

image.png

apisix 插件可执行的阶段

插件中可以实现的方法

image.png

init

在nginx每个工作进程启动时执行,因为nginx会创建多个工作进程,所以该方法中的逻辑会被执行多次

image.png

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特有的函数。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • apisix
  • 自定义插件
    • 开发简单的插件
      • 运行阶段
        • init
        • check_schema
        • destroy
        • rewrite
        • access
        • before_proxy
        • header_filter
        • body_filter
        • log
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档