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 阶段(按顺序排列) | 本阶段中的处理描述 |
---|---|
| 运行修改请求目标 URI 的任何功能。 |
| 运行验证客户端的授权以发出请求的任何功能。 |
|
生成要发送到上游 API 的请求内容。 |
| 运行任何负载平衡功能。 |
| 运行处理请求标头的任何功能。 |
| 运行处理请求正文的任何功能。 |
| 在 NGINX 同时运行标题和正文功能后运行任何处理请求的功能。 |
| 生成有关请求的日志信息。 |
| 对从 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 应用策略的顺序示例。
在上图中,策略 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 在
下图显示了 NGINX 运行该产品的策略功能的顺序。
当 APIcast 收到对此产品公开的上游 API 的访问请求时,APIcast 会检查产品的策略链并运行功能,如下表所述:
NGINX 阶段(按顺序排列) | NGINX 在此阶段运行的功能 |
---|---|
|
运行 B 为 |
|
运行函数 |
|
策略 A 和策略 B 指定在 |
|
策略 A 和策略 B 指定在 |
|
策略链指定策略 A,然后指定策略 B。因此,此阶段运行函数 |
| 策略 A 和策略 B 指定在这个阶段执行的功能。 |
| 策略 A 和策略 B 指定在这个阶段执行的功能。 |
| 策略 A 和策略 B 指定在这个阶段执行的功能。 |
在本例中,策略 A 最初在策略链中,但策略 B 中的功能是 NGINX 运行的第一个功能。这是因为,策略 B 指定 rewrite
阶段中 NGINX 进程的功能 B1
,这在其它阶段之前。
再举一个例子,请考虑此策略链:
- URL Rewriting
- 3scale APIcast (分配给所有产品的默认策略)
URL Rewriting 策略修改请求的目标路径。APIcast 在 rewrite
阶段运行 URL Rewriting 功能。3scale APIcast 策略定义了 APIcast 在 rewrite
阶段运行的功能,以及 APIcast 在三个其他阶段运行的功能。当 URL Rewriting 策略是第一个时,3scale APIcast 策略将规则映射到重写的路径。如果 3scale APIcast 策略是第一个,URL Rewriting 策略是第二个,则 3scale APIcast 策略将规则映射到原始路径。