簡介
1.是什麼
面向雲原生微服務的流量控制、熔斷降級組件,隨着微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel以流量爲切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
2.之前學習的Hystrix
缺點:(1).需要我們程序員自己手工搭建監控平臺
(2).沒有一套web界面可以給我們進行更加細粒度化得配置流控、速率控制、服務熔斷、服務降級。
3.Sentinel優點
(1).單獨一個組件,可以獨立出來
(2).直接界面化的細粒度統一配置。
4.Sentinel 具有以下特徵:
- 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的範圍)、消息削峯填谷、集羣流量控制、實時熔斷下游不可用應用等。
- 完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制檯中看到接入應用的單臺機器秒級數據,甚至 500 臺以下規模的集羣的彙總運行情況。
- 廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴並進行簡單的配置即可快速地接入 Sentinel。
- 完善的 SPI 擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展接口。您可以通過實現擴展接口來快速地定製邏輯。例如定製規則管理、適配動態數據源等。
5.主要特性
6.Sentinel分爲兩個部分:
核心庫不依賴任何框架/庫,能夠運行於所有java運行時環境,同時對Dubbo/Spring Cloud等框架也有較好的支持。
控制檯基於Spring Boot開發,打包後可以直接運行,不需要額外的Tomcat等應用容器。
安裝啓動
1.官網下載:https://github.com/alibaba/Sentinel/releases
sentinel-dashboard-1.7.0.jar
2.運行dos命令,顯示如下,啓動成功。
java -jar sentinel-dashboard-1.7.0.jar
3.輸入地址:http://localhost:8080/#/dashboard
賬號密碼都是sentinel,如下頁面啓動成功。
怎麼用
1.引入pom文件
<!--SpringCloudailibabanacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--SpringCloudailibabasentinel-datasource-nacos後續做持久化用到-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!--SpringCloudailibabasentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.yml文件
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服務註冊中心地址
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel dashboard地址
port: 8719
3.業務代碼
@RestController
@Slf4j
publicclassFlowLimitController
{
@GetMapping("/testA")
publicStringtestA()
{
return"------testA";
}
@GetMapping("/testB")
publicStringtestB()
{
log.info(Thread.currentThread().getName()+"\t"+"...testB");
return"------testB";
}
@GetMapping("/testD")
publicStringtestD()
{
//try{TimeUnit.SECONDS.sleep(1);}catch(InterruptedExceptione) //{e.printStackTrace();}
//log.info("testD測試RT");
log.info("testD異常比例");
intage=10/0;
return"------testD";
}
@GetMapping("/testE")
publicStringtestE()
{
log.info("testE測試異常數");
intage=10/0;
return"------testE測試異常數";
}
@GetMapping("/testHotKey")
@SentinelResource(value="testHotKey",blockHandler="deal_testHotKey")
publicStringtestHotKey(@RequestParam(value="p1",required=false)Stringp1,
@RequestParam(value="p2",required=false)Stringp2)
{
//intage=10/0;
return"------testHotKey";
}
publicStringdeal_testHotKey(Stringp1,Stringp2,BlockExceptionexception)
{
return"------deal_testHotKey,o(╥﹏╥)o";//sentinel系統默認的提示:BlockedbySentinel(flowlimiting)
}
4.啓動訪問
http://localhost:8401/testHotKey
Sentinel控制檯會實時監控
Sentinel控制檯
流量控制
(1)閾值類型
QPS代表每秒請求數量:當調用該api的QPS達到閾值的時候,進行限流。
線程數:當調用該api的線程數達到閾值的時候,進行限流。
效果:
超過閾值,訪問受限
(2)流控模式
直接:api到限流條件時,直接限流
關聯:當關聯的資源到達閾值時,就限流自己
鏈路:只記錄指定鏈路上的流量
利用postman模擬併發密集訪問testB
新增兩次testB
然後點run設置線程數,和延遲時間
點擊un Collection
此時訪問testA,被限制。
流控效果:直接、預熱、排隊等待
直接就是剛纔演示的效果
預熱是:秒殺系統在開啓的瞬間,會有很多流量上來,很有可能把系統打死,預熱方式就是把爲了保護系統,可慢慢的把流量放進來,慢慢的把閾值增長到設置的閾值。
排隊等待就是一個一個過。
(3)降級
RT是平均響應時間:超出閾值且在時間窗口內通過的請求>=5,兩個條件同時滿足後觸發降級,窗口期過後關閉斷路器,RT最大4900
異常比例(秒級):QPS>=5且異常比例超過閾值時,觸發降級;時間窗口結束後,關閉降級。
異常數(分鐘級):異常數超過閾值時,觸發降級;時間窗口結束後,關閉降級。超過閾值,系統知道已經造成損失,所以不能再報錯。
用Jemter做壓力測試。
熱點key
何爲熱點?熱點即經常訪問的數據。很多時候我們希望統計某個熱點數據中訪問頻次最高的Top K數據,並對其訪問進行限制。
從HystrixCommand到@SentinelResource
@SentinelResource(value="testHotKey",blockHandler="deal_testHotKey")
//blockHandler是兜底方法
@SentinelResource//處理的是Sentinel控制配置的違規情況,有blockHandler方法配置的兜底處理;
@SentinelResource//主管配置出錯,運行出錯該走異常走異常。
blockHandlerClass// 指定類名
(4)系統規則
系統保護規則是從應用級別的入口流量控制,從單臺機器的load、CPU使用率、平均RT、入口QPS和併發線程數等幾個維度監控應用指標,讓系統儘可能跑再最大吞吐量的同時保證系統整體的穩定性。
系統保護規則是應用整體維度的,而不是資源維度的,並且僅對入口流量生效。入口流量指的是進入系統規則支持以下的模式:
Load自適應(僅對Linex/Unix-like機器生效):系統的load1作爲啓發指標,進行自適應系統保護。當系統load1超過設定的啓發值,且系統當前的併發線程數超過估算的系統容量時纔會觸發系統保護。系統容量由系統的maxQps *minRt估算得出。設定參考值一般是CPU cores*2.5
CPU usage:當系統CPU使用率超過閾值即觸發系統保護(取值範圍0.0-1.0),比較靈敏。
平均 usage:當系統CPU使用率超過閾值即觸發系統保護,單位是毫秒。
併發線程數:當單臺機器上所有入口流量的併發線程數達到閾值即觸發系統保護。
入口QPS:當單臺機器上所有入口流量的QPS達到閾值即觸發系統保護。
Sentinel規則持久化
一旦我們重啓應用,sentinel規則將消失,生產環境需要將配置規則持久化。
怎麼做?
將限流規則持久化進Nacos保存,只要刷新8401某個rest地址,sentinel控制檯的流控規則就能看到,只要Nacos裏面的配置不刪除,針對8401上的流控規則持續有效。
步驟:
pom文件:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
YML:
sentinel:
transport:
dashboard:localhost:8080#配置Sentineldashboard地址
port:8719
datasource:
ds1:
nacos:
server-addr:localhost:8848
dataId:cloudalibaba-sentinel-service
groupId:DEFAULT_GROUP
data-type:json
rule-type:flow
登錄nacos,新建配置,內容爲:
[
{
"resource": "/rateLimit/byUrl",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
- resource:資源名,即限流規則的作用對象
- limitApp:流控針對的調用來源,若爲 default 則不區分調用來源
- grade:限流閾值類型(QPS 或併發線程數);0代表根據併發數量來限流,1代表根據QPS來進行流量控制
- count:限流閾值
- strategy:調用關係限流策略
- controlBehavior:流量控制效果(直接拒絕、Warm Up、勻速排隊)
- clusterMode:是否爲集羣模式