最近由于工作需要用到API网关做请求转发用,挑了目前人气较高的两款 Kong 和Goku 对比研究一下。

基本情况

Kong( https://github.com/niuguy/kong )基于Lua 构建,始创于2009年,目前在Github拥有26.9K Goku(https://github.com/eolinker/goku-api-gateway) 基于Go构建,始创于2017年,目前在Github 有2.1K获赞。

功能对比

以下功能列表整理自两个项目的github主页

功能 Kong Goku
云原生 多种方式支持 多种方式支持
K8s原生 支持原生绑定 ??
负载均衡 支持dynamic 以及hash-based 支持带权重round-robin
服务发现 支持Consul等注册中心 支持Consul、Eureka 等注册中心
健康检查 主动以及被动检测,并支持死循环检测 ??
路由设置 完整匹配+前缀+正则匹配 支持多种匹配规则,可设置访问策略
Serverless 支持 支持
水平拓展 可水平拓展节点 可水平拓展节点
插件系统 基于Lua module 基于go
API管理 提供admin API。另有一个独立开源项目Konga可提供这些admin API的界面配置 提供图形化配置界面,但部分配置如路由可能需要购买企业版
日志系统 可记录全生命周期日志 可记录全生命周期以及控制台
服务编排 无。但理论上可以通过插件实现 通过管理界面提供丰富的服务编排选择,可通过添加step方式完成其次请求,链式访问多个第三方终端
数据转换 可通过插件+配置完成数据字段转换 通过界面配置方式完成数据转换,并支持数据支持字段的过滤、删除、移动、重命名、拆包和封包等
监控集成 支持Prometheus等 支持Prometheus等

运行性能

Kong 由于本质上是运行在Ngix的一个模块,其性能有Ngix加持保证。Goku 在其主页上对比号称比Kong 要更强一些,但有待于实际验证

上手难易度

通过实际本地(Mac)搭建,由于两个项目都提供了完整的docker image, 所以按照官方手册操作一两天时间即可本地运行demo, 如果需要拓展的话要根据对Lua 或者Go的熟悉程度。值得一提的是,Kong 近期也提供了适配Go的插件开发模块。

社区支持

作为老牌Gateway, Kong 有超过450K的社区注册开发者,同时其企业版拥有众多重量级的用户。相比Goku这方面会弱一些,影响力主要集中在国内,但是可见近两年发展之迅速,未来可期。有意思的是Kong-金刚,Goku-悟空,由于Goku是后来者,猜项目人员是有悟空挑战金刚的意思吧:)

简评

如果要从这俩个产品选型的话可能要考虑几个方面,如果是简单业务场景不需要过多业务开发,那么Goku提供的原生页面管理以及服务编排功能可谓非常方便。如果需要定制开发,那么要考虑一下团队对于Lua还是Go的接受程度以及社区的支持程度。如果是非技术型企业需要更完善的产品支持,Kong 和Goku 各提供收费产品提供包括全周期开发管理等功能。