这篇文章主要介绍了如何在Kong中开发自定义插件。首先,它解释了Kong插件的生命周期,并展示了如何在Lua中实现base_plugin.lua接口的方法。然后,文章提供了一个NttAuthHandler插件的示例,包括access、init_worker和log阶段的实现。接着,文章介绍了如何定义插件的schema。最后,文章讨论了在Docker容器部署中如何使用lua_shared_dict共享内存,并提供了Kong Nginx模板的相关配置。
生命周期
Kong 插件允许您在请求/响应或 tcp 流连接的生命周期的多个入口点注入自定义逻辑(在 Lua 中),因为它由 Kong 代理。为此,必须实现base_plugin.lua
接口的一种或几种方法。这些方法将在以下命名空间的模块中实现: kong.plugins.<plugin_name>.handler
handel.lua
local NttAuthHandler = {
PRIORITY = 1001,
VERSION = "1.0.0",
}
-- access 阶段
function NttAuthHandler:access(conf)
-- 自定义插件逻辑具体逻辑
-- 验证
local ok, err = nttAuth(conf)
if not ok then
return kong.response.error(err.status, err.message, {["Content-Type"] = "application/json"})
end
end
-- init_worker 阶段
function NttAuthHandler:init_worker(conf)
...
end
-- log 阶段
function NttAuthHandler:log(conf)
...
end
return NttAuthHandler
schema.lua
local typedefs = require "kong.db.schema.typedefs"
local schema = {
name = "ntt-auth",
fields = {
{ consumer = typedefs.no_consumer },
{ protocols = typedefs.protocols_http },
{ config = {
type = "record",
fields = {
{ auth_service = { type = "string" }, },
{ appid_in_header = { type = "boolean", required = true, default = false }, },
},
},
},
},
}
return schema
其他
如果Docker容器部署需要使用到lua_shared_dict
共享内存,Docker容器中Kong Nginx模板相关配置如下:
# kong nginx配置模板
vi /usr/local/share/lua/5.1/kong/templates/nginx_kong.lua
lua_shared_dict kong_db_cache_miss 12m;
lua_shared_dict ntt_auth ${{MEM_CACHE_SIZE}}; // 放在 if database == "off" 前面
参考
https://docs.konghq.com/gateway-oss/2.2.x/plugin-development/custom-logic/
https://docs.konghq.com/gateway-oss/2.2.x/plugin-development/plugin-configuration/