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。
{
"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控制檯地址,可以看到當前服務的訪問情況
7、以上是沒有對介面進行限流的情況,現在我們設定規則,對介面進行限流,開啟Sentinel控制檯,點選左側限流規則選單,然後點選右上角“新增流控規則”按鈕,在彈出的輸入框中,資源名輸入需要限流的介面,我們這裡設定為:/system/sentinel/protected,閾值型別:QPS, 單機閾值:20,確定新增。
8、為了測試併發請求,我們這裡藉助壓力測試工具Jmeter,具體使用方法https://jmeter.apache.org/,下載好Jmeter之後,點選新建->測試計劃->執行緒組->HTTP請求-檢視結果樹。我們限流設定的單機閾值為20,我們這裡執行緒組先設定為20,檢視請求是否會被限流,然後再將執行緒組設定為100檢視是否被限流。
從以上測試結果可以看到當設定為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分支。