教程系列(三):Spring Cloud Tencent 接入限流中心

風流的草稿本發表於2022-11-23

導讀

限流能力是服務自我保護最重要的能力之一,市面上服務限流的元件也非常多。Spring Cloud Tencent 限流能力最大的特定是完全無侵入,對常見的限流場景做了比較好的支援。例如表示式標籤自動從 Request 裡提取引數等。

Github 地址: Spring Cloud Tencent

模組簡介

服務限流是最常見的一種服務自我保護措施之一,防止流量洪峰打垮服務。Spring Cloud Tencent Rate Limit 模組內建了針對 Spring Web 和 Spring WebFlux 場景的限流 Filter,結合 Polaris 的限流功能幫忙業務快速接入限流能力。
支援的限流場景包括:

  1. 服務級限流
  2. 根據 path 限流
  3. 根據 Request 中的 QueryParam、Header 等引數細粒度限流

如果您對原始碼感興趣,可以檢視核心限流 Filter 實現類 RateLimitFilter

快速入門

本章節將介紹如何在 Spring Cloud 專案中使用 Spring Cloud Tencent RateLimit 的功能。
完整的 Example 程式碼請參考:polaris-ratelimit-example

第一步:引入 Polaris 服務端

方式一:搭建本地北極星服務

搭建北極星服務請參考 Polaris Getting Started

方式二:使用北極星開源提供的體驗環境

  • Console Address : http://14.116.241.63:8080/

    • Username: polaris
    • Password: polaris
  • Server Address: grpc://183.47.111.80:8091

    方式三:使用騰訊雲北極星服務

    騰訊雲提供了免運維的北極星雲服務,基於雲服務可以快速開通生產級高可用北極星叢集 瞭解更多

    第二步:引入 Spring Cloud Tencent Rate Limit 依賴

  1. 參考 Spring Cloud Tencent 版本管理 文件獲取最新的版本號,引入 Spring Cloud Tencent Bom,例如:
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.tencent.cloud</groupId>
            <artifactId>spring-cloud-tencent-dependencies</artifactId>
            <version>1.5.0-Hoxton.SR9</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
  1. 引入 Spring Cloud Tencent Rate Limit Starter

    <dependency>
     <groupId>com.tencent.cloud</groupId>
     <artifactId>spring-cloud-starter-tencent-polaris-ratelimit</artifactId>
    </dependency>

    第三步:增加 Spring Cloud Tencent Rate Limit Starter 的配置檔案

  2. 在您的 bootstrap.yml 配置檔案中加入以下配置內容

    spring:
      application:
     name: ${application.name}
      cloud:
     polaris:
       address: grpc://${修改為第一步部署的 Polaris 服務地址}:8091
       namespace: default

    第四步:配置限流規則

    您可以在北極星控制檯動態配置限流規則。

    4.1 建立服務

    如果您沒有使用 Spring Cloud Tencent Discovery 能力,則需要在控制檯手工建立服務資訊。如下圖所示:

    4.2 建立限流規則

  3. 點選服務名進入服務主頁
  4. 切換到 服務限流 tab
  5. 建立規則
  6. 按要求填寫規則內容。其中,單機限流可以設定限流效果為快速失敗或者勻速排隊(勻速排隊限流可點選此處瞭解詳情),分散式限流目前僅支援快速失敗。


表示式標籤,自動解析 Query、Header、Cookie 裡的引數
把 Http 請求裡的某些欄位作為流量標籤,並且只針對帶有某些標籤的請求進行限流。例如 Query Param 有一個 uid 欄位,期望只對某些 uid 限流。為了支援這種場景,我們定義了一套標籤規則表示式,例如 ${http.query.uid} 表示請求 Query Param 裡的 uid 欄位,如下圖所示,表示 uid=1000 的使用者。


當前支援的標籤規則表示式如下:

  • ${http.query.xxx}

    • 表示查詢請求的引數
  • ${http.header.xxx}

    • 表示請求頭裡的引數
  • ${http.cookie.xxx}

    • 表示 cookie 裡的引數
  • ${http.method}

    • 表示請求的方法,GET、POST、PUT 等
  • ${http.uri}

    • 表示請求的 Path,注意 / 開頭,例如:/user

對 Path 中帶有引數的請求限流
按照 Restful 規範,Path 中經常帶有請求引數,例如以下 GET 請求 /users/{userId}/orders 表達的含義是獲取特定使用者的訂單列表。透過正規表示式即可實現這類介面的限流 /users/.*/orders ,如下圖所示:

4.2.1 使用分散式限流
  1. 頁面建立限流規則時,選擇 分散式限流 規則
  2. 額外部署限流 Server (分散式限流需要依賴額外中心限流叢集來協調多節點)
  3. 客戶端預設情況下,無需任何配置,使用預設值即可

如需使用分散式限流,則需要部署限流 Server,並把限流 Server 註冊到北極星(限流 Server 部署參考文件),限流客戶端透過北極星獲取限流 Server 的服務地址。限流 Server 預設服務名為 polaris.limiter 並註冊到 Polaris 名稱空間下。如自定義限流 Server 服務名,則需要在 resources/polaris.yml 配置限流 Server 服務名,如下所示:

provider:
  # 限流配置
  rateLimit:
    # 限流服務的名稱空間
    limiterNamespace: Polaris
    # 限流服務名,改為自定義服務名
    limiterService: polaris.limiter

第五步:啟動應用

應用啟動成功後,訪問應用的 http 介面,測試限流是否生效。如果請求被限流將會返回以下內容:

The request is deny by rate limit because the throttling threshold is reached

HttpCode 預設為 429

被限流時,可透過 spring.cloud.polaris.ratelimit.rejectRequestTips 自定義響應內容,詳細參考配置列表。

至此即已完成限流的接入。

配置列表

配置項Key預設值是否必填配置項說明
spring.cloud.polaris.ratelimit.enabledtrue是否開啟服務限流
spring.cloud.polaris.ratelimit.rejectRequestTips 自定義拒絕請求響應的文字內容
spring.cloud.polaris.ratelimit.rejectRequestTipsFilePath 自定義拒絕請求響應內容的檔案地址,常用於返回 html 檔案內容等。目前僅支援 classpath 下的檔案,放在 resources 目錄。
spring.cloud.polaris.ratelimit.rejectHttpCode429(Too Many Request)自定義拒絕請求響應的 Http 狀態碼
spring.cloud.polaris.ratelimit.maxQueuingTime1000勻速排隊限流最大排隊時間

相關文章