1.啟動sentinel:
下載jar sentinel-dashboard-1.8.0.jar
使用以下命令直接運行 jar 包(JDK 版本必須≥ 1.8):
java -Dserver.port=9999 -jar D:\sentinel-dashboard-1.8.0.jar
控制臺訪問地址:http://localhost:9999,默認賬號密碼都為 sentinel/sentinel
1.導入依賴:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.在alibaba-user-consumer-8090項目的application.yml編寫代碼
spring:cloud:sentinel:transport:port: 8719 #sentinel控制臺端口dashboard: 127.0.0.1:9999 #sentinel控制臺地址enable: true #開啟sentinel 默認trueeager: true #取消控制臺懶加載 立即初始化
3.監控
這個是實時刷新的,所以點擊網址之后等幾秒就行
2.流量控制
普通流控:
資源名:請求路徑
閾值類型: QPS: 即每秒查詢率, 線程數:用
因為是用手測試,所以選QPS
效果:會顯示429代表 “Too Many Requests”,即 “請求過多”
關聯:(反向關聯):
點擊高級選項
當sout的閾值超過到1時,demo不可用。(吧demo的資源節省出來給sout)
流控效果:
快速失敗:拋異常
方式是默認的流量控制方式,當QPS超過任意規則的閾值后,新的請求就會被立即拒絕,拒絕方
式為拋出 FlowException 。
WarmUp:慢慢增加到閾值
WarmUp 旨在避免因為流量突增或系統負載過高導致的拒絕服務問題。通過“熱身”過程,系統逐步適應流量的增加,避免瞬間流量過載。
通過動態控制請求的通過率(例如,限制請求的通過比例),逐漸放開流量限制,避免系統立即面對過多請求的壓力。
例如,可以設定初始通過率為 20%,然后逐步提升到 100%,這樣系統就能平穩適應流量增長。
排隊等待:勻速排隊處理
排隊等待 是 Sentinel 提供的另一種流量控制策略,用于限制并發請求的數量,并確保在系統負載較高時不會直接拒絕請求,而是讓請求在隊列中等待,直到系統能夠處理它們。
注意:勻速排隊模式暫時不支持 QPS > 1000 的場景
3.熔斷降級:
這里還沒寫熔斷降級的方法,
選項解析:
最大RT:默認毫秒,請求超出時長
比例閾值:: 當每秒請求量>=N(可配置),并且每秒異常總數占通過量的比值超過閾值之后,進入降級狀
態。取值范圍[0.0,1.0] 代表0%-100%(如:設置為0.2,如果請求異常數超過20%則進入降級)
最小請求數:請求數小于該值時即使異常比率超出閾值也不會熔斷
熔斷策略:
1.慢調用比例:
當單位統計時長
( statIntervalMs )內請求數目大于設置的最小請求數目,并且慢調用的比例大于閾值,則接
下來的熔斷時長內請求會自動被熔斷降級。
2.異常比例:
請求異常數超過0.2(20%)就降級
3.異常數:
當單位統計時長內的異常數目超過閾值之后會自動進行熔斷。經過熔斷
時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯
誤)則結束熔斷,否則會再次被熔斷。
4.熱點參數限流:
熱點參數限流例子:比如說id為3的商品特別火爆,需要進行限流,但是其他id的商品一般不需要限流
資源名:需要在consumer中的方法上設置@SentinelResource注解
參數索引:就是第幾個參數,從0開始
單機閾值:就是正常情況下允許的點擊量
限流閾值:就是限流情況下允許的點擊量
5.@SentinelResource
@SentinelResource 用于定義資源,并提供可選的異常處理和 fallback 配置項。 @SentinelResource
注解包含以下屬性:
value:資源名稱,必需項(不能為空)
entryType:entry 類型,可選項(默認為 EntryType.OUT)
blockHandler / blockHandlerClass: blockHandler 對應處理 BlockException 的函數名稱,可
選項。blockHandler 函數訪問范圍需要是 public,返回類型需要與原方法相匹配,參數類型需要
和原方法相匹配并且最后加一個額外的參數,類型為 BlockException。blockHandler 函數默認需
要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 blockHandlerClass 為對應的
類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
fallback:fallback 函數名稱,可選項,用于在拋出異常的時候提供 fallback 處理邏輯。fallback
函數可以針對所有類型的異常(除了 exceptionsToIgnore 里面排除掉的異常類型)進行處理。
fallback 函數簽名和位置要求:
返回值類型必須與原函數返回值類型一致;
方法參數列表需要和原函數一致,或者可以額外多一個 Throwable 類型的參數用于接收對應的異
常。
fallback 函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定
fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
defaultFallback(since 1.6.0):默認的 fallback 函數名稱,可選項,通常用于通用的 fallback
邏輯(即可以用于很多服務或方法)。默認 fallback 函數可以針對所以類型的異常(除了
exceptionsToIgnore 里面排除掉的異常類型)進行處理。若同時配置了 fallback 和
defaultFallback,則只有 fallback 會生效。defaultFallback 函數簽名要求:
返回值類型必須與原函數返回值類型一致;
方法參數列表需要為空,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常。
defaultFallback 函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定
fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
exceptionsToIgnore(since 1.6.0):用于指定哪些異常被排除掉,不會計入異常統計中,也不會
進入 fallback 邏輯中,而是會原樣拋出
fallback屬性:
因為使用熱點參數限流以后如果超了閾值就會報500,ParamFlowException異常,所以我們要處理這個異常
注意:
- fallback 方法可以在同一個類中定義,也可以在其他類中定義。如果在其他類中定義,則需要通過 fallbackClass 屬性指定該類
- 返回類型:fallback 方法的返回類型必須與被保護的方法相同
- fallback 方法應該為 public,以便 Sentinel 框架能夠調用它
- 參數列表:fallback 方法可以有以下幾種參數組合:不帶參數。只有一個 Throwable 類型的參數,用于接收捕獲到的異常。包含原始方法的所有參數和一個 Throwable 類型的參數。
@SentinelResource(value = "demo",fallback = "fallback")@GetMapping("/demo")public ResultAJAX demo(Integer id) {System.out.println("這是方法demo——————————————————————————————"+id);return ResultAJAX.success();}public ResultAJAX fallback(Integer id) {return ResultAJAX.error("這是方法fallback,用來解決ParamFlowException異常");}
這樣就不會直接報500,而是報我們自定義設置的message
blockHandler屬性:
blockHandler 對應處理 BlockException 的函數名稱,可選項。blockHandler 函數訪問范圍需要是 public,返回類型需要與原方法相匹配,參數類型需要 和原方法相匹配并且最后加一個額外的參數,類型為 BlockException。blockHandler 函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 blockHandlerClass 為對應的 類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
ParamFlowException 熱點參數異常
DegradeException熔斷降級異常
FlowException流控異常處理
@SentinelResource(value = "demo",blockHandler = "blockHandler")//@GetMapping("/demo")public ResultAJAX demo(Integer id) {System.out.println("這是方法demo——————————————————————————————"+id);return ResultAJAX.success();}public ResultAJAX blockHandler(Integer id, BlockException e) {//異常類型判斷//流控異常if (e instanceof FlowException) {return ResultAJAX.error("ParamFlowException異常流控異常處理");}//熔斷降級異常處理if (e instanceof DegradeException) {return ResultAJAX.error("熔斷降級處理");}//熱點參數異常if (e instanceof ParamFlowException) {return ResultAJAX.error("ParamFlowException異常流控異常處理");}return ResultAJAX.error("系統異常"+id);}
6.基于nacos配置中心進行規則持久化:
sentinel利用nacos做持久化,然后nacos再做持久化
<!--sentinel利用nacos做持久化-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
流量控制配置:
spring:cloud:sentinel:datasource:ds1:nacos:server-addr: 127.0.0.1:8848 #nacos地址data-id: ${spring.application.name}-flow#naocs中配置文件名稱,對應服務名,可隨意填寫(和配置中文文件一致即可)group-id: DEFAULT_GROUP #文件分組data-type: json #使用json格式rule-type: flow #使用flow限流
在配置中心配置:
流量控制,熱點參數,熔斷降級配置:
resource:資源名稱
limitApp:來源應用
grade:閾值類型,0表示線程數,1表示QPS
count:單機閾值
strategy:流控模式,0表示直接,1表示關聯,2表示鏈路
controlBehavior:流控效果,0表示快速失敗,1表示Warm Up,2表示排隊等待
clusterMode:是否集群
nacos-consume-flow配置:限流配置
[
{
"resource": "demo",
"limitApp": "default",
"grade": 1,
"count": 2,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
bill-consumer-degrade配置:熔斷降級
[
{
"resource": "abc",
"grade": 0,
"count": 2,
"timeWindow": 1,
"minRequestAmount": 1,
"statIntervalMs": 5
}
]
bill-consumer-7790-param-flow 配置:熱點參數限流配置
[
{
"resource": "abc",
"paramIdx": 0,
"count": 10,
"burst": 5,
"duration": 1,
"controlBehavior": 0,
"maxQueueingTimeMs": 500
}
]
yml配置:
spring:application:name: nacos-consumecloud:sentinel:transport:port: 8719 #sentinel控制臺端口dashboard: 127.0.0.1:9999 #sentinel控制臺地址enable: true #開啟sentinel 默認trueeager: true #取消控制臺懶加載 立即初始化datasource:ds1: #限流配置nacos:server-addr: 127.0.0.1:8848 #nacos地址data-id: "${spring.application.name}-flow" #naocs中配置文件名稱,對應服務名,可隨意填寫(和配置中文文件一致即可)group-id: DEFAULT_GROUP #文件分組data-type: json #使用json格式rule-type: flow #使用flow限流ds2: #熔斷降級配置nacos:server-addr: 127.0.0.1:8848data-id: "${spring.application.name}-degrade"group-id: DEFAULT_GROUPdata-type: jsonrule-type: degrade #指定為熔斷降級規則ds3: #熱點參數限流配置nacos:server-addr: 127.0.0.1:8848data-id: "${spring.application.name}-param-flow"group-id: DEFAULT_GROUPdata-type: jsonrule-type: param-flow
能夠在sentinel里面看到持久化的