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


  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分支。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM