springCloud-Alibaba--Sentinel


springCloud-Alibaba--Sentinel 

 

 

官網:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_introduction_of_sentinel

gitHub: https://github.com/alibaba/Sentinel

Sentinel 是什么?

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

Sentinel 具有以下特征:

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

 

 

官網下載Sentinel: https://github.com/alibaba/Sentinel/releases/tag/1.7.2

啟動jar 

訪問:  IP + 8080

賬戶: sentinel    密碼: sentinel

 

 

maven依賴:

<dependency> 
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> 
</dependency>
 <!-- sentinel-datasource-nacos 后續做持久化用到-->
         <dependency>
             <groupId>com.alibaba.csp</groupId>
             <artifactId>sentinel-datasource-nacos</artifactId>
         </dependency>

 

修改yml:

server: port: 8401 spring: application: name: cloud-alibaba-sentinel-service cloud: nacos: discovery: # Nacos 服務注冊中心 server-addr: localhost:8848 sentinel: transport: # 配置sentinel dashboard 地址 dashboard: localhost:8080 # 默認8719端口,假如被占用會自動從8719開始依次+1掃描,直至找到未被占用的端口 port: 8791 management: endpoints: web: exposure: include: '*'

 

新建controller

瀏覽器訪問:

 

 

 查看Sentinel Dashboard:

 

Sentinel 流控規則:

流量控制(flow control),其原理是監控應用流量的 QPS 或並發線程數等指標,當達到指定的閾值時對流量進行控制,以避免被瞬時的流量高峰沖垮,從而保障應用的高可用性。

 

 

字段解釋:

資源名: 唯一名稱,默認的請求路徑。

針對來源: Sentinel 可以針對調用者進行限流,填寫微服務名,默認default(不區分來源)

閥值類型/單機閥值:

     QPS(每秒鍾的請求數量): 當調用API的QPS達到閥值的時候,進行限流。

     線程數: 當調用該API的線程數達到閥值的時候進行限流

是否集群: 不需要集群

流控模式:

      直接:  API達到限流時,直接限流

      關聯: 當關聯的資源達到閥值時,就限流自己

      鏈路: 只記錄指定鏈路上的流量(指定資源從入口進來的流量,如果達到閥值,就進行限流)【Api級別的針對來源】

流控效果:

   快速失敗: 直接失敗,拋異常。

   Warm Up: 根據codeFactor(冷加載因子,默認3)的值,從   單機閥值 / codeFactor  經過預熱時長,才達到設置的QPS閥值。

   排隊等待: 勻速排隊,讓請求以勻速的速度通過,閥值類型必須設置為QPS才有效。

 

流控配置並測試:

 1:QPS限流:

 

 

1秒內 訪問/testA沒有問題

 

 但是1秒內多次訪問:

 

Sentinel 降級規則:

          除了流量控制以外,對調用鏈路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。由於調用關系的復雜性,如果調用鏈路中的某個資源不穩定,最終會導致請求發生堆積。Sentinel 熔斷降級會在調用鏈路中某個資源出現不穩定狀態時(例如調用超時或異常比例升高),對這個資源的調用進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯錯誤。當資源被降級后,在接下來的降級時間窗口之內,對該資源的調用都自動熔斷(默認行為是拋出 DegradeException)。 

 

降級策略:

  • (RT)平均響應時間 (DEGRADE_GRADE_RT):      當 1s 內持續進入 N 個請求,對應時刻的平均響應時間(秒級)均超過閾值(count,以 ms 為單位),那么在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 為單位)之內,對這個方法的調用都會自動地熔斷(拋出 DegradeException)。注意 Sentinel 默認統計的 RT 上限是 4900 ms,超出此閾值的都會算作 4900 ms,若需要變更此上限可以通過啟動配置項 -Dcsp.sentinel.statistic.max.rt=xxx 來配置。
  • 異常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):  當資源的每秒請求量 >= N(可配置),並且每秒異常總數占通過量的比值超過閾值(DegradeRule 中的 count)之后,資源進入降級狀態,即在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 為單位)之內,對這個方法的調用都會自動地返回。異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%。
  • 異常數 (DEGRADE_GRADE_EXCEPTION_COUNT):     當資源近 1 分鍾的異常數目超過閾值之后會進行熔斷。注意由於統計時間窗口是分鍾級別的,若 timeWindow 小於 60s,則結束熔斷狀態后仍可能再進入熔斷狀態。

eg:

 

當 1s 內持續進入 N 個請求 , 所有訪問  /testA 的線程必須200毫秒內處理完成,否則在時間窗口期10秒內都將不能訪問

 

 Sentinel 熱點參數限流:

 

何為熱點?熱點即經常訪問的數據。很多時候我們希望統計某個熱點數據中訪問頻次最高的 Top K 數據,並對其訪問進行限制。比如:

 

  • 商品 ID 為參數,統計一段時間內最常購買的商品 ID 並進行限制
  • 用戶 ID 為參數,針對一段時間內頻繁訪問的用戶 ID 進行限制

 

熱點參數限流會統計傳入參數中的熱點參數,並根據配置的限流閾值與模式,對包含熱點參數的資源調用進行限流。熱點參數限流可以看做是一種特殊的流量控制,僅對包含熱點參數的資源調用生效。

 

 

參數索引: 0: 表示 /testC方法的第一個參數QPS超過每秒1次,則進行限流 

 

 

兜底方法:

當達到我們配置的限流條件后,系統都是默認提示: Blocked by Sentinel (flow limiting)

當然我們也可以使用自定義的降級方法: @SentinelResource 注解的方式。

 

但是這樣代碼就會冗余到業務代碼中,可以提取公共的全局異常處理(這里的異常是指超過了我們配置限流規則的異常):

 自定義全局的異常處理類(必須是靜態的方法):

public class CustomerBlockHandler { public static CommonResult handlerException(BlockException blockException){ return new CommonResult(444, "按照客戶自定義,global handlerException----1"); } public static CommonResult handlerException2(BlockException blockException) { return new CommonResult(444, "按照客戶自定義,global handlerException----12"); } }

controller使用:

  @GetMapping("/customerBlockHandler") @SentinelResource(value = "customerBlockHandler", blockHandlerClass = CustomerBlockHandler.class,blockHandler = "handlerException") public CommonResult customerBlockHandler(){ return new CommonResult(200, "客戶自定義異常", new Payment(2020, "00001")); }
blockHandlerClass : 指定處理異常的類。
blockHandler :指定具體的處理方法。

 注意: @SentinelResource 處理的是控制台配置的流控規則超出預期的錯誤,由BlockHandler方法配置的兜底方法處理,java運行時的其他錯誤是不會處理的。
可以通過配置fallback來處理java運行時的業務異常處理:
@GetMapping("/customerBlockHandler")  @SentinelResource(value = "customerBlockHandler", blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handlerException",  fallback = "fallbackJavaExceptionHandler") public CommonResult customerBlockHandler(){ return new CommonResult(200, "客戶自定義異常", new Payment(2020, "00001")); }

若fallback和blockhandler都進行了配置,則被限流降級拋出blockException時只會進入blockhandler處理。

@SentinelResource 參數之: exceptionsToIgnore

 

 熱點規則之參數例外項說明:

 

 

 參數例外項: 當第0個參數的值等於my-test的時候,重置限流閥值

 

 

 Sentinel 系統規則:

 Sentinel 系統自適應限流從整體維度對應用入口流量進行控制,結合應用的 Load、CPU 使用率、總體平均 RT、入口 QPS 和並發線程數等幾個維度的監控指標,通過自適應的流控策略,讓系統的入口流量和系統的負載達到一個平衡,讓系統盡可能跑在最大吞吐量的同時保證系統整體的穩定性。

  • Load 自適應(僅對 Linux/Unix-like 機器生效):系統的 load1 作為啟發指標,進行自適應系統保護。當系統 load1 超過設定的啟發值,且系統當前的並發線程數超過估算的系統容量時才會觸發系統保護(BBR 階段)。系統容量由系統的 maxQps * minRt 估算得出。設定參考值一般是 CPU cores * 2.5
  • CPU usage(1.5.0+ 版本):當系統 CPU 使用率超過閾值即觸發系統保護(取值范圍 0.0-1.0),比較靈敏。
  • 平均 RT:當單台機器上所有入口流量的平均 RT 達到閾值即觸發系統保護,單位是毫秒。
  • 並發線程數:當單台機器上所有入口流量的並發線程數達到閾值即觸發系統保護。
  • 入口 QPS:當單台機器上所有入口流量的 QPS 達到閾值即觸發系統保護。

 

 Sentinel 對OpenFeign的支持

maven依賴

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

yml 添加:

feign: sentinel: enabled: true

啟動類添加@EnableFeignClients

添加調用接口:

 

 

 

 

Sentinel 配置的持久化

 maven依賴:

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

Nacos平台中創建我們的流控規則

[{ "resource": "/ getOrderSentinel", "limitApp": "default", "grade": 1, "count": 5, "strategy": 0, "controlBehavior": 0, "clusterMode": false }]

resource:資源名,即限流規則的作用對象

limitApp:流控針對的調用來源,若為 default 則不區分調用來源

grade:限流閾值類型(QPS 或並發線程數);0代表根據並發數量來限流,1代表根據QPS來進行流量控制

count:限流閾值

strategy:調用關系限流策略

controlBehavior:流量控制效果(直接拒絕、Warm Up、勻速排隊)

clusterMode:是否為集群模式

yml配置文件:

spring: application: name: cloud-alibaba-sentinel-service cloud: nacos: discovery: # Nacos 服務注冊中心 server-addr: localhost:8848 sentinel: transport: # 配置sentinel dashboard 地址 dashboard: localhost:8080 #開啟Http Server 與dashboard交互 默認8719端口,假如被占用會自動從8719開始依次+1掃描,直至找到未被占用的端口 port: 8791 datasource: ds1: nacos: # nacos連接地址 server-addr: localhost:8848 # 讀取配置文件的 data-id dataId: cloud-alibaba-sentinel-service # nacos連接的分組 groupId: DEFAULT_GROUP # 讀取配置文件類型為json data-type: json #路由存儲規則 rule-type: flow

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM