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 开发示例