SpringCloud使用Sentinel,Sentinel持久化,Sentinel使用nacos持久化

邢帅杰發表於2024-08-02
Sentinel官方文件:https://sentinelguard.io/zh-cn/docs/introduction.html
下載Sentinel:https://github.com/alibaba/Sentinel/releases
sentinel控制檯文件:https://sentinelguard.io/zh-cn/docs/dashboard.html
參考:https://www.cnblogs.com/ralgo/p/14152390.html
啟動Sentinel命令:java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar E:\download\sentinel-dashboard-1.8.8.jar
可以自由指定Sentinel埠,不指定直接啟動預設就是8080,命令:java -jar E:\download\sentinel-dashboard-1.8.8.jar
瀏覽器訪問 http://localhost:8080,登入賬號密碼都是sentinel

基於之前的示例專案:https://www.cnblogs.com/xsj1989/p/18334504
父專案pom中引入依賴
<!--父pom管理的依賴-->
    <dependencyManagement>
        <dependencies>
            <!--Sentinel是Spring Cloud Alibaba提供的一個專門用於服務容錯、服務熔斷、服務限流的微服務元件-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
                <version>2023.0.1.2</version>
            </dependency>
            <!--sentinel持久化依賴,採用Nacos作為規則配置資料來源。-->
            <dependency>
                <groupId>com.alibaba.csp</groupId>
                <artifactId>sentinel-datasource-nacos</artifactId>
                <version>1.8.8</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
子Module服務專案中pom引入依賴
        <!--Sentinel是Spring Cloud Alibaba提供的一個專門用於服務容錯、服務熔斷、服務限流的微服務元件-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--sentinel持久化依賴,採用Nacos作為規則配置資料來源。-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

子Module服務專案中bootstrap.yaml配置Sentinel,紅色部分為新增的Sentinel配置。

server:
  port: 8001 # 服務埠號,與application.yaml中的一致。
spring:
  application:
    name: cloud-order-service # cloud-order-service-dev.yaml
  profiles:
    active: dev # 環境配置 test dev pro
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos作為服務中心地址
      config:
        server-addr: localhost:8848 # Nacos作為配置中心地址
        file-extension: yaml # Nacos配置字尾
        group: DEFAULT_GROUP # Nacos配置分組
        namespace: public # Nacos配置名稱空間
      username: nacos
      password: 123456
    sentinel:
      transport:
        web-context-unify: false # 預設true 將呼叫鏈路收斂, 導致鏈路流控效果無效
        dashboard: localhost:8080 # 配置sentinel dashboard地址,監控專案埠8001
        port: 8719 # 預設8719埠,如果被佔用,則從8719遞增檢查未被佔用的埠
      # sentienl 資料來源配置 原文連結:https://blog.csdn.net/qq_42402854/article/details/127379403
      datasource:
        nacos-flow-rule1: # 自定義資料來源名稱,可以隨便定義,保持唯一,可以配置多個,目的是為了區分出每條規則,無實際應用。
          nacos:
            server-addr: localhost:8848 # nacos地址
            username: nacos # nacos賬戶
            password: 123456 # nacos密碼
            namespace: 8e23ce60-9f28-4fa7-875a-5e0d61b533d5 # nacos名稱空間必須使用id
            dataId: cloud-order-service-flow # Nacos建立的配置DataId
            rule-type: flow # 規則型別 flow:流控規則;
            data‐type: json # 預設值json,可以不填。
feign:
  sentinel:
    enabled: true

Controller對應的程式碼

//@SentinelResource(value = "TestController.getStu", blockHandler = "dealGetStu")
    //@SentinelResource(value = "TestController.getStu", blockHandler = "dealGetStu",blockHandlerClass = CustomerBlockHandler.class)
    @SentinelResource(value = "cloud-order-service-TestController-getStu", fallback = "getStu", fallbackClass = CustomerFallback.class)
    @GetMapping("/getStu")
    public StuDto getStu() {
        return new StuDto() {{
            setAge(23);
            setName("jay111");
            setSn("111111");
        }};
    }
    //sentinel限流處理
    public static StuDto dealGetStu(BlockException ex) {
        return new StuDto() {{
            setAge(12);
            setName("TestController.dealGetStu");
            setSn("TestController.dealGetStu");
        }};
    }
    //@SentinelResource(value = "cloud-order-service-TestController-queryStu", blockHandlerClass = CustomerBlockHandler.class, blockHandler = "dealQueryStu")
    //@SentinelResource(value = "cloud-order-service-TestController-queryStu", blockHandler = "dealQueryStu")
    @SentinelResource(value = "cloud-order-service-TestController-queryStu", fallback = "queryStu", fallbackClass = CustomerFallback.class)
    @PostMapping("/queryStu")
    public StuDto queryStu(@RequestBody StuDto dto) {
        return new StuDto() {{
            setAge(dto.getAge());
            setName("George111");
            setSn("111111");
        }};
    }
    //sentinel限流處理
    public static StuDto dealQueryStu(StuDto dto, BlockException ex) {
        return null;
    }

@SentinelResource的屬性說明
==value==:作用指定資源名稱,必填
==entryType==:entry型別,標記流量的方向,指明是出口流量,還是入口流量;取值 IN/OUT ,預設是OUT。非必填
==blockHandler==:處理BlockException的函式名稱,函式要求為 必須是public 返回型別與原方法一致 引數型別需要和原方法相匹配,並在最後加上BlockException型別的引數 預設需和原方法在同一個類中,如果希望使用其他類的函式,可配置blockHandlerClass,並指定blockHandlerClass裡面的方法
==blockHandlerClass==:存放blockHandler的類。對應的處理函式必須static修飾,否則無法解析。函式要求為: 必須是public 返回型別與原方法一致 引數型別需要和原方法相匹配,並在最後加上BlockException型別的引數
==fallback==:用於在丟擲異常的時候提供fallback處理邏輯。fallback函式可以針對所有型別的異常(除了execptionsToIgnore 裡面排除掉的異常型別)進行處理,函式要求為: 返回型別與原方法一致 引數型別需要和原方法相匹配,Sentinel 1.6版本之後,也可在方法最後加上Throwable型別的引數 預設需和原方法在同一個類中,若希望使用其他類的函式,可配置fallbackClass,並指定fallbackClass裡面的方法
==fallbackClass==:存放fallback的類。對應的處理函式必須static修飾,否則無法解析,其他要求:同fallback。
==defaultFallback==:用於通用的 fallback 邏輯。預設fallback函式可以針對所有型別的異常(除了 exceptionsToIgnore 裡面排除掉的異常型別)進行處理。若同時配置了 fallback 和 defaultFallback,以fallback為準。函式要求: 返回型別與原方法一致 方法引數列表為空,或者有一個Throwable型別的引數 預設需要和原方法在同一個類中,若希望使用其他類的函式,可配置fallbackclass,並指定fallbackClass裡面的方法。
==exceptionsToIgnore==:指定排除掉哪些異常。排除的異常不會計入異常統計,也不會進入fallback邏輯,而是原樣丟擲
==exceptionsToTrace==:需要trace的異常

Nacos新增配置,
名稱空間:8e23ce60-9f28-4fa7-875a-5e0d61b533d5
Data Id:cloud-order-service-flow
配置格式:JSON
配置內容:如下

[
  {
    "resource": "cloud-order-service-TestController-getStu",
    "controlBehavior": 0,
    "count": 1,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0,
    "clusterMode": false
  },
  {
    "resource": "cloud-order-service-TestController-queryStu",
    "controlBehavior": 0,
    "count": 1,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0,
    "clusterMode": false
  }
]

Sentinel是懶載入,發起一次請求,再重新整理Sentinel控制檯就可以看到流控規則。
參考:https://blog.csdn.net/u022812849/article/details/131206976
https://blog.csdn.net/qq_42402854/article/details/127379403
https://www.jb51.net/program/284986jxr.htm
https://www.zhihu.com/question/482422308/answer/3384468058
https://zhuanlan.zhihu.com/p/681044230

相關文章