SpringCloud微服務實戰——搭建企業級開發框架(十四):整合Sentinel高可用流量管理框架【限流】

全棧程式猿發表於2021-11-04

  Sentinel 是面向分散式服務架構的高可用流量防護元件,主要以流量為切入點,從限流、流量整形、熔斷降級、系統負載保護、熱點防護等多個維度來幫助開發者保障微服務的穩定性。
Sentinel 具有以下特性:

  • 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的範圍)、訊息削峰填谷、叢集流量控制、實時熔斷下游不可用應用等。
  • 完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制檯中看到接入應用的單臺機器秒級資料,甚至 500 臺以下規模的叢集的彙總執行情況。
  • 廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模組,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴並進行簡單的配置即可快速地接入 Sentinel。
  • 完善的 SPI 擴充套件點:Sentinel 提供簡單易用、完善的 SPI 擴充套件介面。您可以通過實現擴充套件介面來快速地定製邏輯。例如定製規則管理、適配動態資料來源等。

1、在gitegg-platform-cloud中引入依賴

        <!-- Sentinel 高可用流量防護元件 -->
        <dependency>
            <groupid>com.alibaba.cloud</groupid>
            <artifactid>spring-cloud-starter-alibaba-sentinel</artifactid>
        </dependency>

2、在gitegg-platform-cloud的application.yml檔案中加入暴露/actuator/sentinel端點的配置

management:
  endpoints:
    web:
      exposure:
        include: '*'

3、GitEgg-Platform重新install,GitEgg-Cloud更新匯入的依賴,啟動gitegg-service-system服務,在瀏覽器中開啟http://127.0.0.1:8001/actuator/sentinel地址,可以看到返回的Json資訊,說明專案已經整合好了Sentinel。
image.png

{
    "blockPage": null,
    "appName": "gitegg-service-system",
    "consoleServer": [],
    "coldFactor": "3",
    "rules": {
        "systemRules": [],
        "authorityRule": [],
        "paramFlowRule": [],
        "flowRules": [],
        "degradeRules": []
    },
    "metricsFileCharset": "UTF-8",
    "filter": {
        "order": -2147483648,
        "urlPatterns": [
            "/**"
        ],
        "enabled": true
    },
    "totalMetricsFileCount": 6,
    "datasource": {},
    "clientIp": "172.16.10.3",
    "clientPort": "8719",
    "logUsePid": false,
    "metricsFileSize": 52428800,
    "logDir": "",
    "heartbeatIntervalMs": 10000
}

4、在配置檔案中新增Sentinel服務地址,預設情況下 Sentinel 會在客戶端首次呼叫的時候進行初始化,開始向控制檯傳送心跳包。也可以配置sentinel.eager=true ,取消Sentinel控制檯懶載入。

spring:
    cloud:
        sentinel:
        filter:
            enabled: true
        transport:
            port: 8719
            #指定sentinel控制檯的地址
            dashboard: 127.0.0.1:8086
        eager: true

5、SystemController.java中新增限流的測試方法

    @ApiOperation(value = "限流測試")
    @GetMapping(value = "sentinel/protected")
    public Result<string> sentinelProtected() {
        return Result.data("訪問的是限流測試介面");
    }

6、啟動服務,通過瀏覽器訪問剛剛新增的測試介面地址,http://127.0.0.1:8011/system/sentinel/protected,重新整理幾次,然後開啟Sentinel控制檯地址,可以看到當前服務的訪問情況
image.png
7、以上是沒有對介面進行限流的情況,現在我們設定規則,對介面進行限流,開啟Sentinel控制檯,點選左側限流規則選單,然後點選右上角“新增流控規則”按鈕,在彈出的輸入框中,資源名輸入需要限流的介面,我們這裡設定為:/system/sentinel/protected,閾值型別:QPS, 單機閾值:20,確定新增。
image.png
8、為了測試併發請求,我們這裡藉助壓力測試工具Jmeter,具體使用方法https://jmeter.apache.org/,下載好Jmeter之後,點選新建->測試計劃->執行緒組->HTTP請求-檢視結果樹。我們限流設定的單機閾值為20,我們這裡執行緒組先設定為20,檢視請求是否會被限流,然後再將執行緒組設定為100檢視是否被限流。
image.png
image.png
image.png
image.png
image.png
從以上測試結果可以看到當設定為100時,出現訪問失敗,返回Blocked by Sentinel (flow limiting),說明限流已生效。
9、Sentinel同時也支援熱點引數限流和系統自適應限流,這裡只需要在Sentinel控制檯配置即可,所以這裡不介紹具體操作及程式碼:
熱點引數限流:何為熱點?熱點即經常訪問的資料。很多時候我們希望統計某個熱點資料中訪問頻次最高的 Top K 資料,並對其訪問進行限制。比如:

  • 商品 ID 為引數,統計一段時間內最常購買的商品 ID 並進行限制
  • 使用者 ID 為引數,針對一段時間內頻繁訪問的使用者 ID 進行限制
    熱點引數限流會統計傳入引數中的熱點引數,並根據配置的限流閾值與模式,對包含熱點引數的資源呼叫進行限流。熱點引數限流可以看做是一種特殊的流量控制,僅對包含熱點引數的資源呼叫生效。
    Sentinel 利用 LRU 策略統計最近最常訪問的熱點引數,結合令牌桶演算法來進行引數級別的流控。熱點引數限流支援叢集模式,詳細使用指南:https://github.com/alibaba/Sentinel/wiki/熱點引數限流

系統自適應限流:Sentinel 系統自適應限流從整體維度對應用入口流量進行控制,結合應用的 Load、CPU 使用率、總體平均 RT、入口 QPS 和併發執行緒數等幾個維度的監控指標,通過自適應的流控策略,讓系統的入口流量和系統的負載達到一個平衡,讓系統儘可能跑在最大吞吐量的同時保證系統整體的穩定性。,詳細使用指南:https://github.com/alibaba/Sentinel/wiki/系統自適應限流

本文原始碼在https://gitee.com/wmz1930/GitEgg 的chapter-14分支。

相關文章