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.request
、kong.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
部署插件
- 进入kong容器,找到插件目录
shell
cd /usr/local/share/lua/5.1/kong/plugins
可以看到kong自带的插件文件都放在此目录下,我们也将我们自定义的插件放于此目录下 2. 在这里创建我们的插件目录,这里我的插件名称定义叫做juejin-test
shell
mkdir juejin-test
- 将刚刚写的代码文件复制到容器
shell
docker cp <宿主机目标路径> <容器ID或名称>:<容器内文件路径>
- 为了让 Kong 知道它必须查找插件的模块,我们将其添加到配置文件中的,kong配置文件在/etc/kong/kong.conf.default,并将其重命名为kong.conf
shell
cd /etc/kong/
mv kong.conf.default kong.conf
- 在配置文件中,找到#plugins=bundled 改为 plungins=bundled,<插件名>
6. 加载插件,重启kong
shell
kong prepare
kong reload
- 查看容器日志是否有报错,如果正确的话,将看到init_worker生命周期打印的东西
8. 如果可以看到正常日志,刷新konga即可看到我们自定义的插件
插件测试
找到自定义的插件并选择添加
接口请求,我这里的路由配置如下
每一次请求,容器日志都可以看到执行生命周期的打印
到这里我们自定义插件开发就完成了,快去试试根据自己的业务制定一个插件吧!!!