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