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 阶段(按顺序排列)本阶段中的处理描述

rewrite

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

access

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

content

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

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

例如,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 策略将规则映射到原始路径。

4.2.2. 在 3scale API 管理管理门户中修改策略链

修改 3scale 管理门户中的产品策略链,作为 APIcast 网关配置的一部分。

流程

  1. 登录 3scale。
  2. 导航到您要为其配置策略链的 API 产品。
  3. [your_product_name] > Integration > Policies 中,点 Add policy
  4. Policy Chain 部分下,使用箭头图标来重新排序策略链中的策略。
  5. 单击 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 对象,用于指定策略和配置策略所需的 nameconfiguration 数据

以下是自定义策略 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 阶段(按顺序排列)定义在这个阶段处理的功能的标准策略

rewrite

3scale APIcast
3scale Referrer
Anonymous Access
Echo
Header Modification
NGINX Filter
SOAP
Upstream
URL Rewriting
URL Rewriting
URL RewritingURL Rewriting with CapturesWebsocket

access

3scale APIcast
3scale Batcher
Camel Proxy
Content Caching
Edge Limiting
IP Check
JWT Claim Check
RH-SSO/Keycloak Role Check
Maintenance Mode
OAuth 2.0 Mutual TLS Client Authentication
OAuth 2.0 Token Introspection
Rate Limit Headers
Response/Request Content Limits
Routing
TLS Client Certificate Validation
Upstream

content

3scale APIcast
Liquid Context Debug
Rate Limit Headers
Routing
Upstream

balancer

Upstream Mutual TLS

header_filter

CORS 请求处理
标头修改
Response/Request Content Limits
HTTP Response Code Overwrite

body_filter

响应/请求内容限制

post_action

3scale APIcast
自定义指标

log

Edge Limiting
Logging

4.2.5. 3scale API 管理标准策略和处理它们的 NGINX 阶段

下表列出了标准策略以及运行该策略功能或功能的 NGINX 阶段或阶段。使用此表在策略链中正确排序策略,为上游 API 生成正确的请求。

标准策略运行策略功能的 NGINX 阶段

3scale APIcast

init
重写
访问
内容
post_action
APIcast 将 3scale APIcast 策略应用到所有请求。

Anonymous Access(匿名访问)

rewrite

3scale Auth 缓存

在策略链中,此策略的位置无关紧要。

3scale Batcher

access

3scale Referrer

rewrite

Camel Service

access

条件策略

在策略链中,此策略的位置无关紧要。

内容缓存

access

CORS 请求处理

header_filter

自定义指标

post_action

Echo

rewrite

边缘限制

访问
日志

标头修改

rewrite
header_filter

HTTP 响应代码覆盖

header_filter

IP 检查

access

JWT 申索检查

access

Liquid Context Debug

content

日志记录

log

维护模式

access

NGINX Filter

rewrite

OAuth 2.0 通用 TLS 客户端身份验证

access

OAuth 2.0 令牌内省

access

代理服务

在策略链中,此策略的位置无关紧要。

速率限制标头

access +content

响应/请求内容限制

access
header_filter
body_filter

Retry

在策略链中,此策略的位置无关紧要。

RH-SSO/Keycloak 角色检查

access

路由

访问
内容

SOAP

rewrite

TLS 客户端证书验证

access

TLS 终止

ssl_certificate

Upstream

重写
访问
内容

上游连接

在策略链中,此策略的位置无关紧要。

Upstream Mutual TLS

balancer

URL Rewriting

rewrite

使用 Captures 重写 URL

rewrite

Websocket

rewrite

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.