4.2. 3scale API 管理标准策略中的策略链
对于每个 API 产品,您可以指定策略链。策略链执行以下操作:
- 指定 APIcast 适用于请求的策略。
- 为这些策略提供配置信息。
- 决定 APIcast 应用策略的顺序。
要在链中正确排序策略,了解 APIcast 如何将策略应用到 API 消费者请求。
4.2.1. APIcast NGINX 阶段如何处理 3scale API 管理策略
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 策略将规则映射到原始路径。
4.2.2. 在 3scale API 管理管理门户中修改策略链
修改 3scale 管理门户中的产品策略链,作为 APIcast 网关配置的一部分。
流程
- 登录 3scale。
- 导航到您要为其配置策略链的 API 产品。
- 在 [your_product_name] > Integration > Policies 中,点 Add policy。
- 在 Policy Chain 部分下,使用箭头图标来重新排序策略链中的策略。
- 单击 Update Policy Chain 以保存策略链。
后续步骤
在管理门户的左侧导航面板中,有一个警告,表示您有没有提升到 APIcast 的 Configuration 改变。将策略链更新提升到 Staging APIcast,并根据需要测试更新。确认所需行为后,将更新提升到 Production APIcast。如果 APICAST_CONFIGURATION_CACHE
环境变量设置为一个大于零(默认值)的数字(默认值),则 APIcast 使用更新的配置需要这个秒数。
4.2.3. 在 JSON 配置文件中创建 3scale API 管理策略链
如果使用 APIcast 的原生部署,您可以创建一个 JSON 配置文件来控制外部的策略链。
JSON 配置文件策略链包含一个由以下信息组成的 JSON 数组:
-
带有
id
值的services
对象,用于指定策略链按编号应用到哪个服务。 -
proxy
对象,其中包含policy_chain
对象和后续对象。 -
policy_chain
对象,其中包含定义策略链的值。 -
单独的
policy
对象,用于指定策略和配置策略所需的name
和configuration
数据
以下是自定义策略 sample_policy_1
和 API 内省标准策略 token_introspection
的策略链示例:
{ "services":[ { "id":1, "proxy":{ "policy_chain":[ { "name":"sample_policy_1", "version": "1.0", "configuration":{ "sample_config_param_1":["value_1"], "sample_config_param_2":["value_2"] } }, { "name": "token_introspection", "version": "builtin", "configuration": { introspection_url:["https://tokenauthorityexample.com"], client_id:["exampleName"], client_secret:["secretexamplekey123"] }, { "name": "apicast", "version": "builtin", } ] } } ] }
所有策略链必须包含内置策略 apicast
。在策略链中放置 apicast
策略会影响策略行为。
4.2.4. 运行 3scale API 管理标准策略功能的 NGINX 阶段
下表列出了标准策略的主要 NGINX 阶段,用于定义 NGINX 在该阶段中运行的功能。表按照 NGINX 进程的顺序列出阶段。
策略链可包含特定阶段中 NGINX 进程的多个策略。在这种情况下,请确保链中策略的顺序是处理 API 请求以获得所需结果的正确顺序。表以字母顺序列出策略。
NGINX 阶段(按顺序排列) | 定义在这个阶段处理的功能的标准策略 |
---|---|
|
3scale APIcast |
|
3scale APIcast |
|
3scale APIcast |
| Upstream Mutual TLS |
|
CORS 请求处理 |
| 响应/请求内容限制 |
|
3scale APIcast |
|
Edge Limiting |
4.2.5. 3scale API 管理标准策略和处理它们的 NGINX 阶段
下表列出了标准策略以及运行该策略功能或功能的 NGINX 阶段或阶段。使用此表在策略链中正确排序策略,为上游 API 生成正确的请求。
标准策略 | 运行策略功能的 NGINX 阶段 |
---|---|
3scale APIcast |
|
Anonymous Access(匿名访问) |
|
3scale Auth 缓存 | 在策略链中,此策略的位置无关紧要。 |
3scale Batcher |
|
3scale Referrer |
|
Camel Service |
|
条件策略 | 在策略链中,此策略的位置无关紧要。 |
内容缓存 |
|
CORS 请求处理 |
|
自定义指标 |
|
Echo |
|
边缘限制 |
|
标头修改 |
|
HTTP 响应代码覆盖 |
|
IP 检查 |
|
JWT 申索检查 |
|
Liquid Context Debug |
|
日志记录 |
|
维护模式 |
|
NGINX Filter |
|
OAuth 2.0 通用 TLS 客户端身份验证 |
|
OAuth 2.0 令牌内省 |
|
代理服务 | 在策略链中,此策略的位置无关紧要。 |
速率限制标头 |
|
响应/请求内容限制 |
|
Retry | 在策略链中,此策略的位置无关紧要。 |
RH-SSO/Keycloak 角色检查 |
|
路由 |
|
SOAP |
|
TLS 客户端证书验证 |
|
TLS 终止 |
|
Upstream |
|
上游连接 | 在策略链中,此策略的位置无关紧要。 |
Upstream Mutual TLS |
|
URL Rewriting |
|
使用 Captures 重写 URL |
|
Websocket |
|