Sentinel基礎應用

女友在高考發表於2022-04-16

Sentinel 是什麼?

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

Sentinel 具有以下特徵:

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

Setinel的主要特性:

Setinel分為兩個部分:

  • 核心庫(Java客戶端)不依賴任何框架/庫,能夠執行於所有Java執行時環境,同時對Dubbo/Spring Cloud等框架也有較好的支援。
  • 控制檯(Dashboard)基於Spring Boot開發,打包後可以直接執行,不需要額外的Tomcat等應用容器。

快速開始

  1. Sentinel Dashboard部署,下載地址:https://github.com/alibaba/Sentinel/releases ,使用命令啟動
java -jar sentinel-dashboard-1.8.3.jar
  1. 登入控制檯,地址: http://localhost:8080 初始賬密:sentinel/sentinel

  2. 引入依賴

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. 在服務的application.properties中加入以下配置
spring:
  application:
    name: resume-nacos-consumer
  cloud:
   sentinel:
          transport:
            dashboard: 127.0.0.1:8080
            port: 8719  #sentinel會在該埠啟動http server,那麼這樣的話,控制檯定義的一些限流等規則才能傳送傳遞過來

然後呼叫介面,再檢視Sentinel控制檯(注意有一會兒的延遲)。

Sentinel關鍵概念

概念名稱 概念描述
資源 它可以是Java應⽤程式中的任何內容。例如,由應⽤程式提供的服務或由應⽤程式調⽤的其它應⽤提供的服務,甚⾄可以是⼀段程式碼。我們請求的API接⼝就是資源
規則 圍繞資源的實時狀態設定的規則,可以包括流量控制規則、熔斷降級規則以及系統保護規則。所有規則可以動態實時調整

流控實戰

  • 資源名:預設請求的路徑
  • 針對來源:可以填寫微服務名稱,Sentinel支援針對呼叫者進行限流。預設是default(不區分來源)
  • 閾值型別:QPS和執行緒數
  • 流控模式:
    • 直接:資源調⽤達到限流條件時,直接限流
    • 關聯:填寫一個關聯資源,關聯的資源達到閾值了,也限流自己這個資源(資源名處配置的資源)
    • 鏈路:如果有多個鏈路都可以呼叫到本資源,可以指定只記錄某個鏈路上的流量
  • 流控效果:
    • 快速失敗:直接失敗,丟擲異常
    • Warm Up:根據冷載入因子(預設3)的值,從(閾值/冷載入因子)經過預熱時長後才能達到設定的QPS閾值。因為有時系統沒預熱的時候它的QPS達不到那麼高,所以最開始不能放那麼高的閾值的流量進來。
    • 排隊等待:多餘請求勻速排隊,讓請求勻速通過,閾值型別必須設定為QPS,否則無效。

降級實戰

Sentinel降級會在調⽤鏈路中某個資源出現不穩定狀態時(例如調⽤超時或異常⽐例升⾼),對這個資源的調⽤進⾏限制,讓請求快速失敗,避免影響到其它的資源⽽導致級聯錯誤。當資源被降級後,在接下來的降級時間窗⼝之內,對該資源的調⽤都⾃動熔斷

慢呼叫比例:

  • 最大RT:代表設定一個時間,超過這個時間就認定為慢響應
  • 比例閾值:超過多少比例進入熔斷
  • 熔斷時長
  • 最小請求數:超過最小請求數才能生效

這個版本下好像有bug,比例閾值填不了

異常比例:

異常比例超過0.5就會熔斷

異常數:

異常數超過2就會被熔斷,上面熔斷後,會直接丟擲異常。像下面這樣:

實際應用中,我們需要對異常進行自定義。

3.1 自定義降級異常

使用blockHandler:

@RequestMapping("/testException")
    @SentinelResource(value = "/testExceptionTest",blockHandlerClass = SentinelFallback.class,blockHandler = "handleException")
    public String testException(){
        int i=1/0;
        return "ok";
    }
public class SentinelFallback {

    /**
     * 形參最後加入BlockException引數,用於接收異常,方法必須為public static
     * @param blockException
     * @return
     */
    public static String handleException(BlockException blockException){
        return "exception";
    }
}

使用fallback:

@RequestMapping("/testError")
    @SentinelResource(value = "/testErrorTest",fallbackClass = SentinelFallback.class,fallback = "handleError")
    public String testError(){
        int i=1/0;
        return "ok";
    }
public class SentinelFallback {

    //方法列表需要和原函式一致,或者多一個Throwable型別的引數
    public static String handleError(){
        return "error";
    }
}

fallback和blockHandler的區別:fallback可以處理所有型別的異常,而blockHandler只處理BlockException型別的異常。

3.2 基於Nacos實現Sentinel規則持久化

  1. 引入依賴
 <!-- Sentinel支援採用Nacos作為規則配置資料來源 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
  1. sentinel中配置Nacos資料來源
spring:
  application:
    name: resume-nacos-consumer
  cloud:
      sentinel:
        transport:
          dashboard: 127.0.0.1:8080
          port: 8719  #sentinel會在該埠啟動http server,那麼這樣的話,控制檯定義的一些限流等規則才能傳送傳遞過來
        datasource:
          flow:  # 名稱是自定義的
            nacos:
              server-addr: ${spring.cloud.nacos.discovery.server-addr}
              data-id: ${spring.application.name}-flow-rules
              groupId: DEFAULT_GROUP
              data-type: json
              rule-type: flow  # 型別來⾃RuleType類
          degrade:  # 名稱是自定義的
            nacos:
              server-addr: ${spring.cloud.nacos.discovery.server-addr}
              data-id: ${spring.application.name}-degrade-rules
              groupId: DEFAULT_GROUP
              data-type: json
              rule-type: degrade  # 型別來⾃RuleType類
  1. 在Nacos裡面進行配置

配置完後我們發現Sentinel裡面就有了

  1. 配置說明

所有屬性來⾃原始碼FlowRule類

  • resource:資源名稱
  • limitApp:來源應⽤
  • grade:閾值型別 0 執行緒數 1 QPS
  • count:單機閾值
  • strategy:流控模式,0 直接 1 關聯 2 鏈路
  • controlBehavior:流控效果,0 快速失敗 1 Warm Up 2 排隊等待
  • clusterMode:true/false 是否叢集

降級配置規則:

配置檔案: resume-nacos-consumer-degrade-rules

[
{
"resource":"findResumeOpenState",
"grade":2,
"count":1,
"timeWindow":5
}
]

所有屬性來⾃原始碼DegradeRule類

  • resource:資源名稱
  • grade:降級策略 0 RT 1 異常⽐例 2 異常數
  • count:閾值
  • timeWindow:時間窗

注意

  1. ⼀個資源可以同時有多個限流規則和降級規則,所以配置的資料是⼀個json陣列
  2. Sentinel控制檯中修改規則,僅是記憶體中⽣效,不會修改Nacos中的配置值,重啟後恢復原來的值;而在Nacos控制檯中修改規則,不僅記憶體中⽣效,Nacos中持久化規則也⽣效,重啟後規則依然保持。

相關文章