Kong网关-自定义插件开发

Kong网关插件介绍

Kong是一个开源的云原生API网关和微服务管理平台,它提供了一系列插件来增强和扩展其功能。这些插件可以用于实现各种功能,如认证、授权、限流、监控、日志记录等,可以根据具体需求选择和配置。

自定义插件开发

那如果他提供的插件不符合我们的需求,我们想要自定义一个插件是否可行呢?答案是当然可以的,kong网关是预留了自定义插件的拓展功能呢。

首先基于上一篇文章 《Kong网关的部署与配置》 我相信大家已经都把kong用docker部署起来了,接下来的内容我是已默认已经把kong网关部署起来,并已经了解如何配置。

接下来我们来看下如何从0到1制订一个我们自己的业务的插件吧!

kong网关插件都是用Lua语言开发的(新版本也对支持go语言),接下来的例子还是以Lua语言为例,了解后可以自行改写为golang

Lua是一种轻量级的、高效的、可嵌入的脚本语言,广泛用于游戏开发、嵌入式系统、网络编程和其他领域,其特点为简洁、轻量、可嵌入。

文件结构

docs.konghq.com/gateway/lat...

xml 复制代码
complete-pluginhttps://docs.konghq.com/gateway/latest/plugin-development/file-structure/
├── api.lua
├── daos.lua
├── handler.lua
├── migrations
│   ├── init.lua
│   └── 000_base_complete_plugin.lua
└── schema.lua
模块名称 必需的 描述
api.lua 定义管理 API 中可用的端点列表,以与插件处理的自定义实体进行交互。
daos.lua 定义 DAO(数据库访问对象)列表,它们是插件所需的自定义实体的抽象并存储在数据存储中。
handle.lua 要实现的接口。每个函数都将由 Kong 在请求/连接生命周期中的所需时刻运行。
migrations 数据库迁移(例如创建表)。仅当您的插件必须在数据库中存储自定义实体并通过daos.lua定义的 DAO与它们交互时,才需要迁移。
schema.lua 保存插件配置的架构,以便用户只能输入有效的配置值。

通过表格解析可知,只有schema.lua和handle.lua是必须要存在的,所以最简单的结构格式为

xml 复制代码
simple-plugin 
├── handler.lua 
└── schema.lua

下面的例子我们就以最简单的文件结构格式开发我们的插件

插件配置

schema.lua文件是插件的配置文件,可以配置一些启用插件的参数并对其校验,如下图,官网文档也举了一些使用例子,可以参考官网文档

这里我们的自定义插件做一个配置,假设我们的插件名称为juejin-test, 具体业务可进行替换,这里我们定义一个启用插件的参platform,其参数为必填且只能为csdn或者juejin

lua 复制代码
return {
 name="juejin-test",
 fields = {
    {
      config = {
        type = "record",
        fields = {
          {
            platform = {
              type = "string",
              required = true,
              one_of = {
                "csdn",
                "juejin",
              },
            },
          },
        },
      },
    },
  },
}
实现插件逻辑

实现自定义逻辑前,得了解Kong Gateway执行生命周期,其提供了每个周期的实现函数,我们只需要在周期里面定义我们的逻辑,即可达到自定义,我们挑选几个比较常用的生命周期函数来举例,更多的生命周期可以自行查看官方文档

函数名称 阶段 请求协议 描述
init_worker 初始化 * 在每个 Nginx 工作进程启动时执行。
access 执行 http(s), grpc(s),ws(s) 针对来自客户端的每个请求以及在将其代理到上游服务之前执行。

kong提供了插件开发工具,可以通过kong全局变量访问,各种功能都在该表下命名,例如 kong.requestkong.log等。具体文档可查看官网

lua 复制代码
local MyTestHandler = {
 VERSION  = "1.0.0",
 PRIORITY = 10,
}

function MyTestHandler:init_worker()
    kong.log("----MyTest init_worker---")
end


function MyTestHandler:access(config)
    kong.log("----MyTest access---")
    kong.log("----config.platform----")
end

return MyTestHandler
部署插件
  1. 进入kong容器,找到插件目录
shell 复制代码
cd /usr/local/share/lua/5.1/kong/plugins

可以看到kong自带的插件文件都放在此目录下,我们也将我们自定义的插件放于此目录下 2. 在这里创建我们的插件目录,这里我的插件名称定义叫做juejin-test

shell 复制代码
mkdir juejin-test
  1. 将刚刚写的代码文件复制到容器
shell 复制代码
docker cp <宿主机目标路径> <容器ID或名称>:<容器内文件路径> 
  1. 为了让 Kong 知道它必须查找插件的模块,我们将其添加到配置文件中的,kong配置文件在/etc/kong/kong.conf.default,并将其重命名为kong.conf
shell 复制代码
cd  /etc/kong/

mv kong.conf.default kong.conf
  1. 在配置文件中,找到#plugins=bundled 改为 plungins=bundled,<插件名>

6. 加载插件,重启kong

shell 复制代码
kong prepare
kong reload
  1. 查看容器日志是否有报错,如果正确的话,将看到init_worker生命周期打印的东西

8. 如果可以看到正常日志,刷新konga即可看到我们自定义的插件

插件测试

找到自定义的插件并选择添加

接口请求,我这里的路由配置如下

每一次请求,容器日志都可以看到执行生命周期的打印

到这里我们自定义插件开发就完成了,快去试试根据自己的业务制定一个插件吧!!!

相关推荐
demo007x5 分钟前
Docling 文档转换以及技术架构分析
前端·后端·程序员
袋鱼不重2 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
用户8356290780512 小时前
使用 Python 操作 Word 内容控件
后端·python
像我这样帅的人丶你还2 小时前
啥? 前端也要会干Java?🛵🛵🛵
后端
Hommy882 小时前
【剪映小助手】添加贴纸接口(Add Sticker)
后端·github·剪映小助手·视频剪辑自动化·剪映api
CaffeinePro2 小时前
FastAPI响应处理:返回值、状态码、响应头与异常标准化与案例解析
后端
HuanYu2 小时前
PageHelper分页的原理
后端
于先生吖3 小时前
SpringBoot对接大模型开发AI命理测算系统:八字排盘与AI解析接口源码全解
人工智能·spring boot·后端
张不才3 小时前
一个静默吞数据的时间戳陷阱
后端
李少兄3 小时前
从原理到实战:Spring IoC/DI 核心知识体系与高频面试题全解
java·后端·spring