SpringCloud Alibaba之Sentinel學習

簡介

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:是否爲集羣模式

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章