問題描述
APIM中的Policy是否有調(diào)用速率的方法(熔斷機制)
問題解答
APIM的限制速率的方式有以下方式:
- 檢查 HTTP 標(biāo)頭 - 強制 HTTP 標(biāo)頭必須存在和/或強制采用 HTTP 標(biāo)頭的值窗慎。
- 按訂閱限制調(diào)用速率 - 根據(jù)訂閱限制調(diào)用速率任洞,避免 API 使用量暴增闸度。
- 按密鑰限制調(diào)用速率 - 根據(jù)密鑰限制調(diào)用速率庄蹋,避免 API 使用量暴增勋功。
- 限制調(diào)用方 IP - 篩選(允許/拒絕)來自特定 IP 地址和/或地址范圍的調(diào)用纺非。
- 按訂閱設(shè)置使用量配額 - 允許根據(jù)訂閱強制實施可續(xù)訂或有生存期的調(diào)用量和/或帶寬配額沙合。
- 按密鑰設(shè)置使用量配額 - 允許根據(jù)密鑰強制消耗可續(xù)訂或有生存期的調(diào)用量和/或帶寬配額积糯。
- 驗證 JWT - 強制從指定 HTTP 標(biāo)頭或指定查詢參數(shù)提取的 JWT 必須存在且有效绊茧。
- 驗證客戶端證書 - 強制客戶端提供給 API 管理實例的證書與指定的驗證規(guī)則和聲明相匹配铝宵。
如rate-limit-by-key
策略可以對調(diào)用速率進行限制,使指定時段的調(diào)用不超出指定的數(shù)目华畏,避免單個密鑰的 API 使用量暴增捉超。 密鑰的值可以是任意字符串胧卤,通常使用策略表達式來提供密鑰。 可以添加可選增量條件拼岳,指定在決定是否到達限制值時應(yīng)該進行計數(shù)的請求枝誊。 超過此調(diào)用速率時,調(diào)用方會收到 429 Too Many Requests
響應(yīng)狀態(tài)代碼惜纸。
如果需要基于后端應(yīng)用響應(yīng)時間來判斷叶撒,可以通過在inbound和outbound中分別設(shè)置當(dāng)前的時間戳并在increment condition中判斷兩個時間戳的差值來判斷后臺響應(yīng)時間。
示例如:
<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秒內(nèi)是否有5個請求“響應(yīng)時間”超過5s耐版,如果超過則限流祠够。(這個響應(yīng)時間為執(zhí)行兩次set-variable的時間,分別發(fā)生在執(zhí)行inbound策略和outbound策略時)
參考資料
API Management policy expressions:https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions#CLRTypes
按密鑰限制調(diào)用速率 : https://docs.azure.cn/zh-cn/api-management/api-management-access-restriction-policies#LimitCallRateByKey
當(dāng)在復(fù)雜的環(huán)境中面臨問題粪牲,格物之道需:濁而靜之徐清古瓤,安以動之徐生。 云中腺阳,恰是如此!
分類: 【Azure API 管理】
標(biāo)簽: APIM, Policy Limit Rate, rate-limit-by-key