Sentinel 是什麼?
隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
Sentinel 具有以下特徵:
- 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的範圍)、訊息削峰填谷、叢集流量控制、實時熔斷下游不可用應用等。
- 完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制檯中看到接入應用的單臺機器秒級資料,甚至500臺以下規模的叢集的彙總執行情況。
- 廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模組,例如與 Spring Cloud、Apache Dubbo、gRPC、Quarkus的整合。您只需要引入相應的依賴並進行簡單的配置即可快速地接入 Sentinel。同時 Sentinel 提供 Java/Go/C++ 等多語言的原生實現。
- 完善的 SPI 擴充套件機制:Sentinel提供簡單易用、完善的SPI擴充套件介面。您可以通過實現擴充套件介面來快速地定製邏輯。例如定製規則管理、適配動態資料來源等。
Setinel的主要特性:
Setinel分為兩個部分:
- 核心庫(Java客戶端)不依賴任何框架/庫,能夠執行於所有Java執行時環境,同時對Dubbo/Spring Cloud等框架也有較好的支援。
- 控制檯(Dashboard)基於Spring Boot開發,打包後可以直接執行,不需要額外的Tomcat等應用容器。
快速開始
- Sentinel Dashboard部署,下載地址:https://github.com/alibaba/Sentinel/releases ,使用命令啟動
java -jar sentinel-dashboard-1.8.3.jar
-
登入控制檯,地址: http://localhost:8080 初始賬密:sentinel/sentinel
-
引入依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- 在服務的application.properties中加入以下配置
spring:
application:
name: resume-nacos-consumer
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080
port: 8719 #sentinel會在該埠啟動http server,那麼這樣的話,控制檯定義的一些限流等規則才能傳送傳遞過來
然後呼叫介面,再檢視Sentinel控制檯(注意有一會兒的延遲)。
Sentinel關鍵概念
概念名稱 | 概念描述 |
---|---|
資源 | 它可以是Java應⽤程式中的任何內容。例如,由應⽤程式提供的服務或由應⽤程式調⽤的其它應⽤提供的服務,甚⾄可以是⼀段程式碼。我們請求的API接⼝就是資源 |
規則 | 圍繞資源的實時狀態設定的規則,可以包括流量控制規則、熔斷降級規則以及系統保護規則。所有規則可以動態實時調整 |
流控實戰
- 資源名:預設請求的路徑
- 針對來源:可以填寫微服務名稱,Sentinel支援針對呼叫者進行限流。預設是default(不區分來源)
- 閾值型別:QPS和執行緒數
- 流控模式:
- 直接:資源調⽤達到限流條件時,直接限流
- 關聯:填寫一個關聯資源,關聯的資源達到閾值了,也限流自己這個資源(資源名處配置的資源)
- 鏈路:如果有多個鏈路都可以呼叫到本資源,可以指定只記錄某個鏈路上的流量
- 流控效果:
- 快速失敗:直接失敗,丟擲異常
- Warm Up:根據冷載入因子(預設3)的值,從(閾值/冷載入因子)經過預熱時長後才能達到設定的QPS閾值。因為有時系統沒預熱的時候它的QPS達不到那麼高,所以最開始不能放那麼高的閾值的流量進來。
- 排隊等待:多餘請求勻速排隊,讓請求勻速通過,閾值型別必須設定為QPS,否則無效。
降級實戰
Sentinel降級會在調⽤鏈路中某個資源出現不穩定狀態時(例如調⽤超時或異常⽐例升⾼),對這個資源的調⽤進⾏限制,讓請求快速失敗,避免影響到其它的資源⽽導致級聯錯誤。當資源被降級後,在接下來的降級時間窗⼝之內,對該資源的調⽤都⾃動熔斷
慢呼叫比例:
- 最大RT:代表設定一個時間,超過這個時間就認定為慢響應
- 比例閾值:超過多少比例進入熔斷
- 熔斷時長
- 最小請求數:超過最小請求數才能生效
這個版本下好像有bug,比例閾值填不了
異常比例:
異常比例超過0.5就會熔斷
異常數:
異常數超過2就會被熔斷,上面熔斷後,會直接丟擲異常。像下面這樣:
實際應用中,我們需要對異常進行自定義。
3.1 自定義降級異常
使用blockHandler:
@RequestMapping("/testException")
@SentinelResource(value = "/testExceptionTest",blockHandlerClass = SentinelFallback.class,blockHandler = "handleException")
public String testException(){
int i=1/0;
return "ok";
}
public class SentinelFallback {
/**
* 形參最後加入BlockException引數,用於接收異常,方法必須為public static
* @param blockException
* @return
*/
public static String handleException(BlockException blockException){
return "exception";
}
}
使用fallback:
@RequestMapping("/testError")
@SentinelResource(value = "/testErrorTest",fallbackClass = SentinelFallback.class,fallback = "handleError")
public String testError(){
int i=1/0;
return "ok";
}
public class SentinelFallback {
//方法列表需要和原函式一致,或者多一個Throwable型別的引數
public static String handleError(){
return "error";
}
}
fallback和blockHandler的區別:fallback可以處理所有型別的異常,而blockHandler只處理BlockException型別的異常。
3.2 基於Nacos實現Sentinel規則持久化
- 引入依賴
<!-- Sentinel支援採用Nacos作為規則配置資料來源 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
- sentinel中配置Nacos資料來源
spring:
application:
name: resume-nacos-consumer
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080
port: 8719 #sentinel會在該埠啟動http server,那麼這樣的話,控制檯定義的一些限流等規則才能傳送傳遞過來
datasource:
flow: # 名稱是自定義的
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
data-id: ${spring.application.name}-flow-rules
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow # 型別來⾃RuleType類
degrade: # 名稱是自定義的
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
data-id: ${spring.application.name}-degrade-rules
groupId: DEFAULT_GROUP
data-type: json
rule-type: degrade # 型別來⾃RuleType類
- 在Nacos裡面進行配置
配置完後我們發現Sentinel裡面就有了
- 配置說明
所有屬性來⾃原始碼FlowRule類
- resource:資源名稱
- limitApp:來源應⽤
- grade:閾值型別 0 執行緒數 1 QPS
- count:單機閾值
- strategy:流控模式,0 直接 1 關聯 2 鏈路
- controlBehavior:流控效果,0 快速失敗 1 Warm Up 2 排隊等待
- clusterMode:true/false 是否叢集
降級配置規則:
配置檔案: resume-nacos-consumer-degrade-rules
[
{
"resource":"findResumeOpenState",
"grade":2,
"count":1,
"timeWindow":5
}
]
所有屬性來⾃原始碼DegradeRule類
- resource:資源名稱
- grade:降級策略 0 RT 1 異常⽐例 2 異常數
- count:閾值
- timeWindow:時間窗
注意
- ⼀個資源可以同時有多個限流規則和降級規則,所以配置的資料是⼀個json陣列
- Sentinel控制檯中修改規則,僅是記憶體中⽣效,不會修改Nacos中的配置值,重啟後恢復原來的值;而在Nacos控制檯中修改規則,不僅記憶體中⽣效,Nacos中持久化規則也⽣效,重啟後規則依然保持。