基於Rainbond 對微服務進行請求速率限制

Rainbond 默認支持基於 envoy 的全局速率限制。在 Rainbond 默認提供的綜合網絡治理插件中呈現。本文我們將一個用例呈現 Rainbond 中全局速率限制的使用方式。

前置條件

  1. Rainbond平臺已部署完成。
  2. 在Rainbond中部署可訪問的 Demo 業務。
  3. 爲此組件開通綜合網絡治理插件。

參考視頻

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_LIMITyes
  • 配置LIMIT_DOMAINlimit.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 地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章