apisix 自定义插件方法

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 (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 = {

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容