Springboot?中使用Sentinel的詳細步驟
在 Spring Boot 中使用 Sentinel 非常方便,Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 組件,可以快速將 Sentinel 集成到你的 Spring Boot 應(yīng)用中,并利用其強大的流量控制和容錯能力。
下面是一個詳細的步驟指南
步驟 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 控制臺的地址,以便你可以通過控制臺查看監(jiān)控數(shù)據(jù)和管理規(guī)則。
spring:
application:
name: your-spring-boot-app # 應(yīng)用名稱,Sentinel 控制臺中會顯示
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel 控制臺的地址 (默認端口 8080)
port: 8719 # Sentinel 客戶端與控制臺通信的端口,默認 8719,可以自定義,避免沖突
# 如果需要持久化規(guī)則到 Nacos,還需要配置 Nacos 相關(guān)信息
# nacos:
# config:
# server-addr: your-nacos-server-address:8848注意: 你需要先啟動 Sentinel 控制臺,才能在控制臺中看到你的 Spring Boot 應(yīng)用的監(jiān)控數(shù)據(jù)和配置規(guī)則。 你可以從 Sentinel 的 GitHub 倉庫下載 Sentinel 控制臺的 JAR 包并啟動。
步驟 3: 定義受保護的資源
在 Spring Boot 中,你可以使用以下方式來定義需要 Sentinel 保護的資源:
方式一:使用 @SentinelResource 注解
這是最常用的方式,通過在方法上添加 @SentinelResource 注解,可以聲明該方法為一個受保護的資源。
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 控制臺中會顯示這個名稱。blockHandler = "handleBlock":blockHandler屬性指定了當資源被限流、熔斷等 block 時,應(yīng)該調(diào)用的 blockHandler 方法。handleBlock方法的簽名需要和被保護的方法一致,但最后一個參數(shù)必須是BlockException類型。blockHandler方法負責(zé)處理 block 邏輯,例如返回友好的提示信息或執(zhí)行降級操作。
方式二:編程式 API 定義資源
除了注解,你也可以使用 Sentinel 提供的編程式 API 來定義資源,這種方式更加靈活,可以更細粒度地控制資源的入口和出口。
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"); // 定義資源名
// 被保護的業(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)計中
Tracer.traceEntry(entry, ex);
throw ex;
} finally {
if (entry != null) {
entry.exit(); // 保證 exit() 被調(diào)用,否則會導(dǎo)致統(tǒng)計數(shù)據(jù)不準確
}
}
}
}SphU.entry("myProgrammaticResource"):SphU.entry()方法用于定義一個資源入口,參數(shù)為資源名稱。 它會返回一個Entry對象,用于標記資源的入口。entry.exit(): 在finally塊中調(diào)用entry.exit(),表示資源調(diào)用結(jié)束。 必須確保entry.exit()被調(diào)用,否則會導(dǎo)致 Sentinel 的統(tǒng)計數(shù)據(jù)不準確。BlockException捕獲: 需要捕獲BlockException異常,并處理限流、熔斷等 block 情況。Tracer.traceEntry(entry, ex): 如果業(yè)務(wù)邏輯發(fā)生異常,需要使用Tracer.traceEntry()方法將異常信息記錄到 Sentinel 的異常統(tǒng)計中。
步驟 4: 配置流控規(guī)則
定義了受保護的資源后,你需要配置流控規(guī)則,告訴 Sentinel 如何對這些資源進行保護。 你可以通過以下方式配置規(guī)則:
方式一:在 Sentinel 控制臺配置
這是最推薦的方式,通過 Sentinel 控制臺,你可以可視化地配置和管理規(guī)則,實時生效,無需重啟應(yīng)用。
- 訪問 Sentinel 控制臺: 訪問你在
application.properties中配置的spring.cloud.sentinel.transport.dashboard地址(默認http://localhost:8080)。 - 找到你的應(yīng)用: 在控制臺的 “簇點鏈路” 或 “機器列表” 中找到你的 Spring Boot 應(yīng)用。
- 配置規(guī)則: 在 “流控規(guī)則”、“降級規(guī)則”、“熱點規(guī)則” 等菜單中,為你的資源配置相應(yīng)的規(guī)則。 例如,為 “myResource” 配置一個 QPS 為 2 的流控規(guī)則。
- 按如下操作

添加“流控”規(guī)則

添加“熔斷”機制

方式二:在代碼中編程式配置規(guī)則
你也可以在代碼中編程式地配置規(guī)則,這種方式更適合自動化配置或單元測試。
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 對應(yīng)
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 流控類型:QPS
rule.setCount(2); // QPS 閾值為 2
rules.add(rule);
FlowRuleManager.loadRules(rules); // 加載規(guī)則
}
}FlowRule:FlowRule對象表示一個流控規(guī)則。rule.setResource("myResource"): 指定規(guī)則應(yīng)用于哪個資源,需要與@SentinelResource注解或編程式 API 中定義的資源名稱一致。rule.setGrade(RuleConstant.FLOW_GRADE_QPS): 設(shè)置流控類型為 QPS (每秒請求數(shù))。rule.setCount(2): 設(shè)置 QPS 閾值為 2,即每秒鐘只允許 2 個請求通過。FlowRuleManager.loadRules(rules): 加載配置好的規(guī)則列表。
步驟 5: 啟動 Sentinel 控制臺和 Spring Boot 應(yīng)用
- 啟動 Sentinel 控制臺: 下載 Sentinel 控制臺的 JAR 包,并使用
java -jar sentinel-dashboard.jar命令啟動。 默認訪問地址為http://localhost:8080,默認用戶名密碼都是sentinel。 - 啟動 Spring Boot 應(yīng)用: 啟動你的 Spring Boot 應(yīng)用。
步驟 6: 測試和監(jiān)控
- 訪問受保護的接口: 訪問你應(yīng)用中被
@SentinelResource或編程式 API 保護的接口。 - 觀察 Sentinel 控制臺: 在 Sentinel 控制臺中,你可以看到你的應(yīng)用的監(jiān)控數(shù)據(jù),例如 “簇點鏈路” 中會顯示資源的請求量、通過量、拒絕量、平均響應(yīng)時間等指標。
- 測試流控效果: 嘗試以超過你配置的流控閾值的速率訪問受保護的接口,你會看到部分請求被 Sentinel 攔截,并返回你在
blockHandler方法中定義的提示信息。
高級特性 (可選)
Sentinel 還提供了很多高級特性,你可以根據(jù)實際需求進行探索和使用,例如:
- 降級規(guī)則 (Degrade Rule): 配置熔斷降級規(guī)則,當服務(wù)的錯誤率或響應(yīng)時間超過閾值時,自動熔斷,防止故障擴散。
- 熱點參數(shù)限流 (Hot-spot Param Flow Control): 根據(jù)請求的熱點參數(shù)進行限流,例如根據(jù)用戶 ID、商品 ID 等。
- 系統(tǒng)規(guī)則 (System Rule): 從系統(tǒng)全局負載角度進行保護,例如根據(jù) CPU 使用率、Load、內(nèi)存使用率等進行自適應(yīng)限流。
- 授權(quán)規(guī)則 (Authority Rule): 進行黑白名單授權(quán)控制,限制特定來源的請求訪問。
- 持久化規(guī)則 (Rule Persistence): 將規(guī)則持久化到 Nacos、ZooKeeper、Redis 等配置中心,實現(xiàn)規(guī)則的動態(tài)更新和集群共享。
- 自定義 BlockHandler 和 Fallback: 更靈活地處理 BlockException 和業(yè)務(wù)異常,實現(xiàn)更精細的降級策略。
- 集群流控 (Cluster Flow Control): 對集群中的多個實例進行統(tǒng)一的流量控制。
總結(jié)
使用 Spring Cloud Alibaba Sentinel 在 Spring Boot 中實現(xiàn)限流、熔斷降級是非常簡單的。 通過添加依賴、配置 Sentinel 控制臺地址、定義受保護的資源、配置規(guī)則,你就可以快速為你的 Spring Boot 應(yīng)用增加一層強大的保護屏障,提升系統(tǒng)的穩(wěn)定性和容錯能力。 Sentinel 提供的可視化控制臺和豐富的特性,也使得流量控制和容錯管理更加便捷高效。
到此這篇關(guān)于Springboot 中使用Sentinel的詳細步驟的文章就介紹到這了,更多相關(guān)Springboot 使用Sentinel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Sentinel原理與SpringBoot整合實戰(zhàn)案例講解
- springboot整合sentinel接口熔斷的實現(xiàn)示例
- 在SpringBoot項目中使用Spring Cloud Sentinel實現(xiàn)流量控制
- springboot?整合sentinel的示例代碼
- 詳解Springboot集成sentinel實現(xiàn)接口限流入門
- SpringBoot2.0+阿里巴巴Sentinel動態(tài)限流實戰(zhàn)(附源碼)
- springboot整合sentinel的方法教程
- SpringBoot基于Sentinel在服務(wù)上實現(xiàn)接口限流
- 詳解SpringBoot Redis自適應(yīng)配置(Cluster Standalone Sentinel)
- SpringBoot整合Sentinel啟動失敗及運行時常見錯誤總結(jié)
相關(guān)文章
解決org.apache.ibatis.binding.BindingException:?Invalid?boun
這篇文章主要介紹了解決org.apache.ibatis.binding.BindingException:?Invalid?bound?statement?(not?found)問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05
Java8中LocalDateTime與時間戳timestamp的互相轉(zhuǎn)換
這篇文章主要給大家介紹了關(guān)于Java8中LocalDateTime與時間戳timestamp的互相轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Spring @value和@PropertySource注解使用方法解析
這篇文章主要介紹了Spring @value和@PropertySource注解使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
TransactionSynchronization的invokeAfterCompletion事務(wù)源碼解析
這篇文章主要為大家介紹了TransactionSynchronization的invokeAfterCompletion事務(wù)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
基于Elasticsearch5.4的常見問題總結(jié)
下面小編就為大家分享一篇基于Elasticsearch5.4的常見問題總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
Spring?Boot?實現(xiàn)?WebSocket?的代碼示例
WebSocket?協(xié)議是獨立的基于?TCP?協(xié)議。它與?HTTP?的唯一關(guān)系是,它的握手會被?HTTP?服務(wù)器解釋為?Upgrade?請求,接下來通過本文給大家介紹Spring?Boot?實現(xiàn)?WebSocket?示例詳解,需要的朋友可以參考下2022-04-04
基于SpringBoot整合SSMP案例(開啟日志與分頁查詢條件查詢功能實現(xiàn))
這篇文章主要介紹了基于SpringBoot整合SSMP案例(開啟日志與分頁查詢條件查詢功能實現(xiàn)),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋參考下吧2023-11-11
Spring Data環(huán)境搭建實現(xiàn)過程解析
這篇文章主要介紹了Spring Data環(huán)境搭建實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08

