前言

市场上可用的 API 网关的数量许多,网上经常会讨论哪个更好。在这篇文章中,将会分享 Spring Cloud Gateway 与 Apache APISIX 的比较。

运用 Spring Cloud Gateway 的第一步

我所知道的一切 API 网关都供给 Docker 镜像。例如,Apache APISIX 供给三种风格:Debian、CentOS 以及最近的 Red Hat。此时,您能够开端在容器化架构中布置镜像。

Spring Cloud Gateway 的办法完全不同。它仅仅对惯例 Spring 项目的惯例依靠:

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-gateway</artifactId>
      <version>4.0.6</version>
</dependency>

您能够运用一切标准办法来创立项目,包括流行的 start.spring.io,就像任何惯例 Spring 项目一样。这种面向开发人员的办法普遍存在于与 Spring Cloud Gateway 相关的一切项目中。

概念和笼统

Apache APISIX 具有丰厚的模型:

Spring Cloud Gateway与Apache APISIX的对比

特别是,您能够创立Upstream笼统并在不同的路由之间同享它。相同,Plugin Config答应您创立可重用的插件组合。

这是 Spring Cloud Gateway 模型:

Spring Cloud Gateway与Apache APISIX的对比

APISIX 模型更丰厚,具有笼统和重用的可能性。

怎么装备

Apache APISIX 有两种布置形式(实际上是三种,但我们不具体介绍):传统布置形式和独立布置形式

在传统形式下,APISIX 将其装备存储在etcd中。APISIX 供给了丰厚的 API 来拜访和更新装备,即Admin API。在独立形式下,装备仅仅普通的 YAML。这是 GitOps 从业者的办法:您将装备存储在 Git 存储库中,经过您最喜欢的东西(例如,Argo CD 或 Tekton)观看它,后者会在产生更改时将更改传播到 APISIX 节点。APISIX 大约每秒从头加载其装备。

示例:

upstreams:
  - id: 1
    nodes:
      "catalog:8080": 1
  - id: 2
    nodes:
      "pricing:8080": 1
routes:
  - uri: /v1/products*
    upstream_id: 1
    plugins:
      proxy-rewrite:
        regex_uri: ["/v1(.*)", "$1"]
  - uri: /prices*
    upstream_id: 2
    plugins:
      referer-restriction:
        whitelist:
          - catalog.me
global_rules:
  plugins:
    prometheus:
   prefer_name: true

Spring Cloud Gateway 支持惯例 Spring 项目的一切装备选项,并且它们许多。

spring.cloud.gateway.routes[0].id=products
spring.cloud.gateway.routes[0].uri=http://catalog:8080
spring.cloud.gateway.routes[0].predicates[0]=Path=/v1/products*
spring.cloud.gateway.routes[1].id=pricing
spring.cloud.gateway.routes[1].uri=http://pricing:8080
spring.cloud.gateway.routes[1].predicates[0]=Path=/prices*
spring.cloud.gateway.routes[1].predicates[1]=Header=Referer, http://catalog.me

YAML装备如下,这是与上面相同的装备:

spring.cloud.gateway.routes:
  - id: products
    uri: http://catalog:8080
    predicates:
      - Path=/v1/products*
    filters:
      - StripPrefix=1
  - id: pricing
    uri: http://pricing:8080
    predicates:
      - Path=/prices*
   - Header=Referer, http://catalog.me

当装备产生更改时,Spring 应用程序默认不会从头加载其装备。

关于 Apache APISIX,您还能够经过端点动态创立更新和删除路由/actuator。可是,API 没有供给PATCH办法:假如有更新,您需要更新整个路线。

特性比较

Apache APISIX 经过插件完成功用,而 Spring Cloud Gateway 经过 过滤器 完成功用。假如具体的逐一功用比较超出了一篇文章的范围,我们简略归纳如下。

特性 SPRING GATEWAY APACHE APISIX
Request headers manipulation AddRequestHeader``AddRequestHeadersIfNotPresent``RemoveRequestHeader``SetRequestHeader``MapRequestHeader``SecureHeaders``FallbackHeaders``SetRequestHostHeader``PreserveHostHeader``AddRequestParameter``RemoveRequestParameter proxy-rewrite
Path manipulation StripPrefix``PrefixPath``RewritePath``SetPath
Response headers manipulation AddResponseHeader``DedupeResponseHeader``RewriteLocationResponseHeader``RemoveResponseHeader``RewriteResponseHeader``SetResponseHeader``SetStatus response-rewrite
Redirection RedirectTo redirect
JSON gRPC transcoding JsonToGrpc grpc-transcode
Body manipulation ModifyRequestBody``ModifyResponseBodyOnly available via code response-rewriteOnly the response can be modified
Resiliency CircuitBreaker``Retry api-breaker
RequestRateLimiterNo configuration via “shortcut” notation limit-count``limit-conn``limit-request
fault-injection
Caching LocalResponseCache proxy-cache

Apache APISIX 和 Spring Cloud Gateway 供给或多或少相同的功用集。关于常见的功用,Spring的方法愈加细化,每个操作都有一个专门的过滤器。相比之下,APISIX 供给了一个带有许多装备选项的插件,但用于速率限制。

一些插件是 Spring 特定的,例如*.* , SaveSession– APISIX 没有这样的集成。相反,APISIX 供给了许多用于运用不同第三方服务进行身份验证的插件,例如*.* 、KeyCloak、OpenId Connect 等。Spring Cloud Gateway 经过 Spring Security 依靠项来完成。

假如某个功用无法开箱即用,则能够运用适用于 APISIX 的 Lua 以及适用于 Spring 的 JVM 语言开发自定义插件。

可调查性

Spring Cloud Gateway 和 Apache APISIX 之间的可调查性完成存在很大差异。

第一个依靠于Actuator,它供给了很多与可调查性相关的功用。要在任何 Spring Boot 项目中运用它,只需增加依靠项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <version>3.1.0</version>
</dependency>

要为 Prometheus 耗费供给目标,请增加以下 Micrometer 依靠项:

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <version>1.11.0</version>
</dependency>

另一方面,Apache APISIX 运用相同的插件体系来完成可调查性功用:

  1. 用于追踪:zipkinskywalkingopentelemetry
  2. 关于目标:prometheusnode-statusdatadog
  3. 用于日志记录:太多,无法翔实列出,但与 Kafka、Elasticsearch、Splunk、Google Cloud、ClickHouse 等集成。

这两种产品都涵盖了可调查性的三大支柱,并供给了与第三方后端的许多集成。

可用性

可用性是相当主观的,但我没有留意到我的示例演示中有明显差异。这是一般设计,假装模仿微服务架构。

Spring Cloud Gateway与Apache APISIX的对比

不过,我略微改变了完成,以运用网关。我没有调用定价/库存组件的目录,而是调用网关来转发呼叫。此外,我想避免外部调用者拜访定价和库存:只答应目录。

此要求的多种完成方法都是可能的。在现实场景中,我可能会运用基于 TLS 的身份验证。关于这个演示,我选择传递一个可装备的标头。

Prometheus 废弃了网关的目标。Apache APISIX 供给专用端口和线程,因而惯例路由和调查是解耦的。您还能够自定义端点的路径。Spring Cloud Gateway 运用相同的端口,但运用特定的路径 ,/actuator您能够自定义该路径。您还能够经过属性更改整个执行器的端口management.server.port

该项目供给两个分支:apisix和spring。要运用它,请检查两个分支之一。

发动项目:

docker compose up

然后,测验一下:

curl localhost:8080/products

两个分支应该产生相同的结果。

我增加了 Grafana 仪表板。请留意,Spring 不会输出任何可用的内容。

结论

Spring Cloud Gateway 和 Apache APISIX 是两个 API 网关,供给或多或少相同的功用集。然而,他们的运用办法却截然不同。

Spring Cloud Gateway 源于 Spring 结构和 Spring Boot 平台,本质上专心于已经了解 Spring 的开发人员。假如你了解Spring的开发形式,很简单就能够上手。出于功能原因,Spring Cloud Gateway 运用 Spring WebFlux 完成非堵塞 I/O,而 Spring WebFlux 依靠于 Project Reactor。假如您需要运用代码编写重要的逻辑并且您不了解Mono和,那么这将是一次充溢挑战的旅程。

Apache APISIX 更适合惯例 Ops 装备文件,以他们了解的包装供给产品:Kubernetes 的 Docker 映像和 Helm 图表。