Rainbond 默認支持基於 envoy 的全局速率限制。在 Rainbond 默認提供的綜合網絡治理插件中呈現。本文我們將一個用例呈現 Rainbond 中全局速率限制的使用方式。
前置條件
- Rainbond平臺已部署完成。
- 在Rainbond中部署可訪問的 Demo 業務。
- 爲此組件開通綜合網絡治理插件。
參考視頻
Rainbond 速率限制設置參考視頻
操作流程
1.部署全侷限制服務需要使用的 Redis 組件,使用鏡像redis:alpine
創建組件,組件創建後在端口設置中將 6379 端口別名修改爲REDIS
,開啓對內服務
權限。
2.部署全侷限制服務,使用鏡像的方式部署全侷限制服務。使用以下 DockerRun 命令創建組件,組件可部署到業務的同一個應用中。添加後使其依賴上步安裝的 REDIS 組件。
docker run -e USE_STATSD=false -e REDIS_SOCKET_TYPE=tcp -e REDIS_URL=${REDIS_HOST}:${REDIS_PORT} -e RUNTIME_ROOT=/data -e RUNTIME_SUBDIRECTORY=ratelimit -v /data/ -p 8081:8081 barnett/ratelimit:v1.4.0 /bin/ratelimit
添加成功後切換到組件端口設置頁面,將 8081 端口對內服務打開並設置端口別名爲RATE_LIMIT_SERVER
默認使用的全侷限制服務是 envoy 的默認實現,你可以根據 envoy 的速率限制服務 API 規範進行自定義實現。
3.添加速率限制配置文件
進入全侷限制服務組件的環境管理中,添加配置文件,文件路徑爲 /data/ratelimit/config/config.yaml
domain: limit.common
descriptors:
- key: remote_address
rate_limit:
unit: second
requests_per_unit: 10
# Black list IP
- key: remote_address
value: 50.0.0.5
rate_limit:
unit: second
requests_per_unit: 0
添加完配置文件後重啓組件。
該配置的含義是通過請求來源 IP 進行速率限制,
IP
爲 50.0.0.5 限制訪問,其他 IP 地址限制每秒請求 10 次
4.業務組件依賴限制服務組件並更新插件配置
編輯拓撲圖使業務組件依賴剛剛部署的速率限制服務組件,然後進入業務組件插件管理,點擊已開通的綜合治理插件的查看配置入口。在配置表單中做如下配置:
- 配置
OPEN_LIMIT
爲yes
- 配置
LIMIT_DOMAIN
爲limit.common
,該值與上面配置文件中的配置 domain 形成對應。
配置完成後更新插件配置即可。
5.驗證速率限制是否生效
我們可以使用ab
命令進行壓力測試
ab -n 1000 -c 20 http://5000.gr425688.duaqtz0k.17f4cc.grapps.cn/
結果會顯示如下:
Concurrency Level: 20
Time taken for tests: 6.132 seconds
Complete requests: 1000
Failed requests: 794
(Connect: 0, Receive: 0, Length: 794, Exceptions: 0)
Non-2xx responses: 794
可見 1000 次請求有 794 次被限制,被速率限制駁回的請求訪問碼爲429
常見問題
-
是否可以自定義開發速率限制服務
當然可以,本文采用的服務實現是envoy ratelimit,你可以基於API 規範自主實現。
-
是否支持更多速率限制策略
速率限制策略還可以支持基於請求頭來進行限制,但目前僅支持基於來源 IP 地址。