Kong - 自定义插件开发(一)

July 13, 2021

这篇文章主要介绍了如何开发Kong自定义插件。首先,将插件视为一组Lua模块,Kong会检测并加载遵循特定命名约定的插件模块。插件由两个强制性模块组成:handler.lua和schema.lua。一些插件可能需要更深入地集成到Kong中,例如在数据库中有自己的表,或在Admin API中公开端点等,这些都可以通过向插件添加新模块来完成。

介绍

将您的插件视为一组Lua 模块。本章中描述的每个文件都被视为一个单独的模块。如果它们的名称遵循以下约定,Kong 将检测并加载您的插件模块:

kong.plugins.<plugin_name>.<module_name>

你的模块当然需要通过你的package.path 变量访问 ,它可以通过lua_package_path 配置属性调整到你的需要 。然而,安装插件的首选方式是通过 LuaRocks,Kong 与它本地集成。

为了让 Kong 意识到它必须寻找你插件的模块,你必须将它添加到配置文件中的 plugins属性中,这是一个逗号分隔的列表。例如:

plugins = bundled,my-custom-plugin  # your plugin name here

或者,如果您不想加载任何捆绑的插件:

plugins = my-custom-plugin # your plugin name here

现在,Kong 将尝试从以下命名空间加载几个 Lua 模块:

kong.plugins.my-custom-plugin.<module_name>

其中一些模块是强制性的(例如handler.lua),一些是可选的,并且允许插件实现一些额外的功能(例如api.lua扩展管理 API 端点)。

现在让我们准确描述您可以实现的模块是什么以及它们的目的是什么。

基本插件模块

在最纯粹的形式中,插件由两个强制性模块组成:

simple-plugin
├── handler.lua
└── schema.lua
  • handler.lua:插件的核心。它是一个要实现的接口,其中每个函数都将在请求/连接的生命周期中的所需时刻运行。
  • schema.lua:您的插件可能必须保留用户输入的一些配置。该模块保存该配置的架构并在其上定义规则,以便用户只能输入有效的配置值。

高级插件模块

一些插件可能需要与 Kong 更深入地集成:在数据库中有自己的表,在 Admin API 中公开端点等。每一个都可以通过向插件添加一个新模块来完成。如果插件实现了所有可选模块,那么它的结构如下所示:

complete-plugin
├── api.lua
├── daos.lua
├── handler.lua
├── migrations
   ├── init.lua
   └── 000_base_complete_plugin.lua
└── schema.lua

这是可能要实现的模块的完整列表以及它们的用途的简要说明。本指南将详细介绍,让您掌握其中的每一个。

模块名称 必需的 描述
api.lua 定义可在 Admin API 中使用的端点列表,以与插件处理的自定义实体进行交互。
daos.lua 定义一个 DAO(数据库访问对象)列表,它们是插件所需的自定义实体的抽象,并存储在数据存储中。
handler.lua 是的 要实现的接口。每个函数都将由 Kong 在请求/连接的生命周期中的所需时刻运行。
migrations/*.lua 数据库迁移(例如创建表)。仅当您的插件必须将自定义实体存储在数据库中并通过daos.lua定义的 DAO 之一与它们交互时,才需要迁移。
schema.lua 是的 保存插件配置的架构,以便用户只能输入有效的配置值。

密钥的验证插件与此文件结构插件的例子。有关更多详细信息,请参阅其源代码

参考

https://docs.konghq.com/gateway-oss/2.2.x/plugin-development/file-structure/

其他网关

IARNO

服务端开发

Kong - 自定义插件开发(二)

限流算法实践