目录
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 个核心组件:
- Kong Server:主体程序,基于 Nginx 的 HTTP APIGW 服务器,用来接收 API 请求。
- Apache Cassandra/PostgreSQL:后端数据库。
- Kong Dashboard:UI 管理工具。
Kong 的分层架构:
- Nginx 层:Niginx Server。
- OpenResty 层:可以通过 Lua 模块来进行功能扩展是 Nginx 的一大特点,OpenResty 就是一组实现了 Web 平台的基础 Lua 模块,并与 Nginx 一起打包发布。
- Cluster & Data Store 层:持久化 Kong 所需要的配置和生产数据,目前支持 Apache Cassandra 和 PostgreSQL 两种后端数据库。Cassandra 是分布式的 NoSQL 数据库,天然支持高可用。
- Plugin 层:Kong 基于 OpenResty 可以继续实现各类 Plugin 继而满足 APIGW 的基本功能,且可以通过添加新的插件进行扩展,这些插件可以通过 RESTful Admin API 轻松配置。
- 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 的身份认证服务器认证你的身份,身份认证过了,请求才可以通过,不然就直接拒绝掉,这是是安全领域的一个趋势。
技术选型
来源:oschina
链接:https://my.oschina.net/u/4318872/blog/4809658