与 Kong 相比,Krakend 有多好?
How good is Krakend compared to Kong?
我无法从下面提到的三个 API 网关中选择一个 API 网关:
- KrakenD (https://www.krakend.io/)
- 空(https://konghq.com/kong/)
- Spring 云网关 (https://cloud.spring.io/spring-cloud-gateway/reference/html/)
我的要求是:
- 良好的性能并且必须具有大多数 API 网关功能。
- 支持聚合来自两个不同微服务 API 的数据。
从功能列表和性能方面来看,这三个都不错。
我正在考虑放宽第二个要求,因为我不确定这是否是一个好的做法。
API 网关 是一个用于所有产品的概念,我真的认为行业应该开始对这些产品进行子分类,因为它们中的大多数都是完全不同。
我会根据您的要求在这里总结主要亮点。
Kong 和 KrakenD 都提供 "majority" 的 API 网关功能。虽然这个词很模糊,但至少涵盖了路由、限速、授权等内容。
孔
Kong 基本上是一个 Nginx 代理,使用 Lua.
在其之上添加了很多功能
使用 Kong 时,您的端点与您的后端有 1:1 关系。这意味着您在 Kong 中声明了一个端点,该端点从一个后端公开数据,并在中间执行魔法(授权、限制等)。这种魔法是 Kong 的精髓,基于 Lua 插件(不幸的是,这些插件不像 Nginx 那样用 C 语言编写)。
如果您想将来自多个后端的数据聚合到一个端点,Kong 不适合您的场景。
最后,Kong 是 有状态的(他们试图以相反的方式出售它令人印象深刻,但这超出了这个问题的范围)。配置存在于数据库中,对配置的更改是通过 API 最终修改其内部 Postgres 或等效项。
性能也不可避免地与此数据库(和 Lua)的存在相关联,而跨区域可能是一个真正的痛苦。
可以使用 Lua 代码扩展 Kong 功能。
总结:
- 具有横切关注点的代理
- 节点需要协调和同步
- 可变配置
- 数据库是真相的来源
- 更多片段,更复杂
- 多区域滞后
- 需要强大的硬件才能 运行
- Lua
中的自定义
KrakenD
KrakenD 是一种使用 Go 从头开始编写的服务,利用了并发性、速度和占用空间小的语言特性。在性能方面,这是获胜的赛马。
KrakenD 的天然定位是聚合网关。它旨在将大量后端服务连接到单个端点。公司主要采用它来为移动应用程序、Web 应用程序和其他客户端提供服务。它为前端实现后端模式,允许您使用声明性配置准确定义要向客户端公开的 API 是怎样的。您可以选择从响应中获取哪些字段、聚合它们、验证它们、转换它们等。
KrakenD 是 无状态,您可以使用 git 以与处理其余代码相同的方式对 API 进行版本控制。并且您以与应用程序相同的方式部署它(例如:CI/CD 管道推送具有新配置的新容器并推出)。由于一切都在配置中,因此不需要中央数据库,节点之间也不需要相互通信。
根据自定义,您可以使用 KrakenD 创建中间件、插件或仅使用多种语言编写脚本:Go、Lua、通用表达语言 (CEL) - JS 类型和 Martian DSL。
总结:
- 使用上游服务即时 API 创建,具有横切关注点(api 网关)。
- 不是代理,虽然它可以用作代理。
- 无节点协调
- 不需要同步
- 零复杂性(docker 带有配置文件的容器)
- 多区域没有挑战
- 声明式配置
- 不可变的基础设施
- 在生产中的微型和小型机器上运行没有问题。
- Go、Lua、CEL 和 Martian DSL 中的自定义
Spring 云网关
(以及 Zuul)主要由 Java 想要坚持使用 JVM space 的开发人员使用。我不太熟悉这个,但它的设计也是为了代理现有服务,还添加了 API 网关的交叉关注点。
我更多地将其视为您用来交付 API 的框架。使用此产品,您需要自己在 Java 中编写转换代码。包含的网关功能也是声明性的。
--
我希望这能说明一些问题
我使用 Kong 的唯一主要障碍是你只能使用 LUA 扩展 Kong。世界上只有一小部分开发人员熟悉 LUA。这就是我选择 KrakenD 的原因。
我无法从下面提到的三个 API 网关中选择一个 API 网关:
- KrakenD (https://www.krakend.io/)
- 空(https://konghq.com/kong/)
- Spring 云网关 (https://cloud.spring.io/spring-cloud-gateway/reference/html/)
我的要求是:
- 良好的性能并且必须具有大多数 API 网关功能。
- 支持聚合来自两个不同微服务 API 的数据。
从功能列表和性能方面来看,这三个都不错。 我正在考虑放宽第二个要求,因为我不确定这是否是一个好的做法。
API 网关 是一个用于所有产品的概念,我真的认为行业应该开始对这些产品进行子分类,因为它们中的大多数都是完全不同。
我会根据您的要求在这里总结主要亮点。
Kong 和 KrakenD 都提供 "majority" 的 API 网关功能。虽然这个词很模糊,但至少涵盖了路由、限速、授权等内容。
孔
Kong 基本上是一个 Nginx 代理,使用 Lua.
在其之上添加了很多功能使用 Kong 时,您的端点与您的后端有 1:1 关系。这意味着您在 Kong 中声明了一个端点,该端点从一个后端公开数据,并在中间执行魔法(授权、限制等)。这种魔法是 Kong 的精髓,基于 Lua 插件(不幸的是,这些插件不像 Nginx 那样用 C 语言编写)。
如果您想将来自多个后端的数据聚合到一个端点,Kong 不适合您的场景。
最后,Kong 是 有状态的(他们试图以相反的方式出售它令人印象深刻,但这超出了这个问题的范围)。配置存在于数据库中,对配置的更改是通过 API 最终修改其内部 Postgres 或等效项。
性能也不可避免地与此数据库(和 Lua)的存在相关联,而跨区域可能是一个真正的痛苦。
可以使用 Lua 代码扩展 Kong 功能。
总结:
- 具有横切关注点的代理
- 节点需要协调和同步
- 可变配置
- 数据库是真相的来源
- 更多片段,更复杂
- 多区域滞后
- 需要强大的硬件才能 运行
- Lua 中的自定义
KrakenD
KrakenD 是一种使用 Go 从头开始编写的服务,利用了并发性、速度和占用空间小的语言特性。在性能方面,这是获胜的赛马。
KrakenD 的天然定位是聚合网关。它旨在将大量后端服务连接到单个端点。公司主要采用它来为移动应用程序、Web 应用程序和其他客户端提供服务。它为前端实现后端模式,允许您使用声明性配置准确定义要向客户端公开的 API 是怎样的。您可以选择从响应中获取哪些字段、聚合它们、验证它们、转换它们等。
KrakenD 是 无状态,您可以使用 git 以与处理其余代码相同的方式对 API 进行版本控制。并且您以与应用程序相同的方式部署它(例如:CI/CD 管道推送具有新配置的新容器并推出)。由于一切都在配置中,因此不需要中央数据库,节点之间也不需要相互通信。
根据自定义,您可以使用 KrakenD 创建中间件、插件或仅使用多种语言编写脚本:Go、Lua、通用表达语言 (CEL) - JS 类型和 Martian DSL。
总结:
- 使用上游服务即时 API 创建,具有横切关注点(api 网关)。
- 不是代理,虽然它可以用作代理。
- 无节点协调
- 不需要同步
- 零复杂性(docker 带有配置文件的容器)
- 多区域没有挑战
- 声明式配置
- 不可变的基础设施
- 在生产中的微型和小型机器上运行没有问题。
- Go、Lua、CEL 和 Martian DSL 中的自定义
Spring 云网关
(以及 Zuul)主要由 Java 想要坚持使用 JVM space 的开发人员使用。我不太熟悉这个,但它的设计也是为了代理现有服务,还添加了 API 网关的交叉关注点。
我更多地将其视为您用来交付 API 的框架。使用此产品,您需要自己在 Java 中编写转换代码。包含的网关功能也是声明性的。
--
我希望这能说明一些问题
我使用 Kong 的唯一主要障碍是你只能使用 LUA 扩展 Kong。世界上只有一小部分开发人员熟悉 LUA。这就是我选择 KrakenD 的原因。