Skip to main content
Version: 2.8.1

Response Rate Limiting

用途說明#

可限制從服務回傳並攜帶客製的標頭之回應數量。可隨意設定多組 rate-limiting 物件,其中可以對秒、分、時、日、月或是年做設定。

如果開啟此插件之服務或是路由沒有開啟其它驗證類的插件, 則默認會使用客戶端 IP 地址當作辨識用戶身份的依據;反之,則會使用用戶本身已驗證的資訊來辨識用戶身份。

欄位配置說明#

變數類型預設值說明必填
limits.{limit_name}string可以設定的客製化物件列表, {limit_name} 可以填入任意值。
例如:如果物件叫做 sms,limits.sms.minute=20。
V
limits.{limit_name}.secondnumber每一秒可通過請求數量。
limits.{limit_name}.minutenumber每一分鐘可通過請求數量。
limits.{limit_name}.hournumber每一小時可通過請求數量。
limits.{limit_name}.daynumber每一日可通過請求數量。
limits.{limit_name}.monthnumber每一個月可通過請求數量。
limits.{limit_name}.yearnumber每一年可通過請求數量。
header_namestringx-kong-limit計數器會計算之回應標頭名稱。
block_on_first_violationbooleanfalse決定是否在超過其中一項限制值時就阻擋請求。V
limit_bystringconsumer用來統計限額的實體,可為以下其中之一:
- consumer
- credential
- ip
如果無法確認選擇的實體,則系統會自動選擇用 ip 來當作統計限額的實體。
policystringcluster用來查詢/增加目前限額的策略,可選擇的選項有:
* local: 計數器會儲存在節點內的本地的記憶體。
* cluster: 計數器儲存在 data store (DB) 並且跨節點共享。
* redis:計數器儲存在 Redis 伺服器上並且跨節點共享。
fault_tolerantbooleantrue當連線至第三方之 data store 有問題時決定是否被代理。
當設定為 true 時,請求會被代理,並且速率限制之功能會被關閉直到 data store 恢復運作。
如設定為 false ,客戶端會直接收到 500 的錯誤回應。
V
hide_client_headersbooleanfalse是否在回應時隱藏 rate limit 相關資訊之標頭。V
redis_hoststringpolicy 使用 redis 策略時,需填入 Redis 伺服器位置。
redis_portnumber6379policy 使用 redis 策略時,需填入 Redis 伺服器通訊埠。
可填入的值範圍為 0 至 65535。
redis_usernamestringpolicy 使用 redis 策略時,且連線需要 ACL 身份驗證時連接到 Redis 服務器的用戶名。
redis_passwordstringpolicy 使用 redis 策略時,需填入連線至 Redis 伺服器之密碼。
redis_timeoutnumber2000policy 使用 redis 策略時,需填入傳送任何請求至 Redis 伺服器之 timeout 時間,單位為 毫秒 (milliseconds)。
redis_databasenumber0policy 使用 redis 策略時,需填入 Redis 使用之資料庫。
note

secondminutehourdaymonthyear必須設定其中至少一個,也可同時設定多個。

用法示例#

在全局啟用插件#

  1. 從網站左邊 Menu 中 外掛插件 頁面中,點選右上角的 新增外掛插件

全局啟用畫面

  1. 點選後,選擇 流量控管 頁籤,並啟用 Response Rate Limiting,填寫內容參考欄位配置說明,設定成功後,任何請求(不分服務、路由、用戶)皆需經過計算才能通過。

在服務端上啟用插件#

  1. 從網站左邊 Menu 中 服務 > 服務列表 頁面中,選擇要啟用此插件的服務,假設為 google,點選對應的編輯按鈕:

服務啟用畫面1

  1. 在編輯畫面中,點選上方的 外掛插件 頁籤,再點選頁籤內容上方的 新增外掛插件 按鈕:

服務啟用畫面2

點選後,選擇 流量控管 頁籤,並啟用 Response Rate Limiting,填寫內容參考欄位配置說明,設定成功後,僅有此服務(範例為google)請求需經過計算才能通過。

在路由端上啟用插件#

可以由兩種方式來選擇路由,並啟用插件:

方式一:路由列表#

  1. 從網站左邊 Menu 中 服務 > 路由列表 頁面中,選擇要啟用此插件的路由,假設為 google,點選對應的編輯按鈕:

路由啟用畫面1

方式二:服務 > 服務列表 > 路由列表#

  1. 從網站左邊 Menu 中 服務 > 服務列表 頁面中,選擇要啟用此插件的路由 所屬之服務(假設為 google),點選對應的編輯按鈕。

在編輯畫面中,點選上方的 路由 頁籤,選擇要啟用此插件的路由(假設為 google),點選對應的編輯按鈕:

路由啟用畫面2


  1. 承第1步,點擊上述兩種方式之一的編輯按鈕後,在編輯畫面中,點選上方的 外掛插件 頁籤,再點選頁籤內容上方的 新增外掛插件 按鈕:

路由啟用畫面3

點選新增外掛插件 按鈕後,選擇 流量控管 頁籤,並啟用 Response Rate Limiting,填寫內容參考欄位配置說明,設定成功後,僅有此路由(範例為google)請求需經過計算才能通過。

在用戶端上啟用插件#

  1. 從網站左邊 Menu 中 訂閱用戶 > 用戶列表 頁面中,選擇要啟用此插件的用戶,假設為 portaladmin,點選對應的編輯按鈕 :

用戶啟用畫面1

  1. 在編輯畫面中,點選上方的 外掛插件 頁籤,再點選頁籤內容上方的 新增外掛插件 按鈕:

用戶啟用畫面2

點選後,選擇 流量控管 頁籤,並啟用 Response Rate Limiting,填寫內容參考欄位配置說明,設定成功後,僅有此用戶(範例為 portaladmin)請求需經過計算才能通過。

驗證#

  1. 新增一個服務及路由,並在路由底下開啟此插件。

  2. 服務需在回應時帶有設定在 header_name 的標頭,並且其值帶入設定的 limit_name 以及單位。格式如下:

Header-Name: Limit=Value [,Limit=Value]

範例:

x-kong-limit: limitname=1
  1. 當收到帶有設定值的標頭,會收到回應包含類似以下內容:
X-RateLimit-Limit-Test-hour: 5
X-RateLimit-Remaining-Test-hour: 3
note

帶入 limitname 的值為每次計算時減少的次數單位,如果填寫成 limitname=2 ,在每次接收到回應時, xxx-Remaining-Test-xxx 的值都會再減少 2。