天天看點

spring cloud Alibaba——02 Sentinel

目錄标題

    • 一、安裝Sentinel
    • 二、Sentinel入門案例
      • 1、導入pom
      • 2、改yml
      • 3、主啟動類
      • 4、測試類
      • 5、設定斷路規則(核心)
    • 三、配置斷路規則
      • 1、斷路規則配置分類
      • 2、規則的種類
        • 2.1、流量控制規則 (FlowRule)
        • 2.2、熔斷降級規則 (DegradeRule)
        • 2.3、系統保護規則 (SystemRule)
        • 2.4、Sentinel熱點key(`常用`)
    • 四、注解@SentinelResource
      • 1、value
      • 2、entryType:
      • 3、blockHandler / blockHandlerClass: (違反斷路規則觸發)
      • 4、fallback:(請求異常觸發)
      • 5、defaultFallback(since 1.6.0):
      • 6、exceptionsToIgnore(since 1.6.0):
    • 五、持久化Sentinel斷路規則
      • 3、到nacos配置一個斷路規則
      • 4、通過注解綁定請求
      • 5、如何編寫配置
    • 六、Sentinel整合負載均衡
      • 1、導入pom
      • 2、改yml
      • 3、主啟動類
      • 4、業務層
      • 5、控制層
      • 6、測試

如果不具備nacos的知識,推薦先看:spring cloud Alibaba——01 Nacos

一、安裝Sentinel

  1. 下載下傳位址:https://github.com/alibaba/Sentinel/releases
  2. 終端運作Sentinel
# 在jar包所在目錄,cmd進入終端
java -jar sentinel-dashboard-1.8.2.jar
           
  1. 通路:http://localhost:8080/

    預設登入賬号、密碼:sentinel、sentinel

  2. 成功頁面
    spring cloud Alibaba——02 Sentinel

注意:Sentinel使用的是懶加載。當被監控的請求,第一次通路後才會被Sentinel記錄下來。

二、Sentinel入門案例

官方文檔:https://sentinelguard.io/zh-cn/docs/flow-control.html

Sentinel的使用可以分為三步:

  1. 定義資源
  2. 定義規則
  3. 檢驗規則是否生效

我們說的資源,可以是任何東西,服務,服務裡的方法,甚至是一段代碼。使用 Sentinel 來進行資源保護,主要分為幾個步驟:

先把可能需要保護的資源定義好,之後再配置規則。也可以了解為,隻要有了資源,我們就可以在任何時候靈活地定義各種流量控制規則。在編碼的時候,隻需要考慮這個代碼是否需要保護,如果需要保護,就将之定義為一個資源。

1、導入pom

注意:本文的所有pom依賴的版本控制,都是基于父項目的。通過父項目,統一管理版本,避免依賴沖突。

父項目pom依賴:

<dependencyManagement>
    <dependencies>
        <!--spring boot 2.2.2-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.2.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--spring cloud Hoxton.SR1-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--spring cloud alibaba 2.1.0.RELEASE-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.1.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
           

子項目依賴:

<dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合Web元件 -->
        <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>
        <!--SpringCloud ailibaba sentinel-datasource-nacos 因為Sentinel的斷路規則配置是一次性的,
        Sentinel server重新開機後配置就會丢失,所有需要持久化用到nacos 的配置中心-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel,這個配置可能會導入失敗,可以更改版本号試試。注意使用2.1.x -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
    </dependencies>
           

2、改yml

server.port=8001
spring.application.name=-sentinel-service-provider
# 指定注冊中心
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 指定sentinel監控中心
spring.cloud.sentinel.transport.dashboard=localhost:8080
           

3、主啟動類

/**
 * @author 15594
 */
@SpringBootApplication
@EnableDiscoveryClient
public class SentinelMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(SentinelMain8001.class,args);
    }
}

           

4、測試類

/**
 * Sentinel實作斷路(限流、熔斷、降級等)
 * @author 15594
 */
@RestController
public class SentinelController {
    @GetMapping("/testA")
    public String testA()
    {
        return "------testA";
    }
    @GetMapping("/testB")
    public String testB()
    {
        return "------testB";
    }
}
           

5、設定斷路規則(核心)

這個一步隻需要到Sentinel server 使用者界面設定即可

比如:設定一個限流規則:

spring cloud Alibaba——02 Sentinel
spring cloud Alibaba——02 Sentinel
spring cloud Alibaba——02 Sentinel
spring cloud Alibaba——02 Sentinel

限流規則添加成功

spring cloud Alibaba——02 Sentinel

再次通路:http://localhost:8001//testA

連續重新整理

當每秒請求超過1次時就會觸發服務降級。

spring cloud Alibaba——02 Sentinel

三、配置斷路規則

上面的入門案例我們也就配置過流量控制了。我們如何配置其他的斷路規則呢?

sentinel為我們提供了以下的斷路配置規則:

spring cloud Alibaba——02 Sentinel

1、斷路規則配置分類

其實sentinel斷路規則按照

配置方式

可以配置兩種。

  1. 一種是

    入門案例中的配置方式

    ,在sentinel提供的使用者界面就行配置。(

    推薦使用

    這種方式會随着服務(這個服務是受監控的服務)的關閉而丢失配置資訊。是以需要将這些

    規則配置持久化

    後面會講如何實作持久化。
  2. 一種是通過代碼配置。(

    不推薦

    這種方式是可以實作持久化的,但是會增加代碼的耦合度,并且實作比較麻煩。

    比如:

/**
 * 定義資源
 * */
@GetMapping("/testB")
public String testB() {
    // 配置規則.
    initFlowRules();

    while (true) {
        // 1.5.0 版本開始可以直接利用 try-with-resources 特性
        Entry entry =null;
        try  {
            entry = SphU.entry("HelloWorld");
            // 被保護的邏輯
            System.out.println("hello world");
            return "------testB";
        } catch (BlockException ex) {
            // 處理被流控的邏輯
            System.out.println("流量控制生效");
            return "流量控制生效";
        } finally {
            if (entry != null) {
                entry.exit();
            }
        }
    }
}
/**
 *  定義規則
 * */
private static void initFlowRules(){
    List<FlowRule> rules = new ArrayList<FlowRule>();
    FlowRule rule = new FlowRule();
    rule.setResource("HelloWorld");
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // Set limit QPS to 20.
    rule.setCount(1);
    rules.add(rule);
    FlowRuleManager.loadRules(rules);
}
           

2、規則的種類

Sentinel 的所有規則都可以在記憶體态中動态地查詢及修改,修改之後立即生效。同時 Sentinel 也提供相關 API,供您來定制自己的規則政策。

Sentinel 支援以下幾種規則:流量控制規則、熔斷降級規則、系統保護規則、來源通路控制規則 和 熱點參數規則。

上面已經說過,規則的配置方式有兩種,我們使用Sentinel 圖形化界面進行配置 。

注意:官網上已經有這些規則的概念的詳細介紹,我們結合Sentinel 使用者界面上面的配置針對這些概念進行講解。

2.1、流量控制規則 (FlowRule)

spring cloud Alibaba——02 Sentinel

下面我們為testA添加一個流控規則:

spring cloud Alibaba——02 Sentinel
spring cloud Alibaba——02 Sentinel
  • 資源名:唯一名稱,有兩種形式的值。方式一:請求路徑的格式(資源名字前面有斜杠/),比如:/testA 這樣就能将這個規則綁定給 /testA 這個請求。方式二:自己起一個名字資源,但是要唯一,然後通過注解@SentinelResource(value = “testB”)綁定給一個請求路徑。

    方式一:

    如果資源名/testB,那麼這個流控規則就會尋找一個請求路徑為 /testB ,将規則綁定給/testB

    @GetMapping("/testB") //根據請求路徑,綁定流控規則
        public String testB()
        {
            return "------testB";
        }
               

    方式二:

    如果資源名123,那麼這個流控規則就會尋找一個通過注解标注為@SentinelResource(value = “123”)的請求,将規則綁定給這個請求。

    @SentinelResource(value = "123")
    @GetMapping("/testC")
    public String testC() {
    //        initFlowRulesTestC();
        return "------testC";
    }
               
  • 針對來源:Sentinel可以針對調用者進行限流,填寫微服務名,預設default(不區分來源),

    可以當作将規則分類

  • 門檻值類型/單機門檻值:zhiyuan
    • QPS(每秒鐘的請求數量)︰當調用該API的QPS達到門檻值的時候,進行限流。(

      選擇QPS後,單機門檻值的值就表示,每秒請求的最大次數

    • 線程數:當調用該API的線程數達到門檻值的時候,進行限流。(

      選擇線程數後,單機門檻值的值就表示,同一時間同時通路的線程數為多少個,也就是支援多少個使用者同時通路這個請求

  • 是否叢集:不需要叢集。
    • 單機均攤 : 以單機為機關,單機請求數達到門檻值後,叢集限流
    • 總體門檻值 :以叢集為機關,叢集請求數達到門檻值後,叢集限流
  • 流控模式:
    • 直接:請求達到限流條件時,直接限流。
    • 關聯:當關聯的資源B達到門檻值時,就限流自己A。

      舉例 :使用者 請求 A 調用(消費)B 。當B限流時(服務不可用),那麼A也會限流自己。

    • 鍊路:隻記錄指定鍊路上的流量(指定資源從入口資源進來的流量,如果達到門檻值,就進行限流)【API級别的針對來源】。

      舉例 :A->B->C

      當 入口資源A限流時限流自己
  • 流控效果:
    • 快速失敗:直接失敗,抛異常。
    • Warm up:根據Code Factor(冷加載因子,預設3)的值,從門檻值/codeFactor,經過預熱時長,才達到設定的QPS門檻值。
    • 排隊等待:勻速排隊,讓請求以勻速的速度通過,門檻值類型必須設定為QPS,否則無效。

2.2、熔斷降級規則 (DegradeRule)

spring cloud Alibaba——02 Sentinel
spring cloud Alibaba——02 Sentinel
spring cloud Alibaba——02 Sentinel
spring cloud Alibaba——02 Sentinel
spring cloud Alibaba——02 Sentinel

2.3、系統保護規則 (SystemRule)

spring cloud Alibaba——02 Sentinel
spring cloud Alibaba——02 Sentinel

2.4、Sentinel熱點key(

常用

spring cloud Alibaba——02 Sentinel

注意:熱點規則(比較常用),

可以了解為給請求的進一步定制斷路規則

spring cloud Alibaba——02 Sentinel

舉例:

spring cloud Alibaba——02 Sentinel
@SentinelResource(value = "testA",blockHandler = "deal_testA")
@GetMapping("/testA/{vip}/{name}")
public String testA(@PathVariable("vip") String vip,@PathVariable("name") String name) {
    return "------testA";
}

public String  deal_testA(String vip, String name,BlockException exception) {

    return "觸發限流";
}
           
  • 通路攜帶參數vip的請求(出去vip=1的例外項),每秒隻能請求成功一次。如:http://localhost:8001//testA/0/lihua
  • 通路攜帶參數vip=1的請求,每秒能請求成功10次。如:http://localhost:8001//testA/1/lihua

四、注解@SentinelResource

注意:這個注解标注的方法最好是pubic類型

@SentinelResource這個注解有以下屬性:

spring cloud Alibaba——02 Sentinel

1、value

value屬性用來指定資源名

spring cloud Alibaba——02 Sentinel

2、entryType:

entry 類型,可選項(預設為 EntryType.OUT)

3、blockHandler / blockHandlerClass: (違反斷路規則觸發)

blockHandler 對應處理 BlockException 的函數名稱,可選項。blockHandler 函數通路範圍需要是 public,

傳回類型需要與原方法相比對,參數類型需要和原方法相比對并且最後加一個額外的參數,類型為 BlockException

blockHandler 函數預設需要和原方法在同一個類中

若希望使用其他類的函數,則可以指定 blockHandlerClass 為對應的類的 Class 對象

注意對應的函數必需為 static 函數

,否則無法解析。

/**
 * Sentinel實作斷路(限流、熔斷、降級等)
 * @author 15594
 */
@RestController
public class SentinelController {
    @SentinelResource(value = "testA",blockHandler = "deal_testA",
            blockHandlerClass = {BlockHandlerService.class})
    @GetMapping("/testA/{vip}/{name}")
    public String testA(@PathVariable("vip") String vip,@PathVariable("name") String name) {
        return "------testA";
    }
}
/**
 * 違背斷路規則後,觸發的降級方法。為了降低代碼耦合将這些方法統一放到一起
 * @author 15594
 */
public class BlockHandlerService {
    /**
     * 注意對應的函數必需為 static 函數,否則無法解析。
     * */
    public static  String  deal_testA(String vip, String name, BlockException exception) {

        return "觸發限流";
    }
}
           

注意:對應的BlockHandler函數必需為 static 函數,否則無法解析。

4、fallback:(請求異常觸發)

fallback 函數名稱,可選項,用于在抛出異常的時候提供 fallback 處理邏輯。fallback 函數可以針對所有類型的異常(除了 exceptionsToIgnore 裡面排除掉的異常類型)進行處理。fallback 函數簽名和位置要求:

傳回值類型必須與原函數傳回值類型一緻;方法參數清單需要和原函數一緻,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常。fallback 函數預設需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。

/**
 * 注意:如果隻配置fallback,可以不設定斷路規則
 * */
 @SentinelResource(value = "testC",fallbackClass = { FallbackClassService.class },fallback = "deal_testC"
         //預設降級方法,當有fallback指定的方法時不起效。
         ,defaultFallback = "defaultFallback" )
 @GetMapping("/testC")
 public String testC() {
     //制造一個異常
     int i = 1/0;
     return "------testC";
 }
/**
 * 代碼出現異常後,的降級處理方法,為了減少代碼耦合度将這些方法放到一個類中管理
 * @author 15594
 */
public class FallbackClassService {
    /**
     * 注意對應的函數必需為 static 函數,否則無法解析。
     * */
    public static  String  deal_testC(Throwable e) {
        System.out.println(e.getMessage());
        return "程式異常,降級處理";
    }

    /**
     * 傳回值類型必須與原函數傳回值類型一緻;
     * 方法參數清單需要為空,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常。
     * 為了解決代碼膨脹,我們給一個預設的降級方法
     * */
    public static String defaultFallback(Throwable e){
        System.out.println(e.getMessage());
        return "預設降級方法";
    }
}
           

**注意:**降級方法,額外攜帶的參數隻能是 Throwable 類型(

隻能寫Throwable e,不能寫它的子類 ,不然會報錯

)的參數用于接收對應的異常。降級函數必需為 static 函數,否則無法解析。

5、defaultFallback(since 1.6.0):

預設的 fallback 函數名稱,可選項,通常用于通用的 fallback 邏輯(即可以用于很多服務或方法)。預設 fallback 函數可以針對是以類型的異常(

除了 exceptionsToIgnore 裡面排除掉的異常類型

)進行處理。若

同時配置了 fallback 和 defaultFallback,則隻有 fallback 會生效

。defaultFallback 函數簽名要求:

傳回值類型必須與原函數傳回值類型一緻;方法參數清單需要為空,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常。defaultFallback 函數預設需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。

注意:通過指定預設降級方法可以有效防止代碼膨脹

6、exceptionsToIgnore(since 1.6.0):

用于

指定哪些異常被排除掉,不會計入異常統計中

,也不會進入 fallback 邏輯中,而是會原樣抛出。

五、持久化Sentinel斷路規則

在前面我們已經知道,通過Sentinel使用者界面配置的斷路規則會,随着服務的重新開機而丢失。如何将這些配置持久化呢?

Sentinel 目前支援以下資料源擴充(持久化):

Pull-based: 動态檔案資料源、Consul, Eureka

Push-based: ZooKeeper, Redis, Nacos, Apollo, etcd

`注意:下面這種方式是通過Nacos Push方式實作,并且這種方式可以遠端動态重新整理規則配置。` ### 1、導入pom 在之前的基礎上增加一個sentinel-datasource-nacos依賴 ```xml com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator com.alibaba.csp sentinel-datasource-nacos com.alibaba.cloud spring-cloud-starter-alibaba-sentinel 2.1.1.RELEASE ``` ### 2、改yml

server.port=8001
spring.application.name=-sentinel-service-provider
# 指定注冊中心
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 指定sentinel監控中心
spring.cloud.sentinel.transport.dashboard=localhost:8080

# 持久化sentinel規則配置到nacos ------ 新增
# 配置中心位址
spring.cloud.sentinel.datasource.ds1.nacos.server-addr=localhost:8848
# 命名空間
spring.cloud.sentinel.datasource.ds1.nacos.namespace=4a46ce6a-c692-4d85-8291-8961bd1ee52b
# data id
spring.cloud.sentinel.datasource.ds1.nacos.data-id=sentinel-datasource-service
# 組id
spring.cloud.sentinel.datasource.ds1.nacos.group-id=DEFAULT_GROUP
# 配置資料類型
spring.cloud.sentinel.datasource.ds1.nacos.data-type=json
spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow
           

3、到nacos配置一個斷路規則

spring cloud Alibaba——02 Sentinel
[
{
    "resource": "testA",
    "IimitApp": "default",
    "grade": 1,
    "count": 1, 
    "strategy": 0,
    "controlBehavior": 0,
    "clusterMode": false
}
//可以繼續添加
]
           

4、通過注解綁定請求

@SentinelResource(value = "testA")
 @GetMapping("/testA/{vip}/{name}")
 public String testA(@PathVariable("vip") String vip,@PathVariable("name") String name) {
     return "------testA";
 }

           

5、如何編寫配置

比如:我們編寫一個熱點規則。

通過官網我們可以擷取到對應的屬性名:官網

spring cloud Alibaba——02 Sentinel
spring cloud Alibaba——02 Sentinel

注意:使用時把注釋去掉。

  • 流控規則

    根據實際的需要改變減少對應的參數即可

    [
      {
        // 資源名
        "resource": "/test",
        // 針對來源,若為 default 則不區分調用來源
        "limitApp": "default",
        // 限流門檻值類型(1:QPS;0:并發線程數)
        "grade": 1,
        // 門檻值
        "count": 1,
        // 是否是叢集模式
        "clusterMode": false,
        // 流控效果(0:快速失敗;1:Warm Up(預熱模式);2:排隊等待)
        "controlBehavior": 0,
        // 流控模式(0:直接;1:關聯;2:鍊路)
        "strategy": 0,
        // 預熱時間(秒,預熱模式需要此參數)
        "warmUpPeriodSec": 10,
        // 逾時時間(排隊等待模式需要此參數)
        "maxQueueingTimeMs": 500,
        // 關聯資源、入口資源(關聯、鍊路模式)
        "refResource": "rrr"
      }
    ]
    
               
  • 降級(熔斷)規則

    根據實際的需要改變減少對應的參數即可

    [
      {
      	// 資源名
        "resource": "/test1",
        "limitApp": "default",
        // 熔斷政策(0:慢調用比例,1:異常比率,2:異常計數)
        "grade": 0,
        // 最大RT、比例門檻值、異常數
        "count": 200,
        // 慢調用比例門檻值,僅慢調用比例模式有效(1.8.0 引入)
        "slowRatioThreshold": 0.2,
        // 最小請求數
        "minRequestAmount": 5,
        // 當機關統計時長(類中預設1000)
        "statIntervalMs": 1000,
        // 熔斷時長
        "timeWindow": 10
      }
    ]
    
               
  • 熱點規則

    根據實際的需要改變減少對應的參數即可

    [
      {
      	// 資源名
        "resource": "/test1",
        // 限流模式(QPS 模式,不可更改)
        "grade": 1,
        // 參數索引
        "paramIdx": 0,
        // 單機門檻值
        "count": 13,
        // 統計視窗時長
        "durationInSec": 6,
        // 是否叢集 預設false
        "clusterMode": 預設false,
        // 
        "burstCount": 0,
        // 叢集模式配置
        "clusterConfig": {
          // 
          "fallbackToLocalWhenFail": true,
       	  // 
          "flowId": 2,
          // 
          "sampleCount": 10,
          // 
          "thresholdType": 0,
          // 
          "windowIntervalMs": 1000
        },
        // 流控效果(支援快速失敗和勻速排隊模式)
        "controlBehavior": 0,
        // 
        "limitApp": "default",
        // 
        "maxQueueingTimeMs": 0,
        // 進階選項
        "paramFlowItemList": [
          {
          	// 參數類型
            "classType": "int",
          	// 限流門檻值
            "count": 222,
          	// 參數值
            "object": "2"
          }
        ]
      }
    ]
    
               
  • 系統規則

    負值表示沒有門檻值檢查。

    不需要删除參數

    [
      {
      	// RT
        "avgRt": 1,
        // CPU 使用率
        "highestCpuUsage": -1,
        // LOAD
        "highestSystemLoad": -1,
        // 線程數
        "maxThread": -1,
        // 入口 QPS
        "qps": -1
      }
    ]
    
               
  • 受權規則

    根據實際的需要改變對應的參數即可

    [
      {
        // 資源名
        "resource": "sentinel_spring_web_context",
      	// 流控應用
        "limitApp": "/test",
        // 授權類型(0代表白名單;1代表黑名單。)
        "strategy": 0
      }
    ]
    
               

參考: Spring Cloud Alibaba Sentinel(八)持久化資料及配置json

六、Sentinel整合負載均衡

項目結構

spring cloud Alibaba——02 Sentinel

1、導入pom

<dependencies>
    <!--SpringCloud ailibaba nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- SpringBoot整合Web元件 -->
    <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>
    <!--SpringCloud ailibaba sentinel-datasource-nacos 因為Sentinel的斷路規則配置是一次性的,
    Sentinel server重新開機後配置就會丢失,所有需要持久化用到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>
        <version>2.1.1.RELEASE</version>
    </dependency>

    <!--SpringCloud openfeign整合了ribbon,使用的負載均衡本質上還是ribbon的。
    同時openfeign還提供了服務降級功能,和幫我們動态生成通信實作類,使得我們控制層可以通過調用接口,實作服務間的通信,減少代碼耦合 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>
           

2、改yml

server.port=81
spring.application.name=-sentinel-openfeign-service-consumer
# 指定注冊中心
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 指定sentinel監控中心
spring.cloud.sentinel.transport.dashboard=localhost:8080

# 持久化sentinel規則配置到nacos ------ 這個需要在nacos配置中心建立遠端配置檔案,用于持久化斷路規則和遠端動态修改斷路規則
spring.cloud.sentinel.datasource.ds1.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds1.nacos.namespace=4a46ce6a-c692-4d85-8291-8961bd1ee52b
spring.cloud.sentinel.datasource.ds1.nacos.data-id=sentinel-openfeign-service-consumer
spring.cloud.sentinel.datasource.ds1.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds1.nacos.data-type=json
spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow

# 如果為 true,則 OpenFeign 用戶端将被 Sentinel 斷路器包裹(用于服務降級,如果不使用,@FeignClient(fallback = "")帶的降級屬性可以不開啟)
#feign.sentinel.enabled=true

# 指定負載均衡政策:注意:如果這句代碼沒有提示,不要覺得寫錯了(我們也可以根據全限定類名,指定我們自己編寫的負載均衡政策)
# 注意:前面的service-provider為:服務位址,也就是@FeignClient(value = "service-provider") 中的value的值
service-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
#請求連接配接逾時時間
service-provider.ribbon.ConnectTimeout=500
#請求處理的逾時時間
service-provider.ribbon.ReadTimeout=1000
#對所有請求都進行重試
service-provider.ribbon.OkToRetryOnAllOperations=true
#切換執行個體的重試次數
service-provider.ribbon.MaxAutoRetriesNextServer=2
#對目前執行個體的重試次數
service-provider.ribbon.MaxAutoRetries=1

#此外ribbon還提供了以下負載均衡政策

#com.netflix.loadbalancer.RandomRule #配置規則 随機
#com.netflix.loadbalancer.RoundRobinRule #配置規則 輪詢
#com.netflix.loadbalancer.RetryRule #配置規則 重試
#com.netflix.loadbalancer.WeightedResponseTimeRule #配置規則 響應時間權重
#com.netflix.loadbalancer.BestAvailableRule #配置規則 最空閑連接配接政策
           

到nacos配置中心建立遠端配置檔案:

spring cloud Alibaba——02 Sentinel
[{
    "resource": "consumer",
    "IimitApp": "default",
    "grade": 1,
    "count": 2, 
    "strategy": 0,
    "controlBehavior": 0,
    "clusterMode": false
}]
           

3、主啟動類

/**
 * 主啟動類
 * // @EnableDiscoveryClient nacos 開啟注冊中心
 * // @EnableFeignClients 開啟openfeign
 * @author 15594
 */
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class MainSentinelFeign81 {
    public static void main(String[] args) {
        SpringApplication.run(MainSentinelFeign81.class,args);
    }
}
           

4、業務層

openFeign 接口:

/**
 *
 * 需要調用的生産者API
 * openFeign會幫我們建立具體實作類。
 * @author 15594
 */
@FeignClient(value = "service-provider")
public interface ProviderService {

    @RequestMapping("/provider")
    public  String provider();
}
           

sentinel 降級處理:

/**
 * 違背斷路規則後,觸發的降級方法。為了降低代碼耦合将這些方法統一放到一起
 * @author 15594
 */
public class BlockHandlerService  {

    public static String provider(BlockException exception) {
        System.out.println(exception.getRuleLimitApp());
        return "違反斷路規則,降級處理";
    }
}
           
/**
 * 代碼出現異常後,的降級處理方法,為了減少代碼耦合度将這些方法放到一個類中管理
 * @author 15594
 */
public class FallbackClassService  {

    public static String provider(Throwable throwable) {
        System.out.println(throwable.getMessage());
        return "程式異常,降級處理";
    }
}
           

5、控制層

/**
 * @author 15594
 */
@RestController
public class ConsumerController {

    @Autowired
    ProviderService providerService;

    @RequestMapping("/consumer/provider")
    @SentinelResource(value = "consumer",
            blockHandlerClass = {BlockHandlerService.class},blockHandler = "provider",
            fallbackClass ={FallbackClassService.class},fallback = "provider")
    public String consumer(){
        String provider = providerService.provider();
        //int i = 1/0;
        return provider;
    }
}
           

6、測試

1. 啟動兩個服務提供者(生産者):

怎麼建立生産者可以參考

:spring cloud Alibaba——01 Nacos

2. 啟動消費者

spring cloud Alibaba——02 Sentinel
spring cloud Alibaba——02 Sentinel
spring cloud Alibaba——02 Sentinel