Kong 基于源码快速开发自定义插件

1,310 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

本文主要讲解基于docker 安装的kong 网关的插件快速开发方式,并且在konga UI管理界面加载到页面和使用

基于docker-compose 的安装方法请参考# Kong gateway 之docker-compose 部署

本次开发遇到的难点:

  1. 插件如何安装?
  2. 插件安装后konga界面无法加载显示

1.插件安装

插件安装官方地址为 官方有两种安装方式, 1.是使用luarocks的方式, 2.手动安装方式Manually本文采用第2种Manually 安装方式进行插件开发

  1. 首先本地目录创建demo 文件夹,我的本地路径为: ./docker-data/kong/demo 创建两个文件,后面会将此文件夹挂载到docker容器内部,插件内容请忽略,本次仅仅是测试插件安装,后面详细讲解插件编写。
  • handler.lua
local BasePlugin = require "kong.plugins.base_plugin"

local DemoHandler = BasePlugin:extend()

DemoHandler.VERSION = "0.1.0"
DemoHandler.PRIORITY = 2000

-- 在 'init_by_lua_block' 中运行
function DemoHandler:new()
    DemoHandler.super.new(self, "demo")
end

-- 在 'init_worker_by_lua_block' 中运行
function DemoHandler:init_worker()
    DemoHandler.super.init_worker(self)
end

-- 在 'ssl_certificate_by_lua_block' 中运行
function DemoHandler:certificate(conf)
    DemoHandler.super.certificate(self)
end

-- 在 'rewrite_by_lua_block' 中运行
function DemoHandler:rewrite(conf)
    DemoHandler.super.rewrite(self)
end

-- 在 'access_by_lua_block' 中运行
function DemoHandler:access(conf)
    DemoHandler.super.access(self)
    return kong.response.exit(200,conf.content)
end

-- 在 'header_filter_by_lua_block' 中运行
function DemoHandler:header_filter(conf)
    DemoHandler.super.header_filter(self)
end

-- 在 'body_filter_by_lua_block' 中运行
function DemoHandler:body_filter(conf)
    DemoHandler.super.body_filter(self)
end

-- 在 'log_by_lua_block' 中运行
function DemoHandler:log(conf)
    DemoHandler.super.log(self)
end

return DemoHandler
  • schema.lua
return {
    no_consumer = true,
    fields = {
        content = { type = "string", default = "success!!" },
    }
}
  1. 插件安装到kong 网关, 主要涉及2个文件的修改:
plugins = bundled,demo
lua_package_path = /opt/share/?.lua;;

plugins : kong绑定插件的名字,bundled:代表加载kong自身的插件,可以取消,则不加载默认插件。 lua_package_path: 自定义插件docker容器中的挂载目录。

  • /usr/local/share/lua/5.1/kong/constants.lua 修改此文件的主要目的是为了让自定义插件在konga 界面上显示,如果不用ui管理界面可以忽略;

注意: 这个文件不能使用源码的文件作为挂载源文件, 需要在容器启动后,从docker容器中复制出来的内容,不然就会报错;


local plugins = {
  "jwt",
  "acl",
  "correlation-id",
  "cors",
  "oauth2",
  "tcp-log",
  "udp-log",
  "file-log",
  "http-log",
  "key-auth",
  "hmac-auth",
  "basic-auth",
  "ip-restriction",
  "request-transformer",
  "response-transformer",
  "request-size-limiting",
  "rate-limiting",
  "response-ratelimiting",
  "syslog",
  "loggly",
  "datadog",
  "ldap-auth",
  "statsd",
  "bot-detection",
  "aws-lambda",
  "request-termination",
  "prometheus",
  "proxy-cache",
  "session",
  "acme",
  "grpc-gateway",
  "grpc-web",
  "pre-function",
  "post-function",
  "azure-functions",
  "zipkin",
  "demo", ## 此项为我的自定义插件
}

2.docker配置启动以及konga 界面显示

经过第一步的介绍,现在需要做的就是在docker-compose文件中增加如下配置, 将我们修改的文件挂载上去, 容器内插件的挂载目录选择:/opt/share/kong/plugins/demo, 可以随意定义, 只是需要在修改kong.conf文件中的lua_package_path = /opt/share/?.lua;;对应就行,如果你的自定义插件地址为kong 的默认插件地址:/usr/local/custom2/kong/plugins下面, 则仅需要修改上面的plugins就可以。 此处 代表kong 的占位符官网解释如下:

image.png

volumes:
     - ./docker-data/kong/demo:/opt/share/kong/plugins/demo
     - ./docker-data/kong/kong.conf:/etc/kong/kong.conf
     - ./docker-data/kong/constants.lua:/usr/local/share/lua/5.1/kong/constants.lua

最后重启docker 就可以在界面上看到你的插件名字了, 并可以直接使用了,

image.png

总结:

界面显示没有修改constants.lua文件,导致页面上在info 界面loaded_plugins栏目下都能找到插件名字,但是在添加插件界面却没有插件,在修改此文件时,第一次采用将源码文件直接复制进行挂载, 发现报错,一直没法解决, 最后采用从dokcer容器中将此文件内容复制出来后,添加上我的自定插件名字demo ,重启, 问题解决!!!!