Kong - 自定义插件开发(二)

July 13, 2021

这篇文章主要介绍了如何在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

image-20210713220044340

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/

其他网关

IARNO

服务端开发

Kong - 自定义插件开发(三)

Kong - 自定义插件开发(一)