KONG网关 — 插件开发

虽然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

到这里就已经完成了一个基础插件的开发,更多的一些系统函数可以通过官方插件开发手册来使用

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Kubernetes Ingress — Kong

Kong是由Mashape公司开源的一个高性能、高可用、易扩展的APIGateway项目,基于OpenResty(NginxLua模块),并提供了插件实现API的AOP功能。可以通过负载均衡、插件扩展等方式,来处理网络请求。Kong主要的概念Servi

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )