KONG网关 — 插件开发

Wesley13
• 阅读 893

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机器来进行开发

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扩展就可以了

二、开发扩展

KONG网关 — 插件开发

KONG网关 — 插件开发

这两个文件是必须有的

 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

KONG网关 — 插件开发

开启插件

KONG网关 — 插件开发

KONG网关 — 插件开发

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

KONG网关 — 插件开发

也可以通过konga工具开启

KONG网关 — 插件开发

KONG网关 — 插件开发

KONG网关 — 插件开发

配置可以在其中看到

KONG网关 — 插件开发

此时访问 http://172.16.1.82:8000/abc/test 会被跳转到 http://172.16.1.82:8000/redirect//test

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
Prodan Labs Prodan Labs
3年前
Kubernetes Ingress — Kong
Kong是由Mashape公司开源的一个高性能、高可用、易扩展的APIGateway项目,基于OpenResty(NginxLua模块),并提供了插件实现API的AOP功能。可以通过负载均衡、插件扩展等方式,来处理网络请求。Kong主要的概念Servi
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
API网关 kong 的初步认识
Kong是Mashape开源的高性能高可用API网关和API服务管理层。自2015年在github开源后,广泛受到关注。它基于OpenResty,进行API管理,并提供了插件实现API的AOP。Kong的插件机制是其高可扩展性的根源,Kong可以很方便地为路由和服务提供各种插件,网关所需要的基本特性。Kong支持特性:云原生:与平台无关,K
Wesley13 Wesley13
3年前
Kong的简介和安装
Kong是在客户端和(微)服务间转发API通信的API网关,通过插件扩展功能。Kong有两个主要组件:1、KongServer:基于nginx的服务器,用来接收API请求。2、ApacheCassandra:用来存储操作数据。你可以通过增加更多KongServer机器对Kong服务进行水平扩展,通过前置的负载均衡器向这些机
Wesley13 Wesley13
3年前
KONG网关 — 丰富的插件
!(http://pic.wblog.cn/0B53EAF31445429BA3E7BA451B3DCC55.png)为什么kong这么火热呢?当然是它拥有强大的插件群来解决我们本来需要重复手动配置或者需要自己实现的内容,kong在1.X版本加强了对于插件的支持,官方提供的插件就是几十个,通过插件可以带来各种场景更加方便使用比较使用的功
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这