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

插件测试

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

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

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

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

相关推荐
Java编程爱好者8 分钟前
1-5 线程池:Thread+阻塞队列+循环
后端
jnrjian10 分钟前
Library Cache Load Lock library cache pins are replaced by mutexes
java·后端·spring
用户94161469336521 分钟前
Python 批量获取 A 股全市场 K 线数据并计算技术指标(附完整代码)
后端
小江的记录本42 分钟前
【Kafka核心】Kafka高性能的四大核心支柱:零拷贝、批量发送、页缓存、压缩
java·数据库·分布式·后端·缓存·kafka·rabbitmq
SamDeepThinking1 小时前
程序员过35岁之前,应该完成的三件事
java·后端·程序员
952361 小时前
SpringAOP
java·后端·学习·spring
zx2859634002 小时前
Laravel6.x新特性全解析
java·后端·spring
Jul1en_2 小时前
Claude 迁移 Codex 工作流迁移与更新
java·服务器·前端·后端·ai编程
神奇小汤圆2 小时前
京东二面:假如SQL中join了10张表,如何优化性能?
后端
神奇小汤圆2 小时前
Spring AOP底层黑科技:巧妙破解微服务异步线程池导致事务与链路上下文丢失难题
后端