开发一个lua插件必须包含两个文件:
- handler.lua
- handler.lua主要负责业务逻辑功能编写
- schema.lua
- schema.lua主要负责插件参数定制,类似将handler.lua中写死的变量抽出来写到schema.lua中,变为动态注入。
Kong 的插件默认目录,自定义的插件可以不放在这里
/usr/local/share/lua/5.1/kong/plugins
编写插件代码
插件名称为:lua-encrypt
- 既然是自定义插件,又想应用到kong中,这期间肯定会有一些规范做适配,kong也不例外,在kong中,我们可以通过继承一个base插件:
kong.plugins.base_plugin
handler.lua
cat > handler.lua << ERIC
-- 引入一个base插件
local BasePlugin = require "kong.plugins.base_plugin"
-- 继承这个base插件
local LuaEncrypt = BasePlugin:extend()
LuaEncrypt.VERSION = "0.1.0"
LuaEncrypt.PRIORITY = 2000
-- 在 'init_by_lua_block' 中运行
function LuaEncrypt:new()
LuaEncrypt.super.new(self, "eric.mao test LuaEncrypt")
end
-- 在 'init_worker_by_lua_block' 中运行
function LuaEncrypt:init_worker()
LuaEncrypt.super.init_worker(self)
end
-- 在 'ssl_certificate_by_lua_block' 中运行
function LuaEncrypt:certificate(conf)
LuaEncrypt.super.certificate(self)
end
-- 在 'rewrite_by_lua_block' 中运行
function LuaEncrypt:rewrite(conf)
LuaEncrypt.super.rewrite(self)
end
-- 在 'access_by_lua_block' 中运行
function LuaEncrypt:access(conf)
LuaEncrypt.super.access(self)
return kong.response.exit(200,conf.content)
end
-- 在 'header_filter_by_lua_block' 中运行
function LuaEncrypt:header_filter(conf)
LuaEncrypt.super.header_filter(self)
end
-- 在 'body_filter_by_lua_block' 中运行
function LuaEncrypt:body_filter(conf)
LuaEncrypt.super.body_filter(self)
end
-- 在 'log_by_lua_block' 中运行
function LuaEncrypt:log(conf)
LuaEncrypt.super.log(self)
end
return LuaEncrypt
ERIC
schema.lua
cat > schema.lua << ERIC
return {
-- 表示 consumer 不允许手动填写
no_consumer = true,
fields = {
content = { type = "string", default = "success!!" },
}
}
ERIC
- 到这里,最简单的插件已经开发完成,接下来是如何去使用这个插件。
部署 Kong 网关 测试插件
实战:开发加、解密插件
关注后解锁