Kong插件开发文档地址:https://docs.konghq.com/0.14.x/plugin-development/
Kong 的插件使用了一个叫 Classic 的 class 机制。所有的插件都是从 base_plugin.lua 基类上继承而来。base_plugin.lua 定义了插件在各个阶段被执行的方法名:
根据方法名也可以看出,这 7 个方法对应于 OpenResty 的不同执行阶段。也就是说插件只能对外暴露出这 7 个方法名中的一个或多个才能被 Kong 的插件机制执行,接下来 Kong 会在 OpenResty 不同的执行阶段,执行插件对应的方法。
1. 插件的结构
其中 handler.lua 和 schema.lua 是必需的,上面提到的插件需要暴露出来的方法就定义在 handler.lua 中。
2. 逻辑实现
这里以 Kong 自带的 request-termination 插件为例,分析其实现原理。其 handler.lua 的头部是这样定义的:
接下来就是定义插件的公有方法:
3. 参数定义
插件的参数定义在 schema.lua 中,类似于 JSON Schema,主要用于描述插件参数的数据格式:
上面只是一个简单的应用,其实 Kong 还可以实现更为复杂的参数校验,具体可以参考这里:Plugin Development - Store Configuration
经过了前面对 Kong 插件机制的分析,这里来整理一下非官方 FAQ 以加深理解,以下 FAQ 针对于 Kong 0.12.3 版本。
1. 插件怎么用?
插件可以应用在 API 上;也可以应用在 Consumer 上;同样还能应用在指定 API 的指定 Consumer 上;当然也少不了 GLOBAL 用法。总之,Kong 插件可以有四种启用方式:
2. 一个 API 或者是 Consumer 可以添加同一个插件多次吗?
不可以。但是插件不同应用方式是可以添加相同的插件的,比如:API 可以添加 rate-limit 插件;Consumer 同样可以添加 rate-limit,只不过最后只有一个会生效。
3. 插件的执行顺序?
插件的执行顺序由插件自身的优先级唯一确定。即,Kong 一旦启动,其插件的执行顺序就已经确定,和启用插件的方式无关,并不会在运行中动态改变。Kong 默认自带插件的优先级如下(越大越优先):
4. 插件生效的优先级?
根据插件怎么用?,这里提到的四种应用方式,如果插件使用冲突的话。其生效策略优先级是:
api & consumer > consumer > api > global
5. 插件的执行阶段?
插件的执行阶段贯穿于请求生命周期中的不同阶段,不过目前大多数的插件均运行在 access 以及之后的阶段。