-
11.1 简介
-
kong 的自定义插件由一组Lua模块文件组成,其中每个文件均可以被视为一个独立的模块,实现独立的功能。插件的模块文件名遵循下面的约定:
-
kong.plugins.
<plugin_name
>.
<module_name
>
-
-
其中 plugin_name 是自定义插件的名称,module_name 是模块文件的名称。
-
-
在kong内部,我们使用 lua_package_path 所设置的路径来搜索和加载所需的模块文件。除此之外,我们还需要将插件的名称添加到配置文件
-
/etc
/kong
/kong.conf 的 plugins 属性中,该属性是一个以 英文逗号分割的列表。如下的配置表示在启动时除了用 bundled 关键字加载内置
-
插件集合,还加载自定义的配置:
-
plugins
= bundled,my-custom-plugin
-
-
11.1.1 基本插件
-
一个最基本的自定义插件由如下
2个Lua模块文件组成:
-
my-custom-plugin:
-
1.handler.lua
-
插件处理文件。它是基本插件的核心,其中的拦截接口需遵循kong的接口规范。需要在客户端请求生命周期中实现这些接口。
-
-
2.schema.lua
-
插件配置文件。它用于定义插件运行时所需要的配置信息,配置信息涉及的类型主要有
number,
string,
boolean,array,
table和
record等。
-
在schema.lua 配置文件中可以定义配置信息的默认值和有效合法的校验规则。schema.lua 配置文件结构灵活,可以根据需求涉及和定义各种数据结构。
-
konga 将根据实际的配置信息类型自动渲染界面,如常见的文本框,数据选择器,开关选项,下拉菜单和分组等。
-
-
11.1.2 高级插件
-
-
11.2 原理
-
kong 插件允许在 连接,请求,响应或者tcp流生命周期中的入口点注入自定义逻辑,为此必须实现基本插件拦截接口中的一个或者多个方法,这些方法在名为 handler的
-
模块文件中实现,该模块文件的名称结构如下:
-
kong.plugins.
<plugin_name
>.handler
-
-
基本插件的拦截主要分为两种 --- http 拦截和 tcp 拦截,这本质上是对 nginx lua 执行各阶段的再封装。
-
-
11.3 详解 PDK
-
PDK(插件开发工具包),是lua函数和变量的集合,是一个语义版本化的组件,可以在请求和响应的上下文阶段在自定义插件中被调用。
-
-
11.3.1 单个属性
-
11.3.2 kong.client
-
11.3.3 kong.ctx
-
11.3.4 kong.ip
-
11.3.5 kong.log
-
11.3.6 kong.nginx
-
11.3.7 kong.node
-
11.3.8 kong.request
-
11.3.9 kong.response
-
11.3.10 kong.router
-
11.3.11 kong.service
-
11.3.12 kong.service.request...
-
11.3.13 kong.service.response ...
-
11.3.14 kong.
table
-
-
11.4 插件开发
-
-
11.5 插件测试的运行环境
-
-
11.6 插件的制作与安装
-
-
11.7 插件测试与运行
-
-
11.8 插件与 C 语言
-
除了可以通过kong插件使用纯lua语言开发自定义插件之外,还可以使用LuaJIT 中的 FFI(外部函数调用接口)扩展库,高效简洁的调用外部动态链接库中的C语言函数。
-
-
11.9 插件与
Go 语言
-
为了支持在kong中运行
Go插件,需要用到一个外置的 go-pluginserver 进程,这是一个完全运行在
go环境中用
go语言开发的服务,专用于运行
go插件,我们可以在
-
kong.conf 配置文件中决定是否开启
go语言插件支持,如果选择开启,那么将在启动的kong时同时启动此进程,并打开 Unix domain socket(又叫 IPC socket),
-
以使 kong 与 go-pluginserver 进程可以全双工无障碍的进行高效事件传递,函数调用以及数据流转。
-
-
11.9.1
Go 安装
-
-
11.9.2 开发流程
-
要开发
go插件,主要需要做以下工作:
-
1.导入 Kong go-pdk 包
-
2.定义配置结构类型信息
-
3.编写 New() 函数创建配置结构实例
-
4.在该结构上添加方法以处理 kong 事件
-
5.使用
go build 命令 或 kong
/go-plugin-tool 工具编译插件
-
6.将编译生成的插件动态链接库共享文件放入
go_plugins_dir 目录
-
-
11.9.3 开发示例