0
点赞
收藏
分享

微信扫一扫

【Azure API 管理】APIM中的Policy是否有调用速率的方法(熔断机制)

问题描述

APIM中的Policy是否有调用速率的方法(熔断机制)


问题解答

APIM的限制速率的方式有以下方式:

  • ​​检查 HTTP 标头​​ - 强制 HTTP 标头必须存在和/或强制采用 HTTP 标头的值。
  • ​​按订阅限制调用速率​​ - 根据订阅限制调用速率,避免 API 使用量暴增。
  • ​​按密钥限制调用速率​​ - 根据密钥限制调用速率,避免 API 使用量暴增。
  • ​​限制调用方 IP​​ - 筛选(允许/拒绝)来自特定 IP 地址和/或地址范围的调用。
  • ​​按订阅设置使用量配额​​ - 允许根据订阅强制实施可续订或有生存期的调用量和/或带宽配额。
  • ​​按密钥设置使用量配额​​ - 允许根据密钥强制消耗可续订或有生存期的调用量和/或带宽配额。
  • ​​验证 JWT​​ - 强制从指定 HTTP 标头或指定查询参数提取的 JWT 必须存在且有效。
  • ​​验证客户端证书​​ - 强制客户端提供给 API 管理实例的证书与指定的验证规则和声明相匹配。

如​​rate-limit-by-key​​ 策略可以对调用速率进行限制,使指定时段的调用不超出指定的数目,避免单个密钥的 API 使用量暴增。 密钥的值可以是任意字符串,通常使用策略表达式来提供密钥。 可以添加可选增量条件,指定在决定是否到达限制值时应该进行计数的请求。 超过此调用速率时,调用方会收到 ​​429 Too Many Requests​​ 响应状态代码。

 

如果需要基于后端应用响应时间来判断,可以通过在inbound和outbound中分别设置当前的时间戳并在increment condition中判断两个时间戳的差值来判断后台响应时间。

示例如:

<policies>
<inbound>
<base />
<set-variable name="intime" value="@(DateTime.Now)" />
<rate-limit-by-key calls="5" renewal-period="10" counter-key="@(context.Subscription?.Key ?? "anonymous")" increment-condition="@(Convert.ToDouble((context.Variables.GetValueOrDefault<DateTime>("outtime") - context.Variables.GetValueOrDefault<DateTime>("intime")).TotalMilliseconds.ToString()) > 5000 )" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<set-variable name="outtime" value="@(DateTime.Now)" />
</outbound>
<on-error>
<base />
</on-error>
</policies>

说明:

此policy会探测10秒内是否有5个请求“响应时间”超过5s,如果超过则限流。(这个响应时间为执行两次set-variable的时间,分别发生在执行inbound策略和outbound策略时)

 

参考资料

API Management policy expressions:​​https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions#CLRTypes​​

按密钥限制调用速率 : ​​https://docs.azure.cn/zh-cn/api-management/api-management-access-restriction-policies#LimitCallRateByKey​​

 

 

当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!

分类: ​​【Azure API 管理】​​

标签: ​​APIM​​, ​​Policy Limit Rate​​, ​​rate-limit-by-key​​

举报

相关推荐

0 条评论