【Spring Cloud Alibaba】【Hoxton】Sentinel 入門-限流-降級(一)

1 Nacos 入門-配置中心-集羣
2 Sentinel 入門-限流-降級(一)
3 Sentinel 熱點規則-@SentinelResource-熔斷-持久化(二)
4 Seata從入門到實戰

1 Sentinel 簡介

隨着微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量爲切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。

Sentinel 具有以下特徵:

  • 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的範圍)、消息削峯填谷、集羣流量控制、實時熔斷下游不可用應用等。
  • 完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制檯中看到接入應用的單臺機器秒級數據,甚至 500 臺以下規模的集羣的彙總運行情況。
  • 廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴並進行簡單的配置即可快速地接入 Sentinel。
  • 完善的 SPI 擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展接口。您可以通過實現擴展接口來快速地定製邏輯。例如定製規則管理、適配動態數據源等。

在這裏插入圖片描述

1.1 下載

https://github.com/alibaba/Sentinel/releases/tag/1.7.1

在這裏插入圖片描述

1.2 安裝

#上傳到linux服務器
nohup java -jar sentinel-dashboard-1.7.1.jar >sentinel.log 2>&1 &
#訪問端口8080
http://192.168.0.39:8080
#賬號密碼
sentinel sentinel

在這裏插入圖片描述
在這裏插入圖片描述

2 代碼

2.1 環境準備

192.168.0.39 sentinel nacos

在這裏插入圖片描述

2.2 創建工程

在這裏插入圖片描述

2.3 pom

<dependencies>
    <!--sentinel nacos-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>sentinel-datasource-nacos</artifactId>
    </dependency>
    <!--sentinel-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    <!--spring cloud alibaba-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <!--devtools熱部署-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
        <scope>true</scope>
    </dependency>
</dependencies>

2.4 application.yml

server:
  port: 9004
spring:
  application:
    name: sentinel
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.39:8848
    sentinel:
      transport:
        #配置sentinel地址,端口
        dashboard: 192.168.0.39:8080
        port: 8719
        #客戶端IP
        client-ip: 192.168.0.100

#暴露自己的端點
management:
  endpoints:
    web:
      exposure:
        include: '*'        

2.5 controller

@RestController
@RequestMapping("/flow")
public class FlowLimitController {
    @GetMapping("/a")
    public String a(){
        return "Hello a";
    }
    @GetMapping("/b")
    public String b(){
        return "Hello b";
    }
}

2.6 主啓動類

@EnableDiscoveryClient
@SpringBootApplication
public class SentinelApplication {
    public static void main(String[] args) {
        SpringApplication.run(SentinelApplication.class);
    }
}

2.7 查看結果

(1) 什麼都沒有,sentinel採用懶加載需要訪問接口
在這裏插入圖片描述
(2) 訪問接口

http://localhost:9004/flow/a
http://localhost:9004/flow/b

在這裏插入圖片描述
在這裏插入圖片描述

3 流量控制

流量控制(flow control),其原理是監控應用流量的 QPS 或併發線程數等指標,當達到指定的閾值時對流量進行控制,以避免被瞬時的流量高峯沖垮,從而保障應用的高可用性。
FlowSlot 會根據預設的規則,結合前面 NodeSelectorSlot、ClusterNodeBuilderSlot、StatisticSlot 統計出來的實時信息進行流量控制。
限流的直接表現是在執行 Entry nodeA = SphU.entry(resourceName) 的時候拋出 FlowException 異常。FlowException 是 BlockException 的子類,您可以捕捉 BlockException 來自定義被限流之後的處理邏輯。
同一個資源可以創建多條限流規則。FlowSlot 會對該資源的所有限流規則依次遍歷,直到有規則觸發限流或者所有規則遍歷完畢。
一條限流規則主要由下面幾個因素組成,我們可以組合這些元素來實現不同的限流效果:

resource:資源名,即限流規則的作用對象
count: 限流閾值
grade: 限流閾值類型(QPS 或併發線程數)
limitApp: 流控針對的調用來源,若爲 default 則不區分調用來源
strategy: 調用關係限流策略
controlBehavior: 流量控制效果(直接拒絕、Warm Up、勻速排隊)

3.1 流控模式

(1) 默認模式
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
快速訪問接口時:
在這裏插入圖片描述
(2) 關聯模式
當關聯的資源達到閾值時,就限流自己

例:當接口b達到qps時會使a無法訪問
在這裏插入圖片描述

postman測試:
在這裏插入圖片描述
在這裏插入圖片描述

在postman測試期間訪問a接口:
在這裏插入圖片描述

當postman測試完:
在這裏插入圖片描述
(3) Warm Up
Sentinel的Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即預熱/冷啓動方式。當系統長期處於低水位的情況下,當流量突然增加時,直接把系統拉昇到高水位可能瞬間把系統壓垮。通過"冷啓動",讓通過的流量緩慢增加,在一定時間內逐漸增加到閾值上限,給冷系統一個預熱的時間,避免冷系統被壓垮。warm up冷啓動主要用於啓動需要額外開銷的場景,例如建立數據庫連接等。
默認 coldFactor爲3,即請求QPS從 threshold/3開始,經預熱時長逐漸升至設定的QPS閾值。

配置:a接口5秒後qps會達到10,開始qps爲3 (10/3)
在這裏插入圖片描述
開始快速訪問:
在這裏插入圖片描述
後續快速訪問:
在這裏插入圖片描述
(4) 排隊等待
勻速排隊,讓請求以均勻的速度通過,閥值類型必須設成QPS,否則無效。
設置含義: a接口每秒1次請求,超過的話就排隊等待,等待的超時時間爲5毫秒。
在這裏插入圖片描述

4 降級

4.1 降級規則介紹
在這裏插入圖片描述
(1) RT(平均響應時間,秒級)
平均響應時間,超出閾值且在時間窗口內通過的請求>=5,兩個條件同時滿足後觸發降級,窗口期過後關閉斷路器,RT最大4900(更大的需要通過- Dcspsentinel statistic maxrt=XX才能生效)。

(2) 異常比列(秒級)
QPS>=5且異常比例(秒級統計)超過閾值時,觸發降級;時間窗口結束後,關閉降級

(3)異常數(分鐘級)
異常數(分鐘統計)超過閾值時,觸發降級;時間窗口結束後,關閉降級

4.2 RT

(1) 在controller新建接口

@GetMapping("/c")
public String c(){
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "Hello c";
}

(2) sentinel配置
在這裏插入圖片描述
平均響應時間爲200ms,如果200ms沒有響應並且qps>=5,在未來的1s內,保護該系統。
在這裏插入圖片描述
快速訪問接口c會出現下圖。
解釋:如果超過200ms還未處理完,在未來的1s內請求數大於5個,斷路器打開,服務不可用
在這裏插入圖片描述
1秒後訪問:
在這裏插入圖片描述

4.3 異常比例

(1) 修改controller

@GetMapping("/c")
public String c(){
    int a=5/0;
    return "Hello c";
}

(2) 修改sentinel,要求異常比例只能佔20%並且qps>=5保護該系統。
在這裏插入圖片描述
(3) 測試
在這裏插入圖片描述

4.4 異常數

(1) sentinel修改配置,一分鐘出現5次異常,70s後才能恢復。
在這裏插入圖片描述

(2) 5次後訪問
在這裏插入圖片描述

GITHUB

#分支:Sentinel-release-v1.0  
https://github.com/zhurongsheng666/spring-cloud-alibaba
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章