4.2. 3scale 标准策略中的策略链

对于每个 API 产品,您可以指定策略链。策略链执行以下操作:

  • 指定 APIcast 适用于请求的策略。
  • 为这些策略提供配置信息。
  • 决定 APIcast 应用策略的顺序。

要在链中正确排序策略,了解 APIcast 如何将策略应用到 API 消费者请求。

4.2.1. APIcast NGINX 阶段如何处理 3scale 策略

3scale API 网关或 APIcast 使用 NGINX 代理 Web 服务器应用策略。当 APIcast 收到来自 API 使用者的请求时,APIcast APIcast 会在一系列 NGINX 阶段处理请求。在每个 NGINX 阶段中,APIcast 可以通过应用这些策略来修改原始请求:

  • 上游 API 策略链中的策略。策略链是策略的顺序列表。默认情况下,上游 API 的策略链包含 3scale APIcast 策略。API 供应商可在 3scale 产品的策略链中添加策略。APIcast 将上游 API 策略链中的策略应用到仅发送到上游 API 的 API 使用者请求。
  • 全球 3scale 策略链中的策略。API 供应商您可以设置 3scale 环境变量来更新全局策略链。APIcast 将全局策略链中的策略应用到所有 API 消费者请求。

如果同一策略位于上游 API 策略链和全局策略链中,则上游 API 策略链中的策略配置具有优先权。

在 APIcast 执行所有 NGINX 阶段所需的处理后,APIcast 会向上游 API 发送请求。因此,为了实现所需的行为,务必要理解 NGINX 阶段处理策略的顺序,因为处理可以修改 API 使用者请求。

NGINX 阶段的顺序和描述

当 APIcast 从 API 使用者接收请求时,APIcast 会通过在上游 API 的策略链和全局策略链中应用策略来处理请求。每个 3scale 策略定义一个或多个功能。APIcast 在一系列 NGINX 阶段执行策略功能。在每个阶段中,NGINX 运行所应用策略中定义的任何功能,并在该阶段指定执行。下表列出了运行策略功能的 NGINX 阶段。额外的 NGINX 阶段(在这个表中没有列出)执行不受策略链中策略顺序的处理。

NGINX 阶段(按顺序排列)本阶段中的处理描述

rewrite

运行修改请求目标 URI 的任何功能。

access

运行验证客户端的授权以发出请求的任何功能。

content

生成要发送到上游 API 的请求内容。

NGINX 在 content 阶段仅应用一个策略。如果策略链中多个策略在请求内容 NGINX 上运行,则仅应用链中最接近的策略。这一点非常重要,因为内置的 3scale APIcast 策略始终在策略链中,需要 NGINX 在 content 阶段处理。

例如,3scale APIcast 策略和 Upstream 策略都会更新请求来指定上游 API 的路径。NGINX 在 content 阶段处理这些功能。如果 3scale APIcast 策略在 Upstream 策略之前,则 NGINX 使用上游 API 配置来将其路径添加到修改后的请求。如果 Upstream 策略在 3scale APIcast 策略之前,NGING 会评估 Upstream 策略表达式。当有匹配项时,NGINX 会在修订请求中相应地更改上游 API 路径。

balancer

运行任何负载平衡功能。

header_filter

运行处理请求标头的任何功能。

body_filter

运行处理请求正文的任何功能。

post_action

在 NGINX 同时运行标题和正文功能后运行任何处理请求的功能。

log

生成有关请求的日志信息。

metrics

对从 Prometheus 端点接收的任何数据执行操作。

执行不受策略顺序影响的 NGINX 阶段示例:

  • 当 APIcast 启动时,NGINX 执行与 init 阶段关联的任务。
  • 当 APIcast worker 启动时,NGINX 执行与 init_worker 阶段关联的任务。
  • 当 APIcast 终止 HTTPS 连接时,NGINX 执行与 ssl_certificate 阶段关联的任务。

NGINX 运行策略功能的顺序

API 供应商可以在 3scale 产品中添加一个或多个策略来形成策略链。在每个阶段中,NGINX 处理那些指定在该阶段执行的策略功能。每个策略功能指定 APIcast 在一个 NGINX 阶段中应如何更改其默认行为。例如,在 header_filter 阶段中,GINX 进程指定 header_filter 以及可能对请求标头操作的功能。在每个阶段中,NGINX 按策略链中的顺序处理相关功能。

策略可以通过 context 对象共享数据。策略可以读取和修改每个阶段的 context 对象。

NGINX 执行策略功能的顺序取决于以下内容:

  • 策略链中策略的位置
  • 处理特定策略功能的 NGINX 阶段

要获得所需行为,您必须正确指定策略链顺序,因为应用策略的结果会根据策略链中的位置而有所不同。下图显示了 NGINX 应用策略的顺序示例。

APIcast NGINX 执行阶段和 3scale 策略链

在上图中,策略 A 是策略链中的第一个。但是,NGX 首先在策略 B 中处理某个功能,因为该函数与 NGINX 的第一阶段相关,即 rewrite 阶段。

现在考虑一个包含策略 A、带有以下功能的策略 B 的产品策略链:

  • 策略y A 指定:

    • access 阶段运行 NGINX 的功能 A1
    • NGINX 在 header_filter 阶段运行的功能 A2
  • 策略 B 指定:

    • NGINX 在 rewrite 阶段运行的功能 B1
    • NGINX 在 header_filter 阶段运行的功能 B2

下图显示了 NGINX 运行该产品的策略功能的顺序。

APIcast NGINX 执行阶段和示例 3scale 策略链

当 APIcast 收到对此产品公开的上游 API 的访问请求时,APIcast 会检查产品的策略链并运行功能,如下表所述:

NGINX 阶段(按顺序排列)NGINX 在此阶段运行的功能

rewrite

运行 Brewrite 阶段指定的函数 B1

access

运行函数 A1 该策略 Aaccess 阶段指定。

content

策略 A 和策略 B 指定在 balancer 阶段执行的功能。

balancer

策略 A 和策略 B 指定在 balancer 阶段执行的功能。

header_filter

策略链指定策略 A,然后指定策略 B。因此,此阶段运行函数 A2,为 header_filter 阶段指定策略 A,然后运行函数 B2,为 header_filter 阶段指定策略 B

body_filter

策略 A 和策略 B 指定在这个阶段执行的功能。

post_action

策略 A 和策略 B 指定在这个阶段执行的功能。

log

策略 A 和策略 B 指定在这个阶段执行的功能。

在本例中,策略 A 最初在策略链中,但策略 B 中的功能是 NGINX 运行的第一个功能。这是因为,策略 B 指定 rewrite 阶段中 NGINX 进程的功能 B1,这在其它阶段之前。

再举一个例子,请考虑此策略链:

  1. URL Rewriting
  2. 3scale APIcast (分配给所有产品的默认策略)

URL Rewriting 策略修改请求的目标路径。APIcast 在 rewrite 阶段运行 URL Rewriting 功能。3scale APIcast 策略定义了 APIcast 在 rewrite 阶段运行的功能,以及 APIcast 在三个其他阶段运行的功能。当 URL Rewriting 策略是第一个时,3scale APIcast 策略将规则映射到重写的路径。如果 3scale APIcast 策略是第一个,URL Rewriting 策略是第二个,则 3scale APIcast 策略将规则映射到原始路径。