
虽然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机器来进行开发
1wget https://bintray.com/kong/kong-community-edition-rpm/download_file?file_path=centos/7/kong-community-edition-1.0.3.el7.noarch.rpm 2 3 4sudo yum install epel-release 5sudo yum install kong-community-edition-1.0.3.el7.noarch.rpm --nogpgcheck 6 7 8kong version 91.0.3
准备数据库
1mkdir -p /app/docker/postgres 2cd /app/docker/postgres/ 3vim docker-compose.yml 4 5 6version: '2.1' 7services: 8 db: 9 image: postgres:9.6 10 environment: 11 POSTGRES_DB: kong 12 POSTGRES_PASSWORD: kong 13 POSTGRES_USER: kong 14 healthcheck: 15 test: ["CMD", "pg_isready", "-U", "kong"] 16 interval: 30s 17 timeout: 30s 18 retries: 3 19 restart: on-failure 20 stdin_open: true 21 tty: true 22 ports: 23 - "5432:5432/tcp" 24 25 26docker-compose up -d
初始化配置文件
1cp /etc/kong/kong.conf.default /etc/kong/kong.conf 2vim /etc/kong/kong.conf
按照之前运营容器时候注入的环境变量来修改配置文件
1admin_access_log = logs/admin_access.log 2admin_error_log = logs/error.log 3admin_listen = 0.0.0.0:8001 4database = postgres 5pg_database = kong 6pg_host = 127.0.0.1 7pg_password = kong 8pg_user = kong
启动kong,初始化数据库
kong migrations bootstrap -c /etc/kong/kong.conf
启动kong
kong start -c /etc/kong/kong.conf
访问kong
curl localhost:8001
运行konga
1docker run -p 1337:1337 \ 2 --name konga \ 3 -e "NODE_ENV=production" \ 4 pantsel/konga:0.14.1
最后就是使用你常用的idea装好lua扩展就可以了
二、开发扩展


这两个文件是必须有的
1 handler.lua // 一个实现的接口。每个函数都由Kong在请求的生命周期中的所需时刻运行。 2 schema.lua // 保存插件配置的架构,以便用户只能输入有效的配置值。
还有其他的扩展文件
1complete-plugin 2├── api.lua // 定义Admin API中可用的端点列表,以与插件处理的实体自定义实体进行交互。 3├── daos.lua // 定义DAO(数据库访问对象)列表,这些DAO是插件所需并存储在数据存储区中的自定义实体的抽象。 4├── handler.lua 5├── migrations // 给定数据存储的相应迁移。只有当您的插件必须在数据库中存储自定义实体并通过 daos.lua定义的其中一个DAO与它们进行交互时,才需要进行迁移。 6│ ├── cassandra.lua 7│ └── postgres.lua 8└── schema.lua 9 10 11mkdir http-rewrite 12cd http-rewrite 13vim handler.lua 14vim schema.lua 15 16 17return { 18 no_consumer = true, 19 fields = { 20 regex = { type = "string" }, 21 replacement = { type = "string" }, 22 flag = {type = "string"}, 23 }, 24 self_check = function(schema, plugin_t, dao, is_update) 25 -- TODO: add check 26 return true 27 end 28} 29 30 31local BasePlugin = require "kong.plugins.base_plugin" 32local json = require("cjson") 33local RewriteHandler = BasePlugin:extend() 34local ngx = ngx 35 36RewriteHandler.PRIORITY = 2000 37RewriteHandler.VERSION = "0.1.0" 38 39-- 传入参数conf是这个插件存放在数据库中配置 40function RewriteHandler:access(conf) 41 RewriteHandler.super.access(self) 42 43 local host = ngx.var.host 44 ngx.log(ngx.DEBUG, "http-rewrite plugin, host is: ", host, " ,uri is: ", 45 ngx.var.request_uri, " ,config is: ", json.encode(conf)) 46 47 local replace,n,err = ngx.re.sub(ngx.var.request_uri, conf.regex, conf.replacement) 48 if replace and n == 0 then 49 return 50 end 51 52 if err then 53 ngx.log(ngx.ERR, "http-rewrite plugin, ngx.re.sub err: ",err, " ,host is: ", host, " ,uri is: ", 54 ngx.var.request_uri, " ,config is: ", json.encode(conf)) 55 return 56 end 57 58 ngx.log(ngx.DEBUG, "http-rewrite plugin, replace is: ",replace) 59 if conf.flag == "redirect" then 60 ngx.redirect(replace,302) 61 elseif conf.flag == "permanent" then 62 ngx.redirect(replace,301) 63 end 64end 65 66function RewriteHandler:new() 67 RewriteHandler.super.new(self, "http-rewrite") 68end 69 70return RewriteHandler 71 72 73## 在使用新插件之前,需要更新一下数据库: 74kong migrations up -c /etc/kong/kong.conf 75kong start -c /etc/kong/kong.conf

开启插件


此时就开启了我们自己开发的插件了

也可以通过konga工具开启



配置可以在其中看到

此时访问 http://172.16.1.82:8000/abc/test 会被跳转到 http://172.16.1.82:8000/redirect//test
到这里就已经完成了一个基础插件的开发,更多的一些系统函数可以通过官方插件开发手册来使用