开发一个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 网关 测试插件



实战:开发加、解密插件

关注后解锁

分类: Kong

毛巳煜

高级软件开发全栈架构师