Skip to main content
Version: 2.8.1

Rate Limiting

用途說明#

可限制在一段時間內通過的請求數,可以設定秒、分、時、日、月或是年。

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

欄位配置說明#

變數類型預設值說明必填
secondnumber每一秒可通過請求數量。
填入的數值必須大於 0。
minutenumber每一分鐘可通過請求數量。
填入的數值必須大於 0。
hournumber每一小時可通過請求數量。
填入的數值必須大於 0。
daynumber每一日可通過請求數量。
填入的數值必須大於 0。
monthnumber每一個月可通過請求數量。
填入的數值必須大於 0。
yearnumber每一年可通過請求數量。
填入的數值必須大於 0。
limit_bystringconsumer用來統計限額的實體,可為以下其中之一:
- consumer
- credential
- ip
- service(若是用 global 範圍的 plugin 啟用方式,則需要填寫 service_id 欄位。)
- header (需要填寫 header_name 欄位。)
- path(需要填寫 path 欄位。)
如果無法確認選擇的實體,則系統會自動選擇用 ip 來當作統計限額的實體,可以查看計算回歸 IP的說明。
service_idstringlimit_by 設定為 service 時,需填入 service id。
header_namestringlimit_by 設定為 header 時,需填入標頭名。
pathstringlimit_by 設定為 path 時,需填入路徑。
填入的路徑起始值必須為 /,例如 /api/v1
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_sslbooleanfalsepolicy 使用 redis 策略時,是否使用 SSL 連接到 Redis 服務器。V
redis_ssl_verifybooleanfalsepolicy 使用 redis 策略時,且 redis_ssl 設置為 true ,是否要驗證服務器 SSL 證書。
請注意,您需要配置 lua_ssl_trusted_certificate 以指定 Redis 服務器使用的 CA(或服務器)證書。 您可能還需要相應地配置 lua_ssl_verify_depth。
V
redis_server_namestringpolicy 使用 redis 策略時,且 redis_ssl 設置為 true ,指定 TLS 擴展服務器名稱指示 (SNI) 的服務器名稱。
redis_timeoutnumber2000policy 使用 redis 策略時,需填入傳送任何請求至 Redis 伺服器之 timeout 時間,單位為 毫秒 (milliseconds)。
redis_databasenumber0policy 使用 redis 策略時,需填入 Redis 使用之資料庫。
note

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

用法示例#

在全局啟用插件#

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

全局啟用畫面

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

在服務端上啟用插件#

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

服務啟用畫面1

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

服務啟用畫面2

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

在路由端上啟用插件#

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

方式一:路由列表#

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

路由啟用畫面1

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

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

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

路由啟用畫面2


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

路由啟用畫面3

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

在用戶端上啟用插件#

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

用戶啟用畫面1

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

用戶啟用畫面2

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

驗證#

當開啟此插件時,如請求已達到設定數量時,會取得下列回應:

HTTP/1.1 429 Too Many Requests
Date: Tue, 06 Apr 2021 08:12:52 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
X-RateLimit-Remaining-Minute: 0
X-RateLimit-Limit-Minute: 2
RateLimit-Remaining: 0
Retry-After: 8
RateLimit-Limit: 2
RateLimit-Reset: 8
Content-Length: 41
X-Kong-Response-Latency: 3
{
"message":"API rate limit exceeded"
}

三種方針比較#

方針優點缺點
cluster精準,不需額外的組件就能使用。每個請求都會對 data store 進行讀取/寫入,相較之下,有最大的性能影響。
redis精準,相較 cluster 有較低的性能影響需要額外安裝 Redis。比起 local 方針有較大的性能影響。
local最小的性能影響。較不精準。如擴增使用的節點時,除非 GOC API Gateway 前面有一個 consistent-hashing load balancer,否則會在擴展節點數量時資料產生誤差。

兩個常見用法#

  1. 每筆交易都需要計數
    需要最高級別的準確性,例如金融財務系統上的交易。

  2. 保護後端服務
    對於準確性不要求,主要目的是要避免後端服務發生超載的情況,或是避免特定使用者對後端做出攻擊行為。

每筆交易都需要計數#

在這種情況下,因為準確性很重要,所以不會考慮 local 策略。考慮到使用 Redis 可能需要多花費一些功夫設定,或許會需要用到 Redis,然後選擇 clusterredis

您可以嘗試從 cluster 策略開始使用,如果性能急劇下降,則可以遷移到 redis。

請記住,您不能將現有的使用指標從 data store 轉換至 Redis。 這對於短期指標(例如:秒或分鐘)可能不是問題,但如果您使用具有較長時間框架(例如:幾個月)的指標,請小心規劃轉換方式。

保護後端服務#

如果準確性不太重要,請選擇 local 策略。

在確認情境適用之前,您可能需要進行一些測試。隨著 cluster 擴展到更多節點,會處理更多用戶請求。 當 cluster 縮小時,誤報的概率會增加。 因此,請在擴展/縮小節點時調整您的限制設定。

例如:如果用戶每秒可以發出 100 個請求,並且您有一個均衡的 5 節點 GOC API Gateway 集群,則將 local 限制設置為每秒 30 個請求可以運作。 如果您看到太多誤報,請增加限制的數量。

為了盡量減少不準確的情況,請考慮在 GOC API Gateway 前面使用 consistent-hashing load balancer。 load balancer 可以確保用戶始終被導向到同一個 GOC API Gateway 節點,進而減少不準確性,並防止擴展節點時產生的問題。

計算回歸 IP#

當無法檢索到選定的策略時,插件會通過識別 IP 地址來限制使用。 發生這種情況的原因有多種,例如客戶端未發送所選標頭或未找到配置的服務。