SpringCloud11 -- Alibaba Sentinel

蘇 jsu發表於2020-12-01

Sentinel

簡介

簡單來講 實現降級、熔斷與限流,就是Hystrix

在這裡插入圖片描述

Sentinel 是什麼?

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

Sentinel 具有以下特徵:

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

Sentinel 的主要特徵:

在這裡插入圖片描述

Sentinel 的開源生態:

在這裡插入圖片描述

安裝

windows

  1. 下載sentinel的jar包

  2. 執行sentinel

    ​ 由於是一個jar包,所以可以直接java -jar執行

    ​ 注意,預設sentinel佔用8080埠

  3. 訪問sentinel http://localhost:8080/#/login

    帳號密碼都是sentinel

在這裡插入圖片描述

整合專案

執行nacos 訪問http://localhost:8848/nacos

在這裡插入圖片描述

新建專案cloud-alibaba-sentinel-service8401

pom


    <dependencies>
        <!-- SpringCloud ailibaba nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- SpringCloud ailibaba sentinel-datasource-nacos 持久化需要用到-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <!-- SpringCloud ailibaba sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency><!-- 引用自己定義的api通用包,可以使用Payment支付Entity -->
            <groupId>com.jsu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </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-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

yml

server:
  port: 8401
spring:
  application:
    name: cloud-alibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服務註冊中心地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址
        port: 8719
management:
  endpoints:
    web:
      exposure:
        include: '*'

啟動類

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

controller

@RestController
@Slf4j
public class FlowLimitController {

    @GetMapping("/testA")
    public String testA()
    {
        return "------testA";
    }

    @GetMapping("/testB")
    public String testB()
    {
        log.info(Thread.currentThread().getName()+"\t"+"...testB");
        return "------testB";
    }
}

執行8401 重新整理http://localhost:8080/ 發現空空如也

在這裡插入圖片描述

實時監控

Sentinel是懶載入 需要訪問8401的服務
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

觸點鏈路

表示有兩個訪問路口 /favicon.ico屬於專案圖示的顯示
在這裡插入圖片描述

流控規則

在這裡插入圖片描述

  • 資源名: 唯一名稱,預設請求路徑

  • 針對來源: Sentinel可以針對呼叫者進行限流,填寫微服務名,預設default (不區分來源)

  • 閾值型別/單機閾值:

    • QPS(每秒鐘的請求數量):當呼叫該api的QPS達到閾值的時候,進行限流。
    • 執行緒數: 當呼叫該api的執行緒數達到閾值的時候,進行限流
  • 是否叢集:不需要叢集

  • 流控模式:

    • 直接: api達到限流條件時,直接限流
    • 關聯: 當關聯的資源達到閾值時,就限流自己
    • 鏈路: 只記錄指定鏈路上的流量(指定資源從入口資源進來的流量,如果達到閾值,就進行限流) 【api級別的針對來源】
  • 流控效果:

    • 快速失敗: 直接失敗,拋異常
    • Warm Up: 根據codeFactor(冷載入因子,預設3)的值,從閾值/codeFactor,經過預熱時長,才達到設定的QPS閾值
    • 排隊等待: 勻速排隊,讓請求以勻速的速度通過,閾值型別必須設定為QPS,否則無效

流控模式

直接

新增監控 QPS

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

測試當快速重新整理時候 報錯 新增時候設定為每秒一次如果超出 直接快速失敗
在這裡插入圖片描述

問題

報錯顯示的是預設的資訊 能不能有自己的獨特的資訊 或者進行後續的處理方法 能不能像fallback一樣的兜底方法

新增監控 執行緒數

在這裡插入圖片描述

狂點後 沒有變化

在這裡插入圖片描述

QPS和執行緒數區別:

  • QPS:每秒鐘的訪問請求數量,狂點http://localhost:8401/testA 那麼就會超過QPS的閾值 報錯
  • 執行緒數: 當每秒鐘的訪問請求執行緒的數量,如果同一個執行緒 可以每秒訪問無數次. 兩個網頁 同時訪問http://localhost:8401/testB 那麼就會超過執行緒數的閾值 報錯

關聯

在這裡插入圖片描述

新建postman

建立collection
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

執行的途中 去訪問testA

在這裡插入圖片描述

在這裡插入圖片描述

結果: testB 超過閾值1 testA掛了 testB無事…

應用場景: 比如支付介面達到閾值,就要限流下訂單的介面,防止一直有訂單

鏈路:

多個請求呼叫同一個微服務

流控效果

快速失敗

在這裡插入圖片描述

預熱

公式: 閾值除以coldFactor(預設為3) 經過預熱時長後才會達到閾值

Warm Up ( RuleConstant.CONTROL_BEHAVIOR_AARA_uP)方式,即預熱/冷啟動方式。當系統長期處於低水位的情況下,當流量突然增加時,直接把系統拉昇到高水位可能瞬間把系統壓垮。通過"冷啟動"”,讓通過的流量緩慢增加,在一定時間內逐漸增加到閾值上限,給冷系統一個預熱的時間,避免冷系統被壓垮。

​ 預設coldFactor為3,即請求QPS從threshold/3開始,經預熱時長逐漸升至設定的QPS閾值。

新建流控

在這裡插入圖片描述

測試:狂擊 剛開始報錯 5s後 恢復正常(手速限定在每秒10次以內)

排隊等待

核心 : 勻速排隊 閾值必須是qbs
在這裡插入圖片描述

測試
在這裡插入圖片描述

降級規則

就是降級熔斷

沒有半開的狀態 就是系統自動檢測異常 沒有異常關閉斷路器回覆使用,有異常繼續開啟斷路器不可用.

sentinel 要不關閉要不開啟

RT(平均響應時間,秒級)

平均響應時間超出閾值且在時間視窗內通過的請求>=5,兩個條件同時滿足後觸發降級

視窗期過後關閉斷路器

RT最大4900(更大的需要通過-Dcsp.sentinel.statistic.max.rt=XXXX才能生效)

在這裡插入圖片描述

新建

200毫秒內解決 解決就ok 解決不了就開啟斷路器
在這裡插入圖片描述
在這裡插入圖片描述

Jmeter 1秒鐘10個執行緒 每次請求10s

在這裡插入圖片描述

上述配置:

​ 永遠的1秒鐘打進10個執行緒(大於5個) 呼叫testD 我們希望200毫秒內完成本次處理任務,如果超過200毫秒還沒處理完,在未來的1秒鐘的時間視窗內 斷路器開啟 (保險絲跳閘)微服務不可用 保險絲跳閘斷電了.

但是java程式碼 睡眠1s

在這裡插入圖片描述

當關閉jmeter 時候 回覆正常

異常比列(秒級)

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

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

單獨訪問一次,必然來一次報錯一次(int age =10/0) 調一次錯一次

jmeter
在這裡插入圖片描述

開啟jmeter後,直接高併發傳送請求,多次呼叫達到我們的配置條件了。斷路器開啟(保險絲跳閘),微服務不可用了,不再報錯error而是服務降級了。

在這裡插入圖片描述

異常數(分鐘級)

異常數(分鐘統計)超過閾值時,觸發降級;時間視窗結束後,關閉降級
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
http://localhost:8401/testE,第一次訪問絕對報錯,因為除數不能為零,我們看到error視窗,但是達到5次報錯後,進入熔斷後降級。

熱點規則

之前的案例,當限流出現問題的時候,使用的是sentinel系統預設的提示, Blocked by Sentinel(flow limiting)

熱點規則類似於hystrix 當某個方法出現問題的時候,找到對應的兜底降級的方法。

結論:從@HystrixCommand到@SentinelSourece

簡單使用

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

配置熱點規則

含義:第0個引數一秒內點選一次

在這裡插入圖片描述

發現 當每秒點選一次的時候 正常顯示 當點選速度加快的時候 降級處理,使用兜底方法

在這裡插入圖片描述

當取消blockHandler時候 sentinel熱點規則還是原來的
在這裡插入圖片描述
發現 當每秒點選一次的時候 正常顯示 當點選速度加快的時候 跳轉error page
在這裡插入圖片描述
注意: 因為設定是第一個引數 所以當url的引數是第二個時候 狂點選 也不會跳轉其他頁面
在這裡插入圖片描述

在這裡插入圖片描述

例外項

前提條件 :引數型別必須是基本資料型別或者String
在這裡插入圖片描述
在這裡插入圖片描述
狂擊後 還是正常訪問
在這裡插入圖片描述

注意

當新增執行時異常的時候!!
在這裡插入圖片描述在這裡插入圖片描述

  • @SentinelResource
    處理的是Sentinel控制檯配置的違規情況,有blockHandler方法配置的兜底處理;
  • RuntimeException
    int age = 10/0,這個是java執行時報出的執行時異常RunTimeException,@SentinelResource不管
  • 總結
    @SentinelResource主管配置出錯,執行出錯該走異常走異常

系統規則

熱點規則是對於某個url進行限流,系統規則是對於整個專案進行限流

​ 系統保護規則是從應用級別的入口流量進行控制,從單臺機器的load、CPU使用率、平均RT、入口QPS併發執行緒數等幾個維度監控應用指標,讓系統儘可能跑在最大吞吐量的同時保證系統整體的穩定性。
​ 系統保護規則是應用整體維度的,而不是資源維度的,並且僅對入口流量生效。入口流量指的是進入應用的流量( EntryType.IN ),比如Web服務或Dubbo服務端接收的請求,都屬於入口流星。

系統規則支援以下的模式:

  • Load自適應(僅對Linux/Unix-like機器生效):系統的 load1作為啟發指標,進行自適應系統保護。當系統load1超過設定的啟發值,且系統當前的併發執行緒數超過估算的系統容量時才會觸發系統保護(BBR階段)。系統容量由系統的maxQps * minRt估算得出。設定參考值一般是CPu cores * 2.5。

  • CPU usage (1.5.0+版本)︰當系統CPU使用率超過閾值即觸發系統保護(取值範圍0.0-1.o) ,比較靈敏。

  • 平均RT:當單臺機器上所有入口流星的平均RT達到閾值即觸發系統保護,單位是毫秒。·併發執行緒數:當單臺機器上所有入口流量的併發執行緒數達到閾值即觸發系統保護。

  • 入口QPS:當單臺機器上所有入口流是的QPS達到閾值即觸發系統保護。

在這裡插入圖片描述

狂訪問http://localhost:8401/testA 對於其他的請求也一樣
在這裡插入圖片描述

@SentinelResource

按照資源限流

8401新增controller
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

狂刷 降級處理 使用兜底方法
在這裡插入圖片描述

當關閉8401服務的時候,發現流控規則沒有了 證明是臨時

在這裡插入圖片描述

訪問URL限流

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

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

當@SentinelResource註解中沒有blockHandler的時候 那麼當限流時候 返回Sentinel自帶預設的限流頁面

自定義限流邏輯

新建hanler類

public class CustomerBlockHandler
{
    public static CommonResult handlerException(BlockException exception)
    {
        return new CommonResult(4444,"按客戶自定義,global handlerException----1");
    }
    public static CommonResult handlerException2(BlockException exception)
    {
        return new CommonResult(4444,"按客戶自定義,global handlerException----2");
    }
}

在這裡插入圖片描述
在這裡插入圖片描述
在controller中,指定使用自定義類中的方法作為降級方法

在這裡插入圖片描述

Sentinel中定義流控規則:這裡資源名,是以url指定,也可以使用@SentinelResource註解value的值指定

在這裡插入圖片描述

測試:
在這裡插入圖片描述

整體
在這裡插入圖片描述

其他屬性

在這裡插入圖片描述

服務熔斷

sentinel整合ribbon+openfeign+fallback

搭建基本專案

新建cloud-alibaba-provider-payment9003/9004

pom

 <dependencies>
        <dependency>
            <groupId>com.jsu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- SpringCloud ailibaba nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</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-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

yml

server:
  port: 9003
spring:
  application:
    name: nacos-payment-provider

  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: "*"

啟動類

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

業務邏輯程式碼

@RestController
@Slf4j
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;
    public static HashMap<Long,Payment> hashMap = new HashMap<Long, Payment>();
    static {
        hashMap.put(1L,new Payment(1L,"28r2e85asd15a6sd32d"));
        hashMap.put(2L,new Payment(2L,"878asd4878ax7sa5cva"));
        hashMap.put(3L,new Payment(3L,"56asd46casgf4g6vfs5"));
    }
    @RequestMapping(value = "/paymentSQl/{id}")
    public CommonResult<Payment> paymentSQl(@PathVariable("id") Long id){
        Payment payment = hashMap.get(id);
        CommonResult<Payment> result = new CommonResult<>(200, "from mysql,ServerPort:" + serverPort);
        return result;
    }
}

新建cloud-alibaba-nacos-consumer-order84

pom

 <dependencies>
        <!-- SpringCloud ailibaba nacos-->
        <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>

        <!-- SpringCloud ailibaba sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency><!-- 引用自己定義的api通用包,可以使用Payment支付Entity -->
            <groupId>com.jsu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </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-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

yml

server:
  port: 84

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719


# 消費者將要去訪問的微服務名稱(註冊成功進入nacos的微服務提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

啟動類

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

配置類

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

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

Ribbon

84服務新增controller

@RestController
@Slf4j
public class CircleBreakerController {
    @Value("${service-url.nacos-user-service}")
    public String SERVICE_URL;

    @Autowired
    private RestTemplate restTemplate;

    // ===================== ribbon =======================
    @RequestMapping("/consumer/fallback/{id}")
    @SentinelResource(value = "fallback") //沒有配置
    // @SentinelResource(value = "fallback",fallback = "handlerFallback")// fallback只負責業務異常
    // @SentinelResource(value = "fallback",blockHandler = "blockHandler") // blockHandler只負責sentinel控制檯的違規
    // @SentinelResource(value = "fallback",fallback = "handlerFallback",
    //         blockHandler = "blockHandler",exceptionsToIgnore = {IllegalArgumentException.class})
    public CommonResult<Payment> fallback(@PathVariable Long id){
        CommonResult<Payment> result = restTemplate.getForObject(SERVICE_URL+"/paymentSQl/"+id,CommonResult.class,id);
        if (id == 4L){
            throw new IllegalArgumentException ("IllegalArgumentException,非法引數異常....");
        }else if(result.getData() == null){
            throw new NullPointerException("NullPointerException,該id沒有對應記錄,空指標異常");
        }
        return result;
    }
    //本例是fallback
    public CommonResult handlerFallback(@PathVariable Long id, Throwable e) {
        Payment payment = new Payment(id,"null");
        return new CommonResult<>(444,"兜底異常handlerFallback,exception內容  "+e.getMessage(),payment);
    }
    //本例是blockHandler
    public CommonResult blockHandler(@PathVariable  Long id, BlockException blockException) {
        Payment payment = new Payment(id,"null");
        return new CommonResult<>(445,"blockHandler-sentinel限流,無此流水: blockException  "+blockException.getMessage(),payment);
    }
}

訪問84服務 實現負載均衡
在這裡插入圖片描述
在這裡插入圖片描述

業務異常

在84的controller設定 如果id傳值為4 丟擲非法引數異常 傳非1 2 3 4丟擲空指標異常
在這裡插入圖片描述

在這裡插入圖片描述

使用fallback fallback負責業務異常
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

控制檯配置違規

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

在這裡插入圖片描述

兩者都存在

在這裡插入圖片描述

當1s一次 訪問http://localhost:84/consumer/fallback/4 服務降級 使用fallback方法

在這裡插入圖片描述

當狂擊的時候 服務限流 使用blockHandler方法

在這裡插入圖片描述

exceptionsToIgnore

如果有exceptionsToIgnore等於的異常 那麼不再有fallback方法兜底 沒有降級效果

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

OpenFeign

修改84專案

新增pom

  <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

新增yml

feign:
  sentinel:
    enabled: true

啟動類

@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients

業務邏輯程式碼

@FeignClient(value = "nacos-payment-provider",fallback =PaymentFallbackImpl.class)
public interface PaymentService {
    // value對應9003/9004的請求路徑
    @GetMapping(value = "/paymentSQl/{id}")
    public CommonResult<Payment> paymentSQL(@PathVariable("id")Long id);
}


@Component
public class PaymentFallbackImpl implements PaymentService{
    @Override
    public CommonResult<Payment> paymentSQL(Long id) {
        return new CommonResult<>(44444,"服務降級返回,----- PaymentFallbackService",new Payment(id,"errorSerial...."));
    }
}

controller

    //================== OpenFeign ==================
    @Autowired
    private PaymentService paymentService;

    @GetMapping(value = "/consumer/paymentSQL/{id}")
    public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id) {
        return paymentService.paymentSQL(id);
    }

測試

在這裡插入圖片描述

當關閉9003和9004服務以後
在這裡插入圖片描述

熔斷框架比較

在這裡插入圖片描述

持久化

修改8401專案

pom

  <!-- 持久化 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

yml

spring:
  application:
    name: cloud-alibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服務註冊中心地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址
        port: 8719
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: cloud-alibaba-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: 來源應用
// grade: 閾值型別 0表示執行緒數 1表示qps
// count: 單機閾值
// strategy: 流控模式 0表示直接 1表示關聯 2 表示鏈路
// controlBehavior: 流控效果 0快速失敗 1warm up 2排隊等待
// clusterMode: 是否叢集

測試在這裡插入圖片描述

在這裡插入圖片描述

關機後 流控規則沒了

在這裡插入圖片描述

重啟後 狂刷http://localhost:8401/rateLimit/byUrl 流控規則又出現了
在這裡插入圖片描述

相關文章