前言
kong是一个在nginx的基础上使用lua开发的用于管理API和微服务的代理工具。本人最近大部分时间都在玩kong,包括kong的安装部署以及批量管理kong里面的API。本文主要记录这个过程中的一些心得体会。希望看官们不吝指教。😄
安装
kong的安装并不是很复杂,把rpm包下载之后,准备好数据库(推荐使用cassandra),编辑好配置文件就可以直接启动了。至于生产环境,我们需要考虑高可用,那么也可以按照集群模式进行安装,多台kong共享一个cassandra数据中心。注意,这里需要考虑数据缓存的问题。具体场景是,node-A更新了某个API之后,node-B还没有去数据库拉取新数据,依旧是按照自身缓存的API信息向外提供服务,故此时线上节点存在不一致的状态。官网提供的解决办法是配置节点更新时间。属性如下:
- db_update_frequency (default: 5s) |
个人感觉这里需要权衡,比如后端数据库是cassandra这种最终一致性的库,那么就需要设置db_update_propagation这个值,因为kong需要给时间cassandra去将数据同步,那么这时候kong更新数据库数据的时间间隔就是db_update_propagation+db_update_frequency的总和,同时这里还需要考虑kong要分出资源来进行数据更新。那么如果设置更新时间间隔太短,更新太频繁,会有可能影响并发。
管理
安装完之后主要就是使用了。目前是使用ansible进行部署,顺理成章,也打算使用ansible管理API。但是使用过程中发现,使用的场景比较灵活,既有批量操作,也有单个修改。那么ansible的role就需要支持更多的操作,实际上ansible的灵活很大程度上是通过定义变量来实现的。但是kong的管理都是通过http接口,增删改查四种方法,每个组件管理的URI都不同,这样就给定义变量带来比较大的难度。所以本人考虑的使用python写一个管理脚本来进行这一系列的操作。
思考
在写这个管理脚本之前主要考虑的需求有:
- 脚本能否同时支持管理单点以及集群
- 同时支持单个以及批量API的操作
- 覆盖官网提供的可管理的部件
出路
本人愚钝,通过艰苦思考总算是得出了点思路。😊 首先可以通过调用ansible的API使用ansible的功能,其实本质就是令脚本具有同时操作多台主机的能力;然后通过传递命令行参数或者与命令行交互实现批量或单个API管理,最后,参考了一下责任链的设计模式将可管理组件进行分模块编写。(通过总结发现,其实api,upstream以及consumer的管理API是大体相同的,而plugins和target也是相类似的) 😄
总结
感觉要是熟悉Nginx的话,Kong是可以很快上手的。就是在于怎么使用kong,日常操作包括API,consumer,upstream,target以及plugins的增删改查,可能是批量,也可能是单个,比较灵活。在这次使用kong的过程中,个人的体会是:“越强大,越复杂” 😄
参考
https://getkong.org/docs/
https://docs.ansible.com/ansible/latest/dev_guide/index.html