限制 API 请求
经常发现一些用户过度使用 API。 有时,API 被过度使用,导致产生额外费用或降低对其他用户的响应能力。 可以使用限制(速率限制)来帮助保护 API 总结点,其方法是对指定时间段内可调用 API 的次数进行限制。
例如,人口普查 API 分布于许多政府机构,因此 API 的调用次数久而久之可能会非常高。 通过应用速率限制策略,可实现对所有请求的快速响应,这样单个客户端就无法使用人口普查 API 的所有资源。
此单元介绍如何使用 API 管理策略来施加两种类型的限制。
通过订阅限制进行限制
订阅限制可以通过特定的 API 操作设置速率限制。 它不会因客户端而异。 相反,对 API 或指定操作的每个请求都以相同的方式受限。 以人口普查示例为例,可以使用订阅限制来限制某个特定时间段内对任意 API 的调用次数。 此配置的结果是,客户端在达到该限制时会收到 429 错误。 此类限制的问题在于,它允许一个客户端在其他客户端可以使用它之前用完所有请求。
例如,下面的代码演示了适用于所有 API 操作的示例配置。 此限制设置为每 15 秒周期内三次调用:
<rate-limit calls="3" renewal-period="15" />
或者,此配置也可针对特定 API 操作:
<rate-limit calls="number" renewal-period="seconds">
<api name="API name" id="API id" calls="number" renewal-period="seconds" />
<operation name="operation name" id="operation id" calls="number" renewal-period="seconds" />
</api>
</rate-limit>
通过密钥限制进行限制
密钥限制允许按任何客户端请求值配置不同速率限制。 这种类型的限制提供更好的方法来管理速率限制,因为它将限制应用于指定的请求密钥:通常是客户端 IP 地址。 它为每个客户端提供相等的带宽来调用 API:
<rate-limit-by-key calls="number"
renewal-period="seconds"
increment-condition="condition"
counter-key="key value" />
以下示例配置将按请求的 IP 地址限制速率限制。 此处将限制设置为每 60 秒 10 次调用:
<rate-limit-by-key calls="10"
renewal-period="60"
increment-condition="@(context.Response.StatusCode == 200)"
counter-key="@(context.Request.IpAddress)"/>
如果选择通过密钥进行限制,则需要确定速率限制的特定要求。 例如,下表列出了三种指定 counter-key 的常用方法:
Value | 说明 |
---|---|
context.Request.IpAddress | 按客户端 IP 地址限制速率 |
context.Subscription.Id | 按订阅 ID 限制速率 |
context.Request.Headers.GetValue("My-Custom-Header-Value") | 通过指定的客户端请求标头值限制速率 |
你可能会决定让每个单独的客户端 IP 都具有自己的带宽集,在这种情况下,要使用 context.Request.IpAddress。 或者,你可能希望限制特定域名中的所有请求,因为某些域对 API 的调用次数太多。 在这种情况下,需指定 context.Request.Headers.GetValue("host"),它将按进行调用的域来限制速率。
注意
如果 API 管理网关位于消耗层中,则 <rate-limit-by-key>
策略不可用。 可以改用 <rate-limit>
。