Kong
是一款基于OpenResty
(Nginx + Lua模块)编写的高可用、易扩展的,由 Mashape 公司开源的API Gateway
项目。Kong 是基于 Nginx 和 Apache Cassandra 或 PostgreSQL 构建的,能提供易于使用的 RESTful API 来操作和配置 API 管理系统,所以它可以水平扩展多个 Kong 服务器,通过前置的负载均衡配置把请求均匀地分发到各个 Server,来应对大批量的网络请求
Kong 采用插件机制进行功能定制,插件集(可以是0或N个)在 API 请求响应循环的生命周期中被执行。插件使用 Lua 编写,目前已有一些基础功能:HTTP基本认证、密钥认证、CORS(Cross-Origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API请求限流、请求转发以及Nginx监控。
推荐查看 官网文档,详细了解,这里不再赘述,我们这次还是以 Kong 网关插件开发为主题,定制一个 Signature验签
插件
接下来我们首先构建一个基础环境~~~
基础环境
openresty-1.13.6.2
luarocks-3.1.2
kong-1.1.2
postgresql-9.6
建议选择源码编译环境进行开发,如果仅仅需要运行环境,可以采用 如下 Docker 环境,以下示例统一添加了 new
标识,以区分 源码编译环境,可以自行去除(包括账号密码,自行修改)
1. create network
|
|
2. Kong 数据存储 postgresql 构建
|
|
这里需要注意,为了后续的操作,需要为 postgresql 开启远程调用权限,在上述容器中 开启配置
|
|
3. 构建 Konga UI平台 数据存储(可选
)
|
|
4. 构建 Kong
Kong 构建前的数据准备
构建 Kong 容器
6. 构建 Konga UI 平台
数据准备
构建 Konga
|
|
signature 插件设计
参数的 签名验证 比较简单
- 根据 client 传递的 apikey 拿到彼此约定的 apisecret 秘钥
- 对 client 参数根据 key 进行排序,并拼接参数值
- 加密字符串并与 client 的字符串对比
插件结构
查看如下目录结构,其中 apikeys.lua
为当前插件自定义的 逻辑提取模块,属于 插件的业务逻辑,跟 插件标准结构 没有太大关联
核心模块说明如下
模块名称 | 必须 | 描述 |
---|---|---|
api.lua |
NO | 为 Admin API 增加可操作接口,以便于与插件处理的实体数据进行交互,达到数据管理的目的 |
daos.lua |
NO | 定义DAO(数据库访问对象)的列表,它是插件所需的存储在数据存储中的自定义实体的抽象 |
handler.lua |
YES | 插件核心文件,每个功能将由Kong在请求的生命周期中的所需时刻运行,由 init.lua 调起 |
migrations/*.lua |
NO | 数据迁移文件,只有当插件 自定义数据库存储 与 通过 daos.lua 定义的 DAO对象 进行交互时,才需要进行迁移 |
schema.lua |
YES | 插件 config 配置的 数据结构约束 |
我们接下来对每个模块进行说明:
插件核心处理模块 handler.lua
|
|
APIKEY 处理模块 apikeys.lua
|
|
配置以及 Admin API 模块
schema.lua
|
|
daos.lua
api.lua
Admin API
migrations 数据
migrations/init.lua
migrations/000_base_wettpersign.lua
插件部署
此次主要以 源码包 安装为例,后续再对 luarocks 包安装进行说明
插件放入 plugins 目录下,默认在
/usr/local/share/lua/5.1/kong/plugins/
配置修改,添加所需插件,默认配置 path 为
/etc/kong/kong.conf
1plugins = bundled,wettper-sign插件数据构建(如果需要)
1{kong 安装路径}/bin/kong migrations up重启 Kong,插件的 安装需要 重启,普通配置修改只需要 reload
1{kong 安装路径}/bin/kong restart -c {kong 配置文件路径}/kong.conf —vv
本文作者: wettper
本文链接: http://www.web-lovers.com/kong-plugins.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!