如何在 Azure API 管理 中实现速率限制

使用 速率限制 可以限制用户或服务在给定时间范围内可以发出的 API 调用数。 速率限制有助于确保公平使用,并防止任何单个用户或服务垄断 API 资源。 Azure API 管理 (APIM) 提供了一种为 API 实现速率限制的便捷方法。

为何使用 Azure API 管理?

Azure API 管理 是一种功能强大且通用的云服务,可帮助组织向外部、合作伙伴和内部开发人员发布 API。 它提供用于保护、管理和缩放 API 调用的工具。 其功能之一是控制速率限制,这对于保持 API 的运行状况和可靠性很有用。

在 Azure API 管理 中配置速率限制

Azure API 管理 使用策略来强制实施速率限制。 可以在不同的范围(全局、产品或 API 特定)定义这些策略。 这种灵活性使你能够根据 API 的要求和使用模式定制速率限制。

在开始实施速率限制之前,请确定速率限制。 设置的限制取决于 API 的容量和预期的流量。 常见限制设置为每秒、每分钟或每小时的调用数。 例如,可以允许每个用户每分钟 1000 次调用。

若要在 Azure API 管理中定义 API 的速率限制,请使用 rate-limitrate-limit-by-key 策略。 前者对所有用户设置限制,而后者允许对每个已标识的密钥 ((如订阅或用户 ID) )进行限制。

下面是一个策略示例,该策略将调用限制为每分钟 1000 次。

<policies>
  <inbound>
    <base />
    <rate-limit calls="1000" renewal-period="60" />
  </inbound>
  <backend>
    <base />
  </backend>
  <outbound>
    <base />
  </outbound>
  <on-error>
    <base />
  </on-error>
</policies>

超过指定的调用数时,Azure API 管理会发送“429 请求过多”状态代码,以及retry-after响应标头和指示何时可以重试的消息。

HTTP/1.1 429 Too Many Requests
content-type: application/json
retry-after: 60
    
{
  "statusCode": 429,
  "message": "Rate limit is exceeded. Try again in 60 seconds."
}

公开响应标头的速率限制信息

默认情况下,Azure API 管理不会公开响应标头的速率限制信息。 不通信速率限制会使应用难以避免超出限制并受到限制。 若要公开速率限制信息,请使用 rate-limittotal-calls-header-name 属性扩展策略remaining-calls-header-name

<policies>
  <inbound>
    <base />
    <rate-limit calls="1000" renewal-period="60" remaining-calls-header-name="ratelimit-remaining" total-calls-header-name="ratelimit-limit" />
  </inbound>
  <backend>
    <base />
  </backend>
  <outbound>
    <base />
  </outbound>
  <on-error>
    <base />
  </on-error>
</policies>

现在调用 API 时,每个响应都包含 ratelimit-remainingratelimit-limit 标头,这些标头传达 API 在超出限制之前可以处理的更多调用数。

摘要

在 Azure API 管理 中实现速率限制有助于创建可靠且可缩放的 API。 通过使用速率限制,可以确保 API 可靠且高效地为用户提供服务。 请记住,关键是找到适当的平衡点 - 过于严格,可能会妨碍可用性;过于宽松,可能会使 API 压倒一切。 通过仔细规划和持续监视,可以实现这种平衡并保持正常的 API 环境。

后续步骤