Kong开源了大量的开源插件,当这些开源插件不能满足我们的需求,就需要修改这些开源插件或者自定义插件。Kong提供了方便地自定义插件机制,用户可以开发自己的定制插件。自定义插件可以和Kong进行深层次的集成,如使用数据库表结构,或者扩展Admin API。如果插件实现了所有可选模块,则其目录结构如下所示:
complete-plugin
├── api.lua
├── daos.lua
├── handler.lua
├── migrations
│ ├── init.lua
│ └── 000_base_complete_plugin.lua
└── schema.lua
插件的每个模块对应不同的功能,其中handler.lua和schema.lua是两个必须模块。
Module Name | Required | Description |
---|---|---|
api.lua | No | 插件需要向Admin API暴露接口时使用。 |
daos.lua | No | 数据层相关,当插件需要访问数据库是配置。 |
handler.lua | Yes | 插件的主要逻辑,Kong在不同阶段执行其对应的handler。 |
migrations/*.lua | No | 插件依赖的数据库表结构,启用了daos.lua时需要定义。 |
schema.lua | Yes | 插件的配置参数定义,主要用于Kong参数验证。 |
可以参考官方开源插件Key Authentication的目录结构。
下面演示如何在Kong加载自定义插件。先准备自定义插件的Lua代码。
mkdir myheader
cd myheader
vi handler.lua
local MyHeader = {}
MyHeader.PRIORITY = 1000
function MyHeader:header_filter(conf)
-- do custom logic here
kong.response.set_header("myheader", conf.header_value)
end
return MyHeader
vi schema.lua
return {
name = "myheader",
fields = {
{ config = {
type = "record",
fields = {
{ header_value = { type = "string", default = "twingao", }, },
},
}, },
}
}
tree myheader/
myheader/
├── handler.lua
└── schema.lua
Kong已经预置了大量的开源插件,这些插件都放在/usr/local/share/lua/5.1/kong/plugins/目录下,我们自定义的插件也可以放到该目录下。
cd /usr/local/share/lua/5.1/kong/plugins/
ls
acl datadog ldap-auth rate-limiting syslog
aws-lambda file-log loggly request-size-limiting tcp-log
azure-functions hmac-auth log-serializers request-termination udp-log
base_plugin.lua http-log oauth2 request-transformer zipkin
basic-auth ip-restriction post-function response-ratelimiting
bot-detection jwt pre-function response-transformer
correlation-id key-auth prometheus session
cors kubernetes-sidecar-injector proxy-cache statsd
mv /root/kong/plugin/myheader/ .
ls
acl datadog ldap-auth proxy-cache statsd
aws-lambda file-log loggly rate-limiting syslog
azure-functions hmac-auth log-serializers request-size-limiting tcp-log
base_plugin.lua http-log myheader request-termination udp-log
basic