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即可看到我们自定义的插件

插件测试

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

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

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

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

相关推荐
Estar.Lee4 小时前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
2401_857610036 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全
凌冰_7 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
码农飞飞7 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货7 小时前
Rust 的简介
开发语言·后端·rust
monkey_meng7 小时前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
Estar.Lee8 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
新知图书8 小时前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
盛夏绽放9 小时前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
Ares-Wang9 小时前
Asp.net Core Hosted Service(托管服务) Timer (定时任务)
后端·asp.net