Kong(一)

Kong最佳实践(一)- Kong网关初体验

简介

在本篇文章中,我们会带大家进入API网关Kong的世界,对比于传统网关,Kong网关的优势体现在哪、会给我们架构带来了哪些变化、大型公司是如何使用Kong网关解决痛点问题、对于运维人员来说进行二次开发功能与维护服务的成本如何等等,本篇文章均会一一讲述,文章的大致内容包括:

  1. 发展历程
  2. 网关由来 & 网关演化过程
  3. Kong网关优缺点
  4. Kong网关架构
  5. 配置方式 & 存储模式
  6. 运维成本
  7. 企业应用场景
  8. 未来发展历程

1 发展历程

发展历程图.png

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 网关演化过程

网关演化过程.png

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

2.2.1 传统网关方式
传统网关方式图.png

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

2.2.2 Kong 网关方式
Kong网关方式图.png

从图中我们可以清晰地看到,Kong网关中统一管理了这些通用功能,相较于传统网关模式,每个微服务不需要重复添加相同的功能,并且方便后期维护。

3 Kong网关优缺点

3.1 优点

  1. 可安装于多操作系统,开箱即用;
  2. 快速入门,启动简单;
  3. 适用于云原生环境;
  4. 快速升级,操作简单;
  5. 配置项注解清晰、易懂;
  6. 自带健康检查功能;
  7. 内置支持集群模式;
  8. 插件功能丰富,易定制化。

3.2 缺点

  1. 不支持常用MySql数据库,仅支持PostgreSQL与Cassandra数据库;
  2. 在不修改源码的情况下,无法自定义Nginx配置文件,重启后重新初始化所有变更的Nginx配置文件。

4 Kong网关架构

4.1 单节点架构

单节点架构图.png

结构简单,仅需单个节点。

4.2 多节点架构

多节点架构图.png

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

4.3 高可用架构

高可用架构图.png

高可用的意义在于减少系统停机的时间,从而保持其服务的高度可用性,图中的这套架构中,我们借助了Keeplived[6] VIP漂移功能,保证了单个机器宕机时,系统也能正常使用。

5 配置方式 & 存储模式

5.1 配置方式

5.1.1 API 配置方式

特征如下:

  1. 通过调用API的方式,能够更友好的集成进用户自定义的系统中;
  2. 易于配置实体,当实体增多时,配置文件过于复杂,通过API调用简单直观;
  3. 修改后不需要重启服务即能生效。
5.1.2 声明式配置[7]方式

特征如下:

  1. 在单个 YAML 或 JSON 文件中整合整个 Kong 配置,以减少出错的可能性并简化管理;
  2. 降低配置实体的复杂性,配置文件中将会清晰罗列出实体间的层次关系。

5.2 存储模式

5.2.1 无DB存储模式

特征如下:

  1. 创建的配置数据存储于内存中,机器宕机重启后,配置数据会根据配置文件重新加载;
  2. 该模式不支持API调用方式修改配置;
  3. 消除了对数据库的依赖,利于快速搭建,不利于集群扩展。
5.2.2 DB存储模式

特征如下:

  1. 创建的配置数据存储于数据库中,机器宕机重启后,配置数据不丢失;
  2. 配置数据可控,利于集群扩展。

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集群的水平和垂直缩放

结果:

  • AWS[12]和GCP[13]中跨服务的无缝通信
  • 可在所有环境中水平扩展

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]方向发展。


注解:


  1. Mashup平台:Kong 最初的原型。Augusto、Marco、Michele为三位创始人。 ↩

  2. RapidAPI:RapidAPI成立于2014年11月,致力于帮助开发者寻找、测试和管理希望集成至应用的 API(应用程序接口)。 ↩

  3. Kong Enterprise:Kong的企业版本。 ↩

  4. lnsomnia:是一个跨平台的 REST API 客户端,基于 Electron 而构建。 ↩

  5. Kuma:新的、开源的、通用的服务网格。 ↩

  6. Keeplived:作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其它服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。 ↩

  7. 声明式配置:关键思想在于声明式概念,而不是命令性配置。 ↩

  8. 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年开发的。 ↩

  9. ELK:Elasticsearch、Logstash 和 Kibana 的简称,是一套日志分析系统。 ↩

  10. Grafana:是一款采用 go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库。 ↩

  11. SoulCycle:是一家总部位于纽约的健身公司,提供室内自行车锻炼课程。 ↩

  12. AWS:亚马逊公司旗下云计算服务平台,为全世界各个国家和地区的客户提供一整套基础设施和云解决方案。 ↩

  13. GCP:Google云端平台(英文:Google Cloud Platform)。 ↩

  14. Digicel:加勒比海地区移动电话网络和家庭娱乐的提供商。 ↩

  15. Service Mesh: 一种微服务的基础架构。 ↩

  16. FaaS:Function as a service(函数即服务),无服务器计算,当前使用最广泛的是AWS的Lambada。 ↩

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容