虽然kong提供了那么多的插件,但是不可能百分百满足了对于网关的需求,在很多系统中不可能吧用户体系用到kong提供的权限验证体系,包括对于一套系统完整的RBAC系统大家都有不同的改进,以及请求加密参数校验等等,所以对于扩展性对于网关的定义需要有一定的能力的,kong是通过nginx+lua开发的通过lua脚本就可以扩展插件来完成网关的目的
附上:
喵了个咪的博客:w-blog.cn
kong官网:https://konghq.com/
konga官网:https://github.com/pantsel/konga
PS:Kong版本必须 >= 1.0.0才能正常使用konga
一,开发环境准备
首先需要开发环境,docker并不适合作为开发环境来使用,容器重启内容丢失等问题对kong-lua插件开发来说不友好,容器内部的结构也存在区别,所以我们需要使用liunx机器来进行开发
wget https://bintray.com/kong/kong-community-edition-rpm/download_file?file_path=centos/7/kong-community-edition-1.0.3.el7.noarch.rpm
sudo yum install epel-release
sudo yum install kong-community-edition-1.0.3.el7.noarch.rpm --nogpgcheck
kong version
1.0.3
准备数据库
mkdir -p /app/docker/postgres
cd /app/docker/postgres/
vim docker-compose.yml
version: '2.1'
services:
db:
image: postgres:9.6
environment:
POSTGRES_DB: kong
POSTGRES_PASSWORD: kong
POSTGRES_USER: kong
healthcheck:
test: ["CMD", "pg_isready", "-U", "kong"]
interval: 30s
timeout: 30s
retries: 3
restart: on-failure
stdin_open: true
tty: true
ports:
- "5432:5432/tcp"
docker-compose up -d
初始化配置文件
cp /etc/kong/kong.conf.default /etc/kong/kong.conf
vim /etc/kong/kong.conf
按照之前运营容器时候注入的环境变量来修改配置文件
admin_access_log = logs/admin_access.log
admin_error_log = logs/error.log
admin_listen = 0.0.0.0:8001
database = postgres
pg_database = kong
pg_host = 127.0.0.1
pg_password = kong
pg_user = kong
启动kong,初始化数据库
kong migrations bootstrap -c /etc/kong/kong.conf
启动kong
kong start -c /etc/kong/kong.conf
访问kong
curl localhost:8001
运行konga
docker run -p 1337:1337 \
--name konga \
-e "NODE_ENV=production" \
pantsel/konga:0.14.1
最后就是使用你常用的idea装好lua扩展就可以了
二、开发扩展
这两个文件是必须有的
handler.lua // 一个实现的接口。每个函数都由Kong在请求的生命周期中的所需时刻运行。
schema.lua // 保存插件配置的架构,以便用户只能输入有效的配置值。
还有其他的扩展文件
complete-plugin
├── api.lua // 定义Admin API中可用的端点列表,以与插件处理的实体自定义实体进行交互。
├── daos.lua // 定义DAO(数据库访问对象)列表,这些DAO是插件所需并存储在数据存储区中的自定义实体的抽象。
├── handler.lua
├── migrations // 给定数据存储的相应迁移。只有当您的插件必须在数据库中存储自定义实体并通过 daos.lua定义的其中一个DAO与它们进行交互时,才需要进行迁移。
│ ├── cassandra.lua
│ └── postgres.lua
└── schema.lua
mkdir http-rewrite
cd http-rewrite
vim handler.lua
vim schema.lua
return {
no_consumer = true,
fields = {
regex = { type = "string" },
replacement = { type = "string" },
flag = {type = "string"},
},
self_check = function(schema, plugin_t, dao, is_update)
-- TODO: add check
return true
end
}
local BasePlugin = require "kong.plugins.base_plugin"
local json = require("cjson")
local RewriteHandler = BasePlugin:extend()
local ngx = ngx
RewriteHandler.PRIORITY = 2000
RewriteHandler.VERSION = "0.1.0"
-- 传入参数conf是这个插件存放在数据库中配置
function RewriteHandler:access(conf)
RewriteHandler.super.access(self)
local host = ngx.var.host
ngx.log(ngx.DEBUG, "http-rewrite plugin, host is: ", host, " ,uri is: ",
ngx.var.request_uri, " ,config is: ", json.encode(conf))
local replace,n,err = ngx.re.sub(ngx.var.request_uri, conf.regex, conf.replacement)
if replace and n == 0 then
return
end
if err then
ngx.log(ngx.ERR, "http-rewrite plugin, ngx.re.sub err: ",err, " ,host is: ", host, " ,uri is: ",
ngx.var.request_uri, " ,config is: ", json.encode(conf))
return
end
ngx.log(ngx.DEBUG, "http-rewrite plugin, replace is: ",replace)
if conf.flag == "redirect" then
ngx.redirect(replace,302)
elseif conf.flag == "permanent" then
ngx.redirect(replace,301)
end
end
function RewriteHandler:new()
RewriteHandler.super.new(self, "http-rewrite")
end
return RewriteHandler
## 在使用新插件之前,需要更新一下数据库:
kong migrations up -c /etc/kong/kong.conf
kong start -c /etc/kong/kong.conf
开启插件
此时就开启了我们自己开发的插件了
也可以通过konga工具开启
配置可以在其中看到
此时访问 http://172.16.1.82:8000/abc/test 会被跳转到 http://172.16.1.82:8000/redirect//test
到这里就已经完成了一个基础插件的开发,更多的一些系统函数可以通过官方插件开发手册来使用