Alibaba Sentinel超詳細整理(轉)


原文鏈接:https://www.jianshu.com/p/87bec2187912?utm_campaign=haruki&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

 

Alibaba Sentinel 是面向雲原生微服務的流量控制,熔斷降級組件,監控保護你的微服務

 
 

github

為什么要學Alibaba Sentinel?

先來看看Sentinel的前身 Hystrix ,可以翻閱我的文章整理,總結下來有幾點

  1. 需要我們程序員手工搭建監控平台
  2. 沒有一套web界面可以給我們進行更加細粒度配置流控,速率控制,服務熔斷,服務降級...

而Sentinel的優勢

1.單獨一個組件,可以獨立出來
2.直接界面化的細粒度統一配置

有沒有發現跟Nacos很像,我們不需要在手動建立一個部署模塊,直接入駐就可以了,開發簡便很多

Sentinel是什么

分布式系統的流量防衛兵

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

Sentinel 分為兩個部分

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

服務限流配置

實時查看QPS

 
 

 
 

簇點鏈路:查看Http請求

 
 

流控規則 :控制qps,線程等等

 
 

查過峰值,會拋出異常(可自行配置服務降級回調方法)

 
 

閾值關聯 : 當關聯資源/testB的qps閾值超過1時,就限流/testA的Rest訪問地址

 
 

使用postman並發請求接口 testB

 
 

 

發現A接口被限流關閉了 配置生效

 
 

 

預熱 : 每個系統平時處於低水位的情況下,突然來高並發的流量,肯定是承受不住的,要經過預熱后才會使系統達到穩定可以接受的狀態.如不懂得可以看下我的高並發文章詳解JVM調優

 
 

如圖所示,閾值是10 但希望五秒內慢慢啟動起來,也就是根據源碼里的公示,即請求QPS從(threashold/3)開始,經多少預熱時長才逐漸升至設定的QPS閾值

 
 

來自於:com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController,冷加載因子默認是3

他的作用體現在,如果一個秒殺系統在開啟的瞬間,會有很多流量上來,很有可能把系統打死,預熱方式就是為了保護系統,可慢慢的把流量放進來,慢慢的把閾值增長到設置的閾值

隊列等待(常用)

勻速排隊,讓請求以均勻的速度通過,閾值類型必須需設成QPS,否則無效

 
 

如圖所示,每秒請求1次,超過的話就排隊等待,等待時間0.5秒

這種方式主要用於處理間隔性突發流量,例如消息隊列,在某一秒有大量的請求道來,而接下來的幾秒則處於空閑狀態,我們希望系統能夠在接下來的空閑期間逐漸處理這些請求,而不是一秒直接拒絕多余的請求

服務降級配置

Sentinel 熔斷降級會在調用鏈路中某個資源出現不穩定狀態時,例如調用超時或異常比例升高,對這個資源的調用進行限制,讓請求快速失敗,避免影響到其他的資源而導致級聯錯誤

當資源被降級后,在接下來的降級時間窗口之內,對該資源的調用都自動熔斷(默認拋出DegradeException)

 
 
  • RT

每秒平均響應時間,超過閾值,且時間窗口內通過的請求>=5,兩個條件同時滿足觸發降級,RT最大4900

  • 異常比例(/s)

QPS>=5 且異常比例超過與知識,觸發降級,時間窗口結束后,關閉降級

  • 異常數(/m)

異常數超過閾值是,觸發降級,時間窗口結束后,關閉降級

熱點配置

熱點即經常訪問的數據,很多時候我們希望統計某個熱點數據中訪問頻次最高的Top K數據,並對其訪問進行限制,熱點參數限流可以看做是一種特殊的流量控制,僅對包含熱點參數的資源調用生效.

 
 
  • 資源名即對應@sentenelResource對應的value
  • 參數索引對應方法參數位置,從第幾個參數開始檢查
  • 閾值,窗口就不用解釋了

@sentenelResource (前身HystrixCommond )

 
 
 
 

每個SentenelResource都應該有個對應的兜底方法,來處理出錯后的返回,不配blockhandler的話會報page Error

高級玩法
普通我們配置熱點參數時候,匹配規則就會返回block,但我們想有特定的參數后,例行放開閾值

 
 

當參數等於5時,可以單獨配置閾值(必須是基本類型)

注意

@sentinelResource處理的是控制台配置的違規情況,有blockHandler方法進行兜底,但java運行時異常不歸他管,這是兩個東西(下面有fallback方法處理)

系統規則

 
 

系統規則自然對應所有入口的rest請求做處理,整體管控,設置有風險,需謹慎

全局自定義限流處理邏輯

在我們上面配置SentinelResource后,有沒有發現每個類里面每個方法都要配置一個blockhandle,又麻煩又代碼膨脹,那我們有沒有一個自定義的全局處理方案呢?

  1. 創建CustomerBlockHandler類用於自定義限流處理邏輯
  2. 定義公共返回值
  3. 創建一個或多個對應blockhandler方法
/** * @program: 杭州品茗信息技術有限公司 * @description * @author: 徐子木 * @create: 2020-12-03 20:18 **/ @Slf4j public class CustomerBlockHandler { public static CommonResult<String> BlocHandler1(BlockException blockException) { return new CommonResult(500,"自定義block1"); } public static CommonResult<String> BlocHandler2(BlockException blockException) { return new CommonResult(500,"自定義block2"); } } 

配置在我們需要保障的方法內

    @GetMapping("/testB") @SentinelResource(value = "testB",blockHandlerClass = CustomerBlockHandler.class,blockHandler = "BlocHandler1") public CommonResult<String> testB() { return new CommonResult(200,"testB"); } 

其實還有一種保障方法,可以用代碼級別來控制,類似try catch,但我不推薦,寫起來又長又麻煩,感興趣的可以去官網查找寫法

服務熔斷Fallback

前面說的SentinelResouce,只會管理我們的服務限流級別的規則采取措施,若java代碼級別的RuntimeException是不歸他管的,該怎么報錯還怎么報錯,這里就要提一個fallback參數

新建全局異常處理類

/** * @program: 杭州品茗信息技術有限公司 * @description * @author: 徐子木 * @create: 2020-12-03 20:48 **/ @Slf4j public class CustomerFallBackHandler { public static CommonResult resultException(Throwable throwable) { return new CommonResult(500,"運行異常回調處理"); } } 

配置要保障的方法

    @GetMapping("/testA") @SentinelResource(value = "testA", fallbackClass = {CustomerFallBackHandler.class}, fallback = "resultException") public CommonResult testA() { int a = 1 / 0; return new CommonResult(200, "testA"); } 

可以看到,原理其實跟block差不多,但細節是如果兩個都配置的話,並且兩種異常都觸發的情況下,誰先觸發就返回誰的回調,正常情況下限流會大於運行異常的

Sentinel與openFeign整合

這里整合就不過多的敘述了,詳細可查官網文檔

大致就是在我們feign的@FeignClient注解里也有fallback的參數,然后配置我們與業務類一直的異常返回類即可,如果調用服務關閉或者異常,會自動觸發我們的服務熔斷降級處理

注意yml 要開啟sentinel對Feign的支持

規則持久化

問題: 在我們配置好規則后,每次重啟微服務,我們先配置好的規則就都消失了

方案: 將限流配置規則持久化進Nacos保存,只要刷新某個rest地址,sentinel控制台的流控規則就能看到,只要Nacos里面的配置不刪除,針對於微服務的流控規則持續有效

解決

  1. 添加maven坐標,將規則持久化進nacos
        <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency> 
  1. 修改yml,將nacos配置文件對應
    sentinel: transport: dashboard: 127.0.0.1:8080 port: 8719 #默認就是8719 如果被占用默認+1 datasource: ds1: nacos: server-addr: 192.168.10.37:18848 dataId: ${spring.application.name} groupId: DEV namespace: 8622d428-0496-4a09-b178-da3cfc736055 data-type: json rule-type: flow 
  1. 配置nacos文件
[ { "resource":"testB", "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表示快速失敗,1表示WarmUp,2表示排隊等待
  • clusterMode: 是否集群


作者:SinceMay
鏈接:https://www.jianshu.com/p/87bec2187912
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

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



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