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