Kong APIGW — Overview

◇◆丶佛笑我妖孽 提交于 2020-12-16 12:07:37

目录

Kong

Kong 是一款由 Mashape 公司开源的 APIGW 软件,基于 OpenResty(Nginx + Lua 模块)实现,具有高可用、易扩展的特性。Kong 在 Mashape 上管理了超过 15,000 个 API,为 200,000 开发者提供了每月数十亿的请求支持。

  • 官网:https://konghq.com/kong/
  • Github:https://github.com/Kong/kong
  • Docs:https://docs.konghq.com/
  • 中文文档:https://github.com/qianyugang/kong-docs-cn

Kong 的本质是一个在 Nginx 上运行的 Lua 应用程序,由 lua-nginx-module 实现。Kong 和 OpenResty 一起打包发行,其中已经包含了 lua-nginx-module。可以简单理解为:Kong > OpenResty > Nginx + lua-nginx-module。

在这里插入图片描述

Kong 的特性:

  • 可扩展:Kong Server 支持水平扩展。
  • 插件:Kong Server 实现了 Plugin 机制进行功能定制,通过 RESTful Admin API 安装和配置插件,
  • 在任何基础设施上运行:Kong 可以部署在云端、机房、或者混合环境,包括单个或多个数据中心。

Kong 的功能:

  • Cloud Native(云原生):与平台无关,Kong 可以从裸机运行到 Kubernetes。
  • Dynamic Load Balancing(动态路由):Kong 的背后是 OpenResty + Lua,所以从 OpenResty 继承了动态路由的特性。
  • Circuit Breaker(熔断)
  • Health Checks(健康检查)
  • Logging(日志):可以记录通过 Kong 的 HTTP,TCP,UDP 请求和响应。
  • Security(安全访问):权限控制,IP 黑白名单,同样是 OpenResty 的特性。
  • SSL:Setup a Specific SSL Certificate for an underlying service or API。
  • 监控:Kong 提供了实时监控插件。
  • 认证:支持 HMAC、JWT、Basic、OAuth2.0 等常用协议。
  • Rate-limiting(限流):Block and throttle requests based on many variables。
  • REST API:通过 Rest API 进行配置管理,从繁琐的配置文件中解放。
  • 高可用性:天然支持分布式。
  • Plugins(插件机制):提供众多开箱即用的插件,且有易于扩展的自定义插件接口,用户可以使用 Lua 自行开发插件。

Kong 的软件架构

Kong 有 3 个核心组件:

  1. Kong Server:主体程序,基于 Nginx 的 HTTP APIGW 服务器,用来接收 API 请求。
  2. Apache Cassandra/PostgreSQL:后端数据库。
  3. Kong Dashboard:UI 管理工具。

Kong 的分层架构:

  1. Nginx 层:Niginx Server。
  2. OpenResty 层:可以通过 Lua 模块来进行功能扩展是 Nginx 的一大特点,OpenResty 就是一组实现了 Web 平台的基础 Lua 模块,并与 Nginx 一起打包发布。
  3. Cluster & Data Store 层:持久化 Kong 所需要的配置和生产数据,目前支持 Apache Cassandra 和 PostgreSQL 两种后端数据库。Cassandra 是分布式的 NoSQL 数据库,天然支持高可用。
  4. Plugin 层:Kong 基于 OpenResty 可以继续实现各类 Plugin 继而满足 APIGW 的基本功能,且可以通过添加新的插件进行扩展,这些插件可以通过 RESTful Admin API 轻松配置。
  5. RESTful APIs 层:包括 RESTful Admin API 和 RESTful Proxy API。

可见,Kong 覆盖了 Nginx 的所有功能,包括:反向代理、负载均衡以及基本的缓存、安全的认证、限流限速等。同时还支持 Nginx 等 Web 服务器实现不了的功能,例如:动态上游、动态 SSL 证书、动态限流限速,以及主动/被动健康检查、服务熔断等。

在这里插入图片描述

Kong 的插件

在这里插入图片描述

  • Kong Hub:https://docs.konghq.com/hub/

运行 Kong 时,每个前端 API(虚)请求经过 Kong 反向代理到后端 API(实)。在 Requests 和 Responses 之间,Kong 会依次执行已经事先安装和配置好的任何插件。

插件可以是全局的,也可以是局部的。例如:限流插件,可以实现对所有 API 和所有消费者、所有 API 和特定消费者、特定 API 和所有消费者、特定 API 和特定消费者等多种效果。

Kong 默认插件:

  • 身份认证插件(Authentication):在微服务架构中,需要做严格的身份认证,包括加密、OpenID 之类的身份认证。支持 Basic Authentication、Key authentication、OAuth2.0 authentication、HMAC authentication、JWT、LDAP authentication。

  • 安全控制插件(Security):支持 ACL(访问控制)、CORS(跨域资源共享)、动态 SSL、IP 限制、爬虫检测。

  • 流量控制插件(Traffic Control):支持请求限流(基于请求计数限流)、上游响应限流(根据 Upstream 响应计数限流)、请求大小限制。限流支持本地、Redis、集群限流等模式。

  • 分析与监控插件(Analytics & Monitoring ):支持 Galileo(记录请求和响应数据,实现 API 分析)、Datadog(记录 API Metric,如请求次数、请求大小、响应状态和延迟,可视化 API Metric)、Runscope(记录请求和响应数据,实现 API 性能测试和监控)。

  • 协议转换插件(Transformations):在微服务架构中,HTTP 的使用不如 gRPC 普遍,需要支持 HTTP 到 gRPC 协议的转换。支持请求转换(在转发到 Upstream 之前修改请求)、响应转换(在 Upstream 响应返回给客户端之前修改响应)。

  • 日志应用插件(Logging):TCP、UDP、HTTP、File、Syslog、StatsD、Loggly 等。

  • Serverless:提供对 AWS Lambda、Azure Functions、Apache OpenWhisk、Kong 自带 Serverless Functions 等等的 Serverless 解决方案的支持。你可以把你的 APIGW 部署在边缘节点上,具备了这种 FaaS 的功能,你的边缘节点就会更加地灵活。

Lua Nginx Module

在这里插入图片描述

  • init_by_lua*:发生在 Nginx Master 进程启动阶段。这里会对数据访问层进行初始化,加载插件的代码,构造路由规则表。
  • init_worker_by_lua*:发生在 Nginx Worker 进程启动阶段。这里会开启数据同步机制,执行每个插件的 init_worker 方法。
  • set_by_lua*:处理请求的第一个执行阶段。这里可以做一些流程分支处理判断变量初始化。Kong 并没有使用该阶段。
  • rewrite_by_lua*:这里可以对请求做一些修改。Kong 在这里会把处理代理给插件的 rewrite 方法。
  • access_by_lua*:Kong 在这里对请求进行路由匹配,找到 Upstream 的 Backend Real Server。
  • balancer_by_lua*:Kong 在这里会把上一阶段找到的 Backend Real Server 设置给 Nginx 的 Load Balancer。如果设置了重试次数,此阶段可能会被执行多次。
  • header_filter_by_lua*:这里可以对响应头做一些处理。Kong 在这里会把处理代理给插件的 header_filter 方法。
  • body_filter_by_lua*:这里可以对响应体做一些处理。Kong 在这里会把处理代理给插件的 body_filter 方法。
  • log_by_lua*:Kong 在这里会通过插件异步记录日志和一些 metrics 数据。

零信任网关

近两年安全领域里很火的概念就是零信任(Zero Trust)。在传统的安全领域里面,我们认为边界防护非常重要,所以会用防火墙对进来的流量做一层校验,这个校验其实是命中规则的校验,如果是黑的就把它拒绝掉。那么这个时候就会有一个问题:如果一些规则更新不及时,它就可以穿越防火墙,以前的安全更多是基于边界的防护,过了边界内网是可以畅通无阻的。

但是零信任网关可以彻底解决这个问题,它认为所有的流量都是不安全的,以前的边界防护是非黑即白。现在的零信任安全网关则是非白即黑,你不是白的,那么你就是黑的,所以它是完全基于身份来认证的。一个 API 的请求过来会到身份认证的服务器,第三方的身份认证厂商比如 Author0、OKTA 的身份认证服务器认证你的身份,身份认证过了,请求才可以通过,不然就直接拒绝掉,这是是安全领域的一个趋势。

技术选型

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!