Kong插件开发

新建Kong配置文件

配置文件/etc/kong/kong.conf,可以先随便建一个,后面拷贝Kong容器里面的kong.conf.default出来

新建插件目录

/kongdev/kong/plugins,在目录内以插件名称再创建插件目录文件

新建必须的插件模块文件

handler.lua

-- 根据插件beta_switch配置打印日志或返回相应头部内容
local BasePlugin = require "kong.plugins.base_plugin"

local BetaHandler = BasePlugin:extend()

BetaHandler.PRIORITY = 2000

function BetaHandler:new()
  BetaHandler.super.new(self, "betahandler")
end

function BetaHandler:access(conf)
  BetaHandler.super.access(self)

  if conf.beta_switch then
    -- 日志里面打印内容
    ngx.log(ngx.ERR, "Beta Opening")
    -- 头部里面增加信息
    ngx.header["Beta"] = "Opening"
  else
    -- 日志里面打印内容
    ngx.log(ngx.ERR, "Beta Closed")
    -- 头部里面增加信息
    ngx.header["Beta"] = "Closed"
  end

end

return BetaHandler

schema.lua

-- 配置信息设置
return {
  no_consumer = true,
  fields = {
    beta_switch = { type = "boolean", default = true }
  }
}

部署Kong、KongA和Postgresql

由于配置和插件文件需要映射到主机的目录,所以Kong的启动参数需要添加卷映射,KongA和Postgresql的部署可以参考Kong部署的文章

Kong Docker启动脚本

docker run -d --name kong \
     --network=kong-net \
     -e "KONG_DATABASE=postgres" \
     -e "KONG_PG_HOST=kong-database" \
     -e "KONG_PG_USER=kong" \
     -e "KONG_PG_PASSWORD=kong" \
     -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
     -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
     -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
     -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
     -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
     -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
     -p 8000:8000 \
     -p 8443:8443 \
     -p 0.0.0.0:8001:8001 \
     -p 0.0.0.0:8444:8444 \
     -v /kongdev/kong/plugins:/kongdev/kong/plugins\
     -v /etc/kong/kong.conf:/etc/kong/kong.conf\
     kong:latest

注意由于映射目录需要将SELinux关闭

setenforce 0

编辑kong.conf的配置,找到以下2项改为相应的配置

plugins = bundled,beta
lua_package_path = /kongdev/?.lua;./?.lua;./?/init.lua;;

验证插件

KongA界面添加服务、路由和插件

添加服务

添加路由

添加插件

命令添加服务、路由和插件

创建一个service

curl -i -X POST --url http://127.0.0.1:8001/services/ --data 'name=beta-service' --data 'url=https://blog.miacraft.cn/'

为服务指定路由

curl -i -X POST --url http://127.0.0.1:8001/services/beta-service/routes  --data 'paths[]=/beta'

添加插件

curl -i -X POST --url http://127.0.0.1:8001/services/beta-service/plugins/ --data 'name=beta'

验证结果

访问路由

curl -i -X GET  --url http://127.0.0.1:8000/beta

或者通过浏览器访问目标主机地址8000端口+beta路径

访问之后

1.查看日志是有相关字段输出

docker logs kong

2.请求返回的头部也插入了相关字段

其它信息

获取IP的几种方式

1.kong.client.get_ip()
Kong获取到的IP,一般都为上一跳的
2.kong.client.get_forwarded_ip()
转发的IP,实际测试中不是X_FORWARDED_FOR
3.ngx.var.remote_addr
实际测试中似乎受启动配置文件real_ip_header参数设置影响
如Docker启动参数改为KONG_TRUSTED_IPS=0.0.0.0/0,::/0和KONG_REAL_IP_HEADER=X-REAL-IP
则获取的IP为X-REAL-IP
4.ngx.var.binary_remote_addr
获取到的二进制数据
5.ngx.req.get_headers(),headers["X-REAL-IP"]
即最真实的X-REAL-IP参数
6.ngx.req.get_headers(),headers["X_FORWARDED_FOR"]
即最真实的X_FORWARDED_FOR参数

KongA插件图标地址

如果要替换图标则将相应的插件图标放入此路径即可,图片为png格式,名称需与插件名称对齐
/app/assets/images/kong/plugins/

Kong自带插件路径

/usr/local/share/lua/5.1/kong/plugins/

参考链接

http://www.itblg.com/other/lua/5d536050ffc18f80062f2743
https://zhuanlan.zhihu.com/p/52402537
https://blog.csdn.net/m0_38086372/article/details/106873018
工具包以及函数使用介绍
https://www.jianshu.com/p/bf7f7bfb0639

Last modification:April 7th, 2021 at 11:24 am
硬币投入口