掘金 后端 ( ) • 2024-03-20 14:06

theme: channing-cyan highlight: androidstudio

Kong网关插件介绍

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

image.png

自定义插件开发

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

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

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

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

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

文件结构

https://docs.konghq.com/gateway/latest/plugin-development/file-structure/

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是必须要存在的,所以最简单的结构格式为

simple-plugin 
├── handler.lua 
└── schema.lua

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

插件配置

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

image.png

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

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等。具体文档可查看官网

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容器,找到插件目录
cd /usr/local/share/lua/5.1/kong/plugins

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

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

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

image.png 6. 加载插件,重启kong

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

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

image.png

插件测试

image.png

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

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

image.png

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

image.png

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