Springboot?中使用Sentinel的詳細(xì)步驟
在 Spring Boot 中使用 Sentinel 非常方便,Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel
組件,可以快速將 Sentinel 集成到你的 Spring Boot 應(yīng)用中,并利用其強(qiáng)大的流量控制和容錯(cuò)能力。
下面是一個(gè)詳細(xì)的步驟指南
步驟 1: 添加 Sentinel 依賴
首先,需要在你的 pom.xml
文件中添加 Spring Cloud Alibaba Sentinel 的依賴。確保你已經(jīng)配置了 Spring Cloud Alibaba 的依賴管理 (spring-cloud-alibaba-dependencies
)。
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
如果你需要使用 Sentinel 的持久化功能,例如將規(guī)則持久化到 Nacos 配置中心,還需要添加相應(yīng)的依賴,例如:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>
步驟 2: 配置 Sentinel
在 application.properties
或 application.yml
文件中配置 Sentinel 的基本信息。 至少需要配置 Sentinel 控制臺(tái)的地址,以便你可以通過控制臺(tái)查看監(jiān)控?cái)?shù)據(jù)和管理規(guī)則。
spring: application: name: your-spring-boot-app # 應(yīng)用名稱,Sentinel 控制臺(tái)中會(huì)顯示 cloud: sentinel: transport: dashboard: localhost:8080 # Sentinel 控制臺(tái)的地址 (默認(rèn)端口 8080) port: 8719 # Sentinel 客戶端與控制臺(tái)通信的端口,默認(rèn) 8719,可以自定義,避免沖突 # 如果需要持久化規(guī)則到 Nacos,還需要配置 Nacos 相關(guān)信息 # nacos: # config: # server-addr: your-nacos-server-address:8848
注意: 你需要先啟動(dòng) Sentinel 控制臺(tái),才能在控制臺(tái)中看到你的 Spring Boot 應(yīng)用的監(jiān)控?cái)?shù)據(jù)和配置規(guī)則。 你可以從 Sentinel 的 GitHub 倉(cāng)庫下載 Sentinel 控制臺(tái)的 JAR 包并啟動(dòng)。
步驟 3: 定義受保護(hù)的資源
在 Spring Boot 中,你可以使用以下方式來定義需要 Sentinel 保護(hù)的資源:
方式一:使用 @SentinelResource
注解
這是最常用的方式,通過在方法上添加 @SentinelResource
注解,可以聲明該方法為一個(gè)受保護(hù)的資源。
import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import org.springframework.stereotype.Service; @Service public class MyService { @SentinelResource(value = "myResource", blockHandler = "handleBlock") public String doSomething() { // 業(yè)務(wù)邏輯 return "Success"; } // BlockHandler 方法,用于處理 BlockException,即限流、熔斷等 block 情況 public String handleBlock(BlockException e) { return "Blocked by Sentinel: " + e.getClass().getSimpleName(); // 返回被 Sentinel 攔截的提示信息 } }
@SentinelResource(value = "myResource")
:value
屬性指定資源的名稱,在 Sentinel 控制臺(tái)中會(huì)顯示這個(gè)名稱。blockHandler = "handleBlock"
:blockHandler
屬性指定了當(dāng)資源被限流、熔斷等 block 時(shí),應(yīng)該調(diào)用的 blockHandler 方法。handleBlock
方法的簽名需要和被保護(hù)的方法一致,但最后一個(gè)參數(shù)必須是BlockException
類型。blockHandler
方法負(fù)責(zé)處理 block 邏輯,例如返回友好的提示信息或執(zhí)行降級(jí)操作。
方式二:編程式 API 定義資源
除了注解,你也可以使用 Sentinel 提供的編程式 API 來定義資源,這種方式更加靈活,可以更細(xì)粒度地控制資源的入口和出口。
import com.alibaba.csp.sentinel.Entry; import com.alibaba.csp.sentinel.SphU; import com.alibaba.csp.sentinel.Tracer; import com.alibaba.csp.sentinel.slots.block.BlockException; import org.springframework.stereotype.Service; @Service public class MyService { public String doSomethingProgrammatically() { Entry entry = null; try { entry = SphU.entry("myProgrammaticResource"); // 定義資源名 // 被保護(hù)的業(yè)務(wù)邏輯 return "Success from Programmatic Resource"; } catch (BlockException e) { // 處理 BlockException,例如限流、熔斷等 return "Blocked by Sentinel (Programmatic): " + e.getClass().getSimpleName(); } catch (Exception ex) { // 業(yè)務(wù)邏輯異常,需要記錄到 Sentinel 的異常統(tǒng)計(jì)中 Tracer.traceEntry(entry, ex); throw ex; } finally { if (entry != null) { entry.exit(); // 保證 exit() 被調(diào)用,否則會(huì)導(dǎo)致統(tǒng)計(jì)數(shù)據(jù)不準(zhǔn)確 } } } }
SphU.entry("myProgrammaticResource")
:SphU.entry()
方法用于定義一個(gè)資源入口,參數(shù)為資源名稱。 它會(huì)返回一個(gè)Entry
對(duì)象,用于標(biāo)記資源的入口。entry.exit()
: 在finally
塊中調(diào)用entry.exit()
,表示資源調(diào)用結(jié)束。 必須確保entry.exit()
被調(diào)用,否則會(huì)導(dǎo)致 Sentinel 的統(tǒng)計(jì)數(shù)據(jù)不準(zhǔn)確。BlockException
捕獲: 需要捕獲BlockException
異常,并處理限流、熔斷等 block 情況。Tracer.traceEntry(entry, ex)
: 如果業(yè)務(wù)邏輯發(fā)生異常,需要使用Tracer.traceEntry()
方法將異常信息記錄到 Sentinel 的異常統(tǒng)計(jì)中。
步驟 4: 配置流控規(guī)則
定義了受保護(hù)的資源后,你需要配置流控規(guī)則,告訴 Sentinel 如何對(duì)這些資源進(jìn)行保護(hù)。 你可以通過以下方式配置規(guī)則:
方式一:在 Sentinel 控制臺(tái)配置
這是最推薦的方式,通過 Sentinel 控制臺(tái),你可以可視化地配置和管理規(guī)則,實(shí)時(shí)生效,無需重啟應(yīng)用。
- 訪問 Sentinel 控制臺(tái): 訪問你在
application.properties
中配置的spring.cloud.sentinel.transport.dashboard
地址(默認(rèn)http://localhost:8080
)。 - 找到你的應(yīng)用: 在控制臺(tái)的 “簇點(diǎn)鏈路” 或 “機(jī)器列表” 中找到你的 Spring Boot 應(yīng)用。
- 配置規(guī)則: 在 “流控規(guī)則”、“降級(jí)規(guī)則”、“熱點(diǎn)規(guī)則” 等菜單中,為你的資源配置相應(yīng)的規(guī)則。 例如,為 “myResource” 配置一個(gè) QPS 為 2 的流控規(guī)則。
- 按如下操作
添加“流控”規(guī)則
添加“熔斷”機(jī)制
方式二:在代碼中編程式配置規(guī)則
你也可以在代碼中編程式地配置規(guī)則,這種方式更適合自動(dòng)化配置或單元測(cè)試。
import com.alibaba.csp.sentinel.slots.block.RuleConstant; import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @Component public class FlowRuleConfig implements CommandLineRunner { @Override public void run(String... args) throws Exception { initFlowRules(); } private void initFlowRules() { List<FlowRule> rules = new ArrayList<>(); FlowRule rule = new FlowRule(); rule.setResource("myResource"); // 資源名稱,與 @SentinelResource 注解中的 value 對(duì)應(yīng) rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 流控類型:QPS rule.setCount(2); // QPS 閾值為 2 rules.add(rule); FlowRuleManager.loadRules(rules); // 加載規(guī)則 } }
FlowRule
:FlowRule
對(duì)象表示一個(gè)流控規(guī)則。rule.setResource("myResource")
: 指定規(guī)則應(yīng)用于哪個(gè)資源,需要與@SentinelResource
注解或編程式 API 中定義的資源名稱一致。rule.setGrade(RuleConstant.FLOW_GRADE_QPS)
: 設(shè)置流控類型為 QPS (每秒請(qǐng)求數(shù))。rule.setCount(2)
: 設(shè)置 QPS 閾值為 2,即每秒鐘只允許 2 個(gè)請(qǐng)求通過。FlowRuleManager.loadRules(rules)
: 加載配置好的規(guī)則列表。
步驟 5: 啟動(dòng) Sentinel 控制臺(tái)和 Spring Boot 應(yīng)用
- 啟動(dòng) Sentinel 控制臺(tái): 下載 Sentinel 控制臺(tái)的 JAR 包,并使用
java -jar sentinel-dashboard.jar
命令啟動(dòng)。 默認(rèn)訪問地址為http://localhost:8080
,默認(rèn)用戶名密碼都是sentinel
。 - 啟動(dòng) Spring Boot 應(yīng)用: 啟動(dòng)你的 Spring Boot 應(yīng)用。
步驟 6: 測(cè)試和監(jiān)控
- 訪問受保護(hù)的接口: 訪問你應(yīng)用中被
@SentinelResource
或編程式 API 保護(hù)的接口。 - 觀察 Sentinel 控制臺(tái): 在 Sentinel 控制臺(tái)中,你可以看到你的應(yīng)用的監(jiān)控?cái)?shù)據(jù),例如 “簇點(diǎn)鏈路” 中會(huì)顯示資源的請(qǐng)求量、通過量、拒絕量、平均響應(yīng)時(shí)間等指標(biāo)。
- 測(cè)試流控效果: 嘗試以超過你配置的流控閾值的速率訪問受保護(hù)的接口,你會(huì)看到部分請(qǐng)求被 Sentinel 攔截,并返回你在
blockHandler
方法中定義的提示信息。
高級(jí)特性 (可選)
Sentinel 還提供了很多高級(jí)特性,你可以根據(jù)實(shí)際需求進(jìn)行探索和使用,例如:
- 降級(jí)規(guī)則 (Degrade Rule): 配置熔斷降級(jí)規(guī)則,當(dāng)服務(wù)的錯(cuò)誤率或響應(yīng)時(shí)間超過閾值時(shí),自動(dòng)熔斷,防止故障擴(kuò)散。
- 熱點(diǎn)參數(shù)限流 (Hot-spot Param Flow Control): 根據(jù)請(qǐng)求的熱點(diǎn)參數(shù)進(jìn)行限流,例如根據(jù)用戶 ID、商品 ID 等。
- 系統(tǒng)規(guī)則 (System Rule): 從系統(tǒng)全局負(fù)載角度進(jìn)行保護(hù),例如根據(jù) CPU 使用率、Load、內(nèi)存使用率等進(jìn)行自適應(yīng)限流。
- 授權(quán)規(guī)則 (Authority Rule): 進(jìn)行黑白名單授權(quán)控制,限制特定來源的請(qǐng)求訪問。
- 持久化規(guī)則 (Rule Persistence): 將規(guī)則持久化到 Nacos、ZooKeeper、Redis 等配置中心,實(shí)現(xiàn)規(guī)則的動(dòng)態(tài)更新和集群共享。
- 自定義 BlockHandler 和 Fallback: 更靈活地處理 BlockException 和業(yè)務(wù)異常,實(shí)現(xiàn)更精細(xì)的降級(jí)策略。
- 集群流控 (Cluster Flow Control): 對(duì)集群中的多個(gè)實(shí)例進(jìn)行統(tǒng)一的流量控制。
總結(jié)
使用 Spring Cloud Alibaba Sentinel 在 Spring Boot 中實(shí)現(xiàn)限流、熔斷降級(jí)是非常簡(jiǎn)單的。 通過添加依賴、配置 Sentinel 控制臺(tái)地址、定義受保護(hù)的資源、配置規(guī)則,你就可以快速為你的 Spring Boot 應(yīng)用增加一層強(qiáng)大的保護(hù)屏障,提升系統(tǒng)的穩(wěn)定性和容錯(cuò)能力。 Sentinel 提供的可視化控制臺(tái)和豐富的特性,也使得流量控制和容錯(cuò)管理更加便捷高效。
到此這篇關(guān)于Springboot 中使用Sentinel的詳細(xì)步驟的文章就介紹到這了,更多相關(guān)Springboot 使用Sentinel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot整合sentinel接口熔斷的實(shí)現(xiàn)示例
- 在SpringBoot項(xiàng)目中使用Spring Cloud Sentinel實(shí)現(xiàn)流量控制
- springboot?整合sentinel的示例代碼
- 詳解Springboot集成sentinel實(shí)現(xiàn)接口限流入門
- SpringBoot2.0+阿里巴巴Sentinel動(dòng)態(tài)限流實(shí)戰(zhàn)(附源碼)
- springboot整合sentinel的方法教程
- SpringBoot基于Sentinel在服務(wù)上實(shí)現(xiàn)接口限流
- 詳解SpringBoot Redis自適應(yīng)配置(Cluster Standalone Sentinel)
相關(guān)文章
Idea進(jìn)行pull的時(shí)候Your local changes would be
這篇文章主要介紹了Idea進(jìn)行pull的時(shí)候Your local changes would be overwritten by merge.具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Java添加事件監(jiān)聽的四種方法代碼實(shí)例
這篇文章主要介紹了Java添加事件監(jiān)聽的四種方法代碼實(shí)例,本文直接給出代碼示例,并用注釋說明,需要的朋友可以參考下2014-09-09java中int、double、char等變量的取值范圍詳析
這篇文章主要給大家介紹了關(guān)于java中int、double、char等變量取值范圍的相關(guān)資料,每個(gè)變量都給出了詳細(xì)的實(shí)例代碼,對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-10-10java中的常見幾種發(fā)送http請(qǐng)求實(shí)例
在Java編程中,發(fā)送HTTP請(qǐng)求是一個(gè)常見需求,常用的方法有四種:HttpURLConnection、URLConnection、HttpClient以及Socket,其中,使用HttpClient方式時(shí),需要添加額外的庫支持2024-11-11超詳細(xì)講解SpringBoot參數(shù)校驗(yàn)實(shí)例
經(jīng)常需要提供接口與用戶交互(獲取數(shù)據(jù)、上傳數(shù)據(jù)等),由于這個(gè)過程需要用戶進(jìn)行相關(guān)的操作,為了避免出現(xiàn)一些錯(cuò)誤的數(shù)據(jù)等,一般需要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),下面這篇文章主要給大家介紹了關(guān)于SpringBoot各種參數(shù)校驗(yàn)的相關(guān)資料,需要的朋友可以參考下2022-05-05