Kong最佳实践(一)- Kong网关初体验
简介
在本篇文章中,我们会带大家进入API网关Kong的世界,对比于传统网关,Kong网关的优势体现在哪、会给我们架构带来了哪些变化、大型公司是如何使用Kong网关解决痛点问题、对于运维人员来说进行二次开发功能与维护服务的成本如何等等,本篇文章均会一一讲述,文章的大致内容包括:
- 发展历程
- 网关由来 & 网关演化过程
- Kong网关优缺点
- Kong网关架构
- 配置方式 & 存储模式
- 运维成本
- 企业应用场景
- 未来发展历程
1 发展历程

Kong最初起源于2009年7月,Augusto、Marco、Michele三人在意大利的一个小车库中,开发出了Mashup平台[1];在七年的时间内,Mashup平台占据了API市场的主导地位,2017年5月,三人将Mashup平台中的产品出售给RapidAPI[2];10月,Mashape改名为Kong,并推出了Kong Enterprise [3],2018年Kong第一家公司成立,并发布了Kong1.0版本,随后,Kong进一步扩张版图,收购了lnsomnia[4],并推出Kuma[5]等新产品。
2 网关由来 & 网关演化过程
2.1 网关由来
网关其实我们并不陌生,在我们所熟知的前后端分离架构中就涉及到了网关,例如,前端页面调用后端API接口进行交互,传统做法中,我们使用Nginx反向代理暴露后端接口,当我们需要对某个后端接口做一些定制时,会使用Nginx对应的模块来实现,而现代网关的做法就是在传统的基础上加以改进,在网关层中引入鉴权、日志、熔断、限流等这些通用功能。
2.2 网关演化过程

从图中我们可以看出,这一整套系统中包含多个业务模块,随着业务逐渐发展,这些业务模块拆解成多个微服务,分离部署,虽然这样减轻了每个服务的压力,同时也增加一些业务外的工作,例如,当我们需要对多个业务添加鉴权、日志等一些通用功能时,我们就需要对每一个业务模块单独添加,这样显得非常繁琐。在这样的体系下,网关产品就能够很轻松地帮我们解决这些问题,并统一管理这些功能。
2.2.1 传统网关方式

从图中我们可以看出,每个服务都重复添加相同的功能,显得极为繁琐,同时给服务的统一管理增加了难度,在此体系下,鉴权、限流、日志、监控等通用功能需要在每个服务中单独实现,这使得维护者没有一个全局的视图来统一管理这些功能。
2.2.2 Kong 网关方式

从图中我们可以清晰地看到,Kong网关中统一管理了这些通用功能,相较于传统网关模式,每个微服务不需要重复添加相同的功能,并且方便后期维护。
3 Kong网关优缺点
3.1 优点
- 可安装于多操作系统,开箱即用;
- 快速入门,启动简单;
- 适用于云原生环境;
- 快速升级,操作简单;
- 配置项注解清晰、易懂;
- 自带健康检查功能;
- 内置支持集群模式;
- 插件功能丰富,易定制化。
3.2 缺点
- 不支持常用MySql数据库,仅支持PostgreSQL与Cassandra数据库;
- 在不修改源码的情况下,无法自定义Nginx配置文件,重启后重新初始化所有变更的Nginx配置文件。
4 Kong网关架构
4.1 单节点架构

结构简单,仅需单个节点。
4.2 多节点架构

Kong内置支持集群模式,可以通过添加更多节点实现横向水平扩展,处理更多流量,各节点指向相同数据源,共享相同配置,在Kong集群上游需安装负载均衡器,以便在各节点间分配流量。
4.3 高可用架构

高可用的意义在于减少系统停机的时间,从而保持其服务的高度可用性,图中的这套架构中,我们借助了Keeplived[6] VIP漂移功能,保证了单个机器宕机时,系统也能正常使用。
5 配置方式 & 存储模式
5.1 配置方式
5.1.1 API 配置方式
特征如下:
- 通过调用API的方式,能够更友好的集成进用户自定义的系统中;
- 易于配置实体,当实体增多时,配置文件过于复杂,通过API调用简单直观;
- 修改后不需要重启服务即能生效。
5.1.2 声明式配置[7]方式
特征如下:
- 在单个 YAML 或 JSON 文件中整合整个 Kong 配置,以减少出错的可能性并简化管理;
- 降低配置实体的复杂性,配置文件中将会清晰罗列出实体间的层次关系。
5.2 存储模式
5.2.1 无DB存储模式
特征如下:
- 创建的配置数据存储于内存中,机器宕机重启后,配置数据会根据配置文件重新加载;
- 该模式不支持API调用方式修改配置;
- 消除了对数据库的依赖,利于快速搭建,不利于集群扩展。
5.2.2 DB存储模式
特征如下:
- 创建的配置数据存储于数据库中,机器宕机重启后,配置数据不丢失;
- 配置数据可控,利于集群扩展。
6 运维成本
6.1 使用成本
Kong开箱即用,Docker安装方式非常简单,安装过程中我们数据库使用PostgreSQL9.6版本
# 创建网络
docker network create kong-net
# 创建一个PostgreSQL数据库
docker run -d --name kong-database --network=kong-net -p 5432:5432 -e "POSTGRES_USER=kong" -e "POSTGRES_DB=kong" -e "POSTGRES_PASSWORD=kong" postgres:9.6
# 初始化数据库
docker run --rm --network=kong-net -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" -e "KONG_PG_PASSWORD=kong" -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" kong:latest kong migrations bootstrap
# 启动Kong
docker run -d --name kong --network=kong-net -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" -e "KONG_PG_PASSWORD=kong" -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" -e "KONG_PROXY_ERROR_LOG=/dev/stderr" -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" -p 8000:8000 -p 8443:8443 -p 127.0.0.1:8001:8001 -p 127.0.0.1:8444:8444 kong:latest
安装完成后,我们只需访问localhost:8001,就可以看到Kong启动成功:
{
+ plugins:{...},
tagline: "Welcome to kong",
+ configuration:{...},
version: "1.2.1",
node_id: "22d7aed7-1d9b-4696-8aec-69d49a0aa98c",
lua_version: "LuaJIT 2.1.0-beta3",
+ prng_seeds:{...},
+ timers:{...},
hostname: "kong
}
CentOS安装方式更为简便
# 安装
wget https://bintray.com/kong/kong-rpm/download_file?file_path=centos/7/kong-2.0.4.el7.amd64.rpm
rpm -ivh download_file\?file_path\=centos%2F7%2Fkong-2.0.4.el7.amd64.rpm
# 修改配置文件
cp /etc/kong/kong.conf.default /etc/kong/kong.conf
echo "database = off" >> /etc/kong/kong.conf
# 启动
kong start
6.2 开发成本
Kong由Lua[8]编写而成,对于二次开发Kong插件功能来说,减少了开发人员的开发时间,降低学习成本。Kong 插件可以当作是一组Lua模块,写完一个简单模块就能立即在现有的环境中加载使用,开发周期短。测试也非常方便。
6.3 维护成本
Kong 本身支持 prometheus 与 http-log 插件,可以很好的集成进ELK[9]与Grafana[10]之中。prometheus插件中监控指标较为齐全,对于代理的延迟、缓存、请求率支持的相当完善;http-log插件中日志信息较为详细,能够准确快速的定位详细的问题。
7 企业应用场景
7.1 SoulCycle[11]公司案例
背景:SoulCycle公司在制定目标时,需要利用技术与合作伙伴更好地集成,并能够扩展到新的业务模式。SoulCycle的整体架构在服务开发与可伸缩性中有非常大的困难。2019年使用网关产品Kong来解决其整体架构中开发与可伸缩性问题。
解决方案:
- Kong与Kubernetes支持30多种微服务和9种环境
- 单一API平台统一了跨多云的Kubernetes微服务和整体
- 具有高可用性Kong集群的水平和垂直缩放
结果:
7.2 Digicel [14] 公司案例
背景:Digicel于2001年在牙买加成立,为客户提供最佳网络、服务和价值。为了保持竞争力并满足日益增长的客户对全数字服务的需求,致力于在法属的西印度群岛地区启用全数字移动网络。2020年使用网关产品Kong 完成微服务架构转型。
解决方案:
- 使用Kong Enterprise作为API网关,包括身份验证、日志记录、指标和相关插件
结果:
- 加快上市时间
- 改善服务观
8 未来发展历程
Kong公司在2019年就宣布了许多新产品开发。在官网中,Kong部署方式增加了许多,更多的倾向于微服务架构之中,例如:与Kubernetes结合:通过使用Kong作为入口控制器来拥有整个Kubernetes集群。Kuma:通过基于Envoy的Service Mesh[15],降低了复杂性并提高了服务可靠性。相信在未来,Kong网关会更多的向Faas[16]方向发展。
注解:
-
Mashup平台:Kong 最初的原型。Augusto、Marco、Michele为三位创始人。 ↩
-
RapidAPI:RapidAPI成立于2014年11月,致力于帮助开发者寻找、测试和管理希望集成至应用的 API(应用程序接口)。 ↩
-
Kong Enterprise:Kong的企业版本。 ↩
-
lnsomnia:是一个跨平台的 REST API 客户端,基于 Electron 而构建。 ↩
-
Kuma:新的、开源的、通用的服务网格。 ↩
-
Keeplived:作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其它服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。 ↩
-
声明式配置:关键思想在于声明式概念,而不是命令性配置。 ↩
-
Lua:是一个小巧的脚本语言,可以很容易被C/C++调用,也可以反过来调用C/C++方法,它不仅可以作为脚本语言、也可以作为普通的配置文件、代替XML、ini等,文件格式更容易理解与维护,Lua是由标准C编写而成,代码简洁优美,它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo三人所组成的研究小组于1993年开发的。 ↩
-
ELK:Elasticsearch、Logstash 和 Kibana 的简称,是一套日志分析系统。 ↩
-
Grafana:是一款采用 go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库。 ↩
-
SoulCycle:是一家总部位于纽约的健身公司,提供室内自行车锻炼课程。 ↩
-
AWS:亚马逊公司旗下云计算服务平台,为全世界各个国家和地区的客户提供一整套基础设施和云解决方案。 ↩
-
GCP:Google云端平台(英文:Google Cloud Platform)。 ↩
-
Digicel:加勒比海地区移动电话网络和家庭娱乐的提供商。 ↩
-
Service Mesh: 一种微服务的基础架构。 ↩
-
FaaS:Function as a service(函数即服务),无服务器计算,当前使用最广泛的是AWS的Lambada。 ↩