個人備案網站做企業(yè)網可以嗎北京搜索引擎優(yōu)化主管
目錄
前言
一、什么是Sentinel?
?Sentinel 的主要特性
Sentinel 的開源生態(tài)
二、Sentinel的核心功能
三、Sentinel 的主要優(yōu)勢與特性
1、豐富的流控規(guī)則
?2、完善的熔斷降級機制
3、實時監(jiān)控和控制臺
4、多數(shù)據(jù)源支持
5、擴展性強
四、Sentinel 與 Hystrix 的對比
五、Sentinel安裝與使用
1、Sentineal 控制臺下載與安裝
2、給服務接入sentinel監(jiān)控
3、流控規(guī)則
接口限流
直接流控模式
關聯(lián)流控模式
鏈路流控模式
主要概念
使用場景
4、@SentinelResource注解
基本用法
使用示例
注意事項
總結
前言
隨著微服務架構的普及,如何保證系統(tǒng)的高可用性和穩(wěn)定性成為開發(fā)者必須面對的重要課題。阿里巴巴開源的 Sentinel 作為一款流量防護組件,提供了熔斷、限流、降級等多種功能,幫助開發(fā)者提升系統(tǒng)的容錯能力。本文將記錄 Sentinel 的核心功能及其在 Spring Cloud 中的集成和使用。也希望本文,能夠幫助你們在微服務項目中輕松地集成和使用 Sentinel,提升系統(tǒng)的穩(wěn)定性和容錯能力。
一、什么是Sentinel?
Sentinel 是阿里巴巴開源的流量防護組件,專注于流量控制和系統(tǒng)穩(wěn)定性保護。它提供了豐富的功能,如限流、熔斷降級、系統(tǒng)自適應保護、實時監(jiān)控等,幫助開發(fā)者構建高可用和高穩(wěn)定性的微服務系統(tǒng)。
中文官網:home | Sentinel (sentinelguard.io)
?Sentinel 的主要特性
Sentinel 的開源生態(tài)
二、Sentinel的核心功能
限流:通過多種流量控制策略,實現(xiàn)對熱點數(shù)據(jù)、分布式請求等的限流。
熔斷降級:根據(jù)調用錯誤比例、RT(響應時間)等指標,對不穩(wěn)定的服務進行熔斷,避免級聯(lián)故障。
系統(tǒng)自適應保護:根據(jù)系統(tǒng)的負載情況,動態(tài)調整限流和熔斷策略,保證系統(tǒng)在高負載下的穩(wěn)定性。
實時監(jiān)控:提供實時的監(jiān)控與報警功能,幫助開發(fā)者及時發(fā)現(xiàn)和處理問題。
三、Sentinel 的主要優(yōu)勢與特性
1、豐富的流控規(guī)則
流量整形:支持勻速排隊、預熱、并發(fā)等多種流控策略。
熱點參數(shù)限流:針對傳入參數(shù)進行熱點數(shù)據(jù)的限流保護。
系統(tǒng)自適應保護:根據(jù)系統(tǒng)的負載情況,動態(tài)調整限流和熔斷策略。
?2、完善的熔斷降級機制
基于錯誤比例:在指定時間窗口內,如果請求的錯誤比例超過閾值,則觸發(fā)熔斷。
基于響應時間:在指定時間窗口內,如果請求的平均響應時間超過閾值,則觸發(fā)熔斷。
3、實時監(jiān)控和控制臺
實時監(jiān)控:提供對實時流量、調用關系、鏈路流量等多維度的監(jiān)控。
控制臺:通過可視化的 Dashboard,實時配置和管理限流、熔斷規(guī)則。
4、多數(shù)據(jù)源支持
規(guī)則動態(tài)更新:支持從 Nacos、Apollo、ZooKeeper 等多個數(shù)據(jù)源動態(tài)加載和更新規(guī)則。
5、擴展性強
SPI 擴展:提供 SPI 擴展點,可以自定義流控、熔斷、降級等策略。
四、Sentinel 與 Hystrix 的對比
特性 | Sentinel | Spring Cloud Hystrix |
---|---|---|
限流 | 提供豐富的限流策略,如預熱、勻速排隊、并發(fā)控制等 | 不支持 |
熔斷機制 | 支持基于錯誤比例、響應時間、異常數(shù)量等多種熔斷策略 | 主要基于錯誤比例和響應時間 |
實時監(jiān)控 | 提供完整的實時監(jiān)控和可視化控制臺 | 需要集成 Turbine 和 Hystrix Dashboard |
規(guī)則動態(tài)配置 | 支持多種數(shù)據(jù)源(如 Nacos、Apollo、ZooKeeper)動態(tài)配置規(guī)則 | 通過 Archaius 實現(xiàn),靈活性相對較低 |
擴展性 | 提供豐富的 SPI 擴展點,方便自定義策略 | 擴展性相對較差 |
社區(qū)活躍度 | 社區(qū)活躍,持續(xù)更新 | 2018 年 Netflix 宣布進入維護模式,社區(qū)活躍度降低 |
依賴 | 輕量級,無需依賴額外組件 | 需要依賴 Hystrix Dashboard 和 Turbine 進行監(jiān)控 |
Sentinel 和 Spring Cloud Hystrix 都是優(yōu)秀的服務保護工具,但各有特點。Sentinel 提供了更豐富的限流策略、動態(tài)規(guī)則配置和實時監(jiān)控功能,并且具有更高的擴展性。相比之下,Hystrix 在熔斷和降級方面也有較好的表現(xiàn),但由于Hystrix進入維護模式,其社區(qū)活躍度和新特性支持有所降低。
在選擇時,可以根據(jù)具體需求和項目特點進行權衡。如果需要更強的限流能力、動態(tài)規(guī)則配置和實時監(jiān)控,建議選擇 Sentinel。如果項目已經使用 Hystrix 并且穩(wěn)定運行,也可以繼續(xù)使用 Hystrix。
五、Sentinel安裝與使用
1、Sentineal 控制臺下載與安裝
下載地址:Releases · alibaba/Sentinel (github.com)
選擇jar包下載
通過CMD命令運行
java -jar sentinel-dashboard-1.8.8.jar
如下圖所示,則已啟動成功。
訪問地址:localhost:8080
賬號密碼:都是sentinel
2、給服務接入sentinel監(jiān)控
引入依賴
<!-- sentinel -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>${spring-cloud-alibaba.version}</version>
</dependency>
如果版本不對的話,運行會報錯,sentinel依賴時與web依賴形成循環(huán)依賴。
附上完整的maven依賴
<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><!-- spring boot --><spring-boot.version>2.7.5</spring-boot.version><!-- spring cloud --><spring-cloud.version>2021.0.1</spring-cloud.version><spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version><spring-cloud-starter-alibaba-nacos-config.version>2.1.4.RELEASE</spring-cloud-starter-alibaba-nacos-config.version>
</properties>
配置sentinel
server:port: 9090spring:application:name: demo-usercloud:nacos:discovery:server-addr: 192.168.1.85:8848namespace: democonfig:server-addr: 192.168.1.85:8848prefix: ${spring.application.name}file-extension: ymlnamespace: demosentinel:transport:dashboard: localhost:8080 #配置sentinel dashboard地址
重啟服務,訪問接口localhost:9090/hello/getOrder
這時候在控制臺就可以看到我們的請求了,證明已經監(jiān)控到我們服務
3、流控規(guī)則
流控規(guī)則屬性
資源名: 唯一名稱,默認請求路徑,表示對該資源進行流控
針對來源: Sentinel可以針對調用者進行限流,填寫微服務名,默認default(不區(qū)分來源)
閾值類型/單擊閾值:
QPS:(每秒鐘的請求數(shù)量):當調用該api的QPS達到閾值時,進行限流
線程數(shù):當調用該線程數(shù)達到閾值的時候,進行限流
是否集群:不需要集群
流控模式:
直接: api達到限流條件時,直接限流
關聯(lián): 當關聯(lián)的資源達到閾值時,就限流自己
鏈路: 只記錄指定鏈路上的流量(指定資源從入口資源進來的流量,如果達到閾值,就進行限流)【api級別的針對來源】
流控效果:
快速失敗: 直接失敗,拋異常
Warm Up: 根據(jù)codeFactor(冷加載因子,默認3)的值,從閾值/codeFctor,經過預熱時長,才達到設置的QPS閾值
排隊等待: 勻速排隊,讓請求以勻速的速度通過,閾值類型必須設置為QPS,否則無效
接口限流
直接流控模式
新增流控規(guī)則
資源名指的是我們的接口地址,QPS設置為1,其他都選擇默認值。保存后,我們測試接口調用。
第一次請求是正常響應的。
接下來我們快速請求接口,一秒鐘點擊多次
發(fā)現(xiàn)已經被限流了。
關聯(lián)流控模式
當關聯(lián)的資源達到閾值時,就限流自己,也就是說關聯(lián)的資源(接口),QPS為1時,一秒內被多次請求的時候,自己的接口就會被限流。
如圖所示,hello/addOrder 接口并發(fā)請求,hello/getOrder接口就被限流了。
鏈路流控模式
鏈路流控模式(Chain Mode)是 Sentinel 提供的一種流控模式,主要用于控制資源在特定調用鏈路上的訪問頻率。與一般的直接流控模式不同,鏈路流控模式通過定義調用鏈路來實現(xiàn)更細粒度的流量控制。這對于復雜的分布式系統(tǒng)中,尤其是微服務架構中,控制不同調用路徑的流量非常有用。
主要概念
在鏈路流控模式下,流控規(guī)則會對特定的調用鏈路進行控制。調用鏈路通常由一個入口資源和一個目標資源組成,表示從入口資源到目標資源的一條特定調用路徑。
使用場景
同一資源多入口:當一個資源可以通過多個入口訪問時,可以針對不同入口設置不同的流控規(guī)則。
細粒度流控:對于某些關鍵資源,可以根據(jù)不同的調用鏈路進行更細粒度的流量控制,從而實現(xiàn)精細化管理。
示例:
假設有一個系統(tǒng),其中有一個服務 orderService,它可以通過兩個不同的入口資源 getOrder 和 getOrder2 被調用。我們希望限制通過 getOrder2 入口對 orderService 的調用頻率。
4、@SentinelResource注解
@SentinelResource 是 Sentinel 提供的一個注解,用于定義資源并為其配置流控、熔斷等規(guī)則。在方法上使用 @SentinelResource 注解,可以實現(xiàn)對該方法的流控、降級以及異常處理等功能。
基本用法
?@SentinelResource 的基本屬性包括 value、blockHandler、fallback 等。以下是它的常用屬性及使用示例:
1. value(必填)
描述: 指定資源名稱。該名稱將作為 Sentinel 的資源標識,用于進行流控和降級保護。
類型: String
2. blockHandler
描述: 指定當資源被流控(如限流、降級)時的處理方法。該方法必須與原方法在同一個類中,或者在公共類中。方法簽名要求一致,并且最后一個參數(shù)必須是 BlockException。
類型: String
3. blockHandlerClass
描述: 指定 blockHandler 所在類。如果 blockHandler 方法不在同一個類中,可以通過 blockHandlerClass 指定類。
類型: Class<?>
4. fallback
描述: 指定當資源執(zhí)行發(fā)生異常時的處理方法。方法簽名要求與原方法一致,或者額外帶一個 Throwable 類型的參數(shù)用于接收異常。
類型: String
5. fallbackClass
描述: 指定 fallback 所在類。如果 fallback 方法不在同一個類中,可以通過 fallbackClass 指定類。
類型: Class<?>
6. defaultFallback
描述: 指定通用的默認降級方法,當未指定 fallback 方法或 fallback 方法不可用時,調用此方法。方法必須是靜態(tài)的,且返回類型與原方法一致。
類型: String
7. exceptionsToIgnore
描述: 指定不會觸發(fā) fallback 處理的異常列表。
類型: Class<? extends Throwable>[]
8. exceptionsToTrace
描述: 指定會觸發(fā) fallback 處理的異常列表。默認情況下,所有的異常都會觸發(fā) fallback。
類型: Class<? extends Throwable>[]
使用示例
示例1:
在這個示例中,當訪問 /hello 接口時,若觸發(fā)了流控規(guī)則,handleBlock 方法會被調用返回處理結果。helloResource指的就是流控規(guī)則的資源名
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/hello")@SentinelResource(value = "helloResource", blockHandler = "handleBlock")public String hello() {return "Hello, Sentinel!";}public String handleBlock(BlockException ex) {return "請求已被阻止!";}
}
示例2:
當 /test 接口在執(zhí)行過程中拋出異常時,會調用 fallbackMethod 方法進行處理。
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class FallbackController {@GetMapping("/test")@SentinelResource(value = "testResource", fallback = "fallbackMethod")public String test() {if (Math.random() > 0.5) {throw new RuntimeException("出錯");}return "成功";}public String fallbackMethod(Throwable ex) {return "Fallback: " + ex.getMessage();}
}
示例3:
在這個例子中,當資源觸發(fā)流控時,將調用 ExternalHandler 類中的 externalBlockHandler 方法進行處理。
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ExternalHandlerController {@GetMapping("/external")@SentinelResource(value = "externalResource", blockHandler = "externalBlockHandler", blockHandlerClass = ExternalHandler.class)public String external() {return "這是個示例";}
}class ExternalHandler {// 必須為靜態(tài)方法public static String externalBlockHandler(BlockException ex) {return "請求已被阻止";}
}
注意事項
blockHandler 和 fallback 方法的簽名要求: 這些方法必須和原方法簽名一致,blockHandler 方法額外需要接收一個 BlockException 參數(shù),而 fallback 方法可以選擇性地接收一個 Throwable 參數(shù)。
defaultFallback: 作為全局降級處理方法,必須是 public static 方法,并且參數(shù)和返回類型與原方法一致。
處理類的類加載順序: 如果使用 blockHandlerClass 或 fallbackClass 指定外部類,這些類必須在項目啟動時能夠被加載。
總結
本文介紹了 Sentinel 的核心功能及其在 Spring Cloud 中的集成和使用。Sentinel 提供了豐富的流量控制和系統(tǒng)保護功能,幫助開發(fā)者提升系統(tǒng)的容錯能力和穩(wěn)定性。希望通過本文的學習,能夠幫助你更好地理解和使用 Sentinel,提升微服務項目的穩(wěn)定性和容錯能力。