最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot集成Sentinel?組件實(shí)現(xiàn)基本限流功能(快速入門)

 更新時間:2025年12月27日 15:00:45   作者:firechili  
Sentinel是阿里巴巴開發(fā)的面向云原生微服務(wù)的高可用流控防護(hù)組件,支持流量控制、熔斷降級、系統(tǒng)負(fù)載保護(hù)等多維度防護(hù),適用于秒殺、消息削峰填谷等場景,本文給大家介紹Springboot集成Sentinel組件實(shí)現(xiàn)基本限流功能,感興趣的朋友跟隨小編一起看看吧

概述

Sentinel 是面向云原生微服務(wù)的高可用流控防護(hù)組件,以流量為切入點(diǎn),從流量控制、熔斷降級、系統(tǒng)負(fù)載保護(hù)等多個維度保障服務(wù)穩(wěn)定性。阿里巴巴在近10年雙十一大促中成功驗證了Sentinel在高并發(fā)場景下的可靠性。

核心概念

資源 (Resource)

資源是Sentinel的核心概念,可以是:

  • 應(yīng)用程序提供的服務(wù)
  • 調(diào)用的外部服務(wù)
  • URL地址
  • 方法簽名
  • 代碼片段

規(guī)則 (Rule)

圍繞資源的實(shí)時狀態(tài)設(shè)定的策略:

  • 流量控制規(guī)則
  • 熔斷降級規(guī)則
  • 系統(tǒng)保護(hù)規(guī)則
  • 所有規(guī)則支持動態(tài)實(shí)時調(diào)整

核心特性

特性描述
豐富的應(yīng)用場景支持秒殺、消息削峰填谷、集群流量控制、實(shí)時熔斷等
完備的實(shí)時監(jiān)控提供秒級監(jiān)控數(shù)據(jù),支持500臺以下集群匯總
廣泛的開源生態(tài)支持Spring Cloud/Dubbo/gRPC/Quarkus等框架
SPI擴(kuò)展機(jī)制提供定制規(guī)則管理、動態(tài)數(shù)據(jù)源適配等擴(kuò)展能力

系統(tǒng)架構(gòu)大概長這樣

快速入門:核心庫使用

1. 添加Maven依賴

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.6</version>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>1.8.6</version>
</dependency>

2、通過硬編碼方式設(shè)定流控規(guī)則,主要有攔截器和注解兩種方式(不夠靈活,不推薦)

2.1、使用攔截器對所有請求進(jìn)行限流攔截

@Component
public class FlowLimitInterceptor implements HandlerInterceptor {
    private static final Logger log = LoggerFactory.getLogger(FlowLimitInterceptor.class);
    private final ObjectMapper objectMapper;
    public FlowLimitInterceptor(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    } 
     // SmallNovel 項目所有的資源,名稱只用于標(biāo)識,建議易于理解即可
    private static final String SMALL_NOVEL_RESOURCE = "SmallNovelResource";
	//靜態(tài)代碼塊使規(guī)則在類加載時就初始化了
    static {
        // 接口限流規(guī)則:所有的請求,限制每秒最多只能通過 2000 個,超出限制勻速排隊
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule1 = new FlowRule();
        rule1.setResource(SMALL_NOVEL_RESOURCE);
        rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 設(shè)置 QPS 限流 2000.
        rule1.setCount(2000);
        rule1.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);
        rules.add(rule1);
        FlowRuleManager.loadRules(rules);
        // 接口防刷規(guī)則 1:所有的請求,限制每個 IP 每秒最多只能通過 50 個,超出限制直接拒絕
        ParamFlowRule rule2 = new ParamFlowRule(SMALL_NOVEL_RESOURCE)
                .setParamIdx(0)
                .setCount(50);
        // 接口防刷規(guī)則 2:所有的請求,限制每個 IP 每分鐘最多只能通過 1000 個,超出限制直接拒絕
        ParamFlowRule rule3 = new ParamFlowRule(SMALL_NOVEL_RESOURCE)
                .setParamIdx(0)
                .setCount(1000)
                .setDurationInSec(60);
        ParamFlowRuleManager.loadRules(Arrays.asList(rule2, rule3));
    }
    @Override
    public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) throws Exception {
        String ip = IpUtils.getRealIp(request);
        Entry entry = null;
        try {
            entry = SphU.entry(SMALL_NOVEL_RESOURCE, EntryType.IN, 1, ip);
            return HandlerInterceptor.super.preHandle(request, response, handler);
        } catch (BlockException ex) {
            log.info("IP:{}被限流了!", ip);
            response.setCharacterEncoding(StandardCharsets.UTF_8.name());
            response.setContentType(MediaType.APPLICATION_JSON_VALUE);
            response.getWriter()
                    .write(錯誤信息);
        } finally {
            if (entry != null) {
                entry.exit(1, ip);
            }
        }
        return false;
    }
}

然后將攔截器注冊到webconfig

@Configuration
public class WebConfig implements WebMvcConfigurer {
    private final FlowLimitInterceptor flowLimitInterceptor;
    public WebConfig(FlowLimitInterceptor flowLimitInterceptor) {
        this.flowLimitInterceptor = flowLimitInterceptor; }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 流量限制攔截器
        registry.addInterceptor(flowLimitInterceptor)
                .addPathPatterns("/**")
                .order(0);
}
}

2.2、使用spring切面技術(shù)配合注解使用Sentinel組件

 配置Sentinel切面

@Configuration
public class SentinelAspectConfig {
    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}

使用注解定義受保護(hù)資源

@Service
public class OrderService {
    @SentinelResource(
        value = "createOrder", 
        blockHandler = "handleFlowBlock",
        blockHandlerClass = OrderServiceBlockHandler.class
    )
    public String createOrder() {
        // 業(yè)務(wù)邏輯
        return "訂單創(chuàng)建成功";
    }
    // 異常處理函數(shù)(可選)
    public String handleException(Throwable ex) {
        return "服務(wù)異常: " + ex.getMessage();
    }
}

注意:注解方式埋點(diǎn)不支持 private 方法

實(shí)現(xiàn)流控處理邏輯

public class OrderServiceBlockHandler {
    // 流控處理函數(shù)需滿足:
    // 1. public static修飾
    // 2. 返回類型與原方法相同
    // 3. 參數(shù)列表包含原方法所有參數(shù) + BlockException
    public static String handleFlowBlock(BlockException ex) {
        return "請求過于頻繁,請稍后重試!觸發(fā)規(guī)則: " + ex.getRule().getResource();
    }
}

初始化流控規(guī)則

@Component
public class SentinelRuleInitializer {
    @PostConstruct
    public void initFlowRules() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("createOrder");   // 資源名稱
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // QPS限流模式
        rule.setCount(2);                 // 閾值:2次/秒
        rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT); 
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

高級配置選項

流量控制行為

// 在FlowRule中設(shè)置
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP); // 預(yù)熱模式
rule.setWarmUpPeriodSec(10); // 預(yù)熱時間(秒)

rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER); // 勻速排隊
rule.setMaxQueueingTimeMs(500); // 最大排隊時間

熔斷降級規(guī)則

List<DegradeRule> degradeRules = new ArrayList<>();
DegradeRule degradeRule = new DegradeRule();
degradeRule.setResource("createOrder");
degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT); // 異常數(shù)模式
degradeRule.setCount(5); // 異常數(shù)閾值
degradeRule.setTimeWindow(30); // 熔斷時長(秒)
degradeRules.add(degradeRule);
DegradeRuleManager.loadRules(degradeRules);

最佳實(shí)踐

  • 資源命名規(guī)范:使用 服務(wù)名:接口名 格式(如 orderService:createOrder
  • 規(guī)則管理:生產(chǎn)環(huán)境推薦通過控制臺動態(tài)管理規(guī)則
  • 監(jiān)控集成:結(jié)合控制臺實(shí)時監(jiān)控流量和系統(tǒng)負(fù)載
  • 默認(rèn)降級:為所有資源配置全局默認(rèn)的 blockHandler
  • 多層次防護(hù):結(jié)合流量控制+熔斷降級+系統(tǒng)保護(hù)形成立體防護(hù)

3、控制臺部署與使用(最推薦的方式)

# 下載控制臺JAR包
wget https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar
# 啟動控制臺(默認(rèn)端口8080)
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard-1.8.6.jar

控制臺功能:

  • 實(shí)時監(jiān)控集群/單機(jī)QPS、響應(yīng)時間
  • 動態(tài)管理流控/降級/系統(tǒng)規(guī)則
  • 機(jī)器發(fā)現(xiàn)與管理
  • 調(diào)用鏈路分析

常見問題解決

  • 規(guī)則不生效
    • 檢查資源名稱是否一致
    • 確認(rèn)規(guī)則已正確加載(通過 FlowRuleManager.getRules() 驗證)
  • blockHandler未觸發(fā)
    • 檢查函數(shù)簽名是否符合要求(static、參數(shù)列表)
    • 確認(rèn)aspectj依賴已添加且切面配置生效
  • 控制臺無數(shù)據(jù)顯示
    • 檢查應(yīng)用與控制臺網(wǎng)絡(luò)連通性
    • 添加JVM參數(shù):-Dcsp.sentinel.dashboard.server=consoleIp:port
  • 輸出日志位置配置
    • 在啟動應(yīng)用時添加 JVM 參數(shù) java -Dcsp.sentinel.log.dir=/var/log/sentinel -jar your-application.jar
    • 在應(yīng)用的 classpath 下創(chuàng)建 sentinel.properties 文件

# 設(shè)置日志目錄

csp.sentinel.log.dir=/var/log/sentinel

# 日志文件最大數(shù)量(默認(rèn)7)

csp.sentinel.log.max.file.count=14

# 單個日志文件大?。J(rèn)300MB)

csp.sentinel.log.max.file.size=1073741824  # 1GB

# 日志輸出類型(file 或 console)

csp.sentinel.log.output.type=file

通過系統(tǒng)環(huán)境變量配置

# Linux/macOS
export SENTINEL_LOG_DIR=/var/log/sentinel
# Windows
set SENTINEL_LOG_DIR=C:\logs\sentinel  

性能優(yōu)化建議

  • 集群流控:對于分布式系統(tǒng),啟用集群流控模式
  • 熱點(diǎn)參數(shù)限流:對特定參數(shù)(如用戶ID)實(shí)施精細(xì)控制
  • 異步調(diào)用支持:結(jié)合Async注解實(shí)現(xiàn)非阻塞限流
  • 規(guī)則持久化:集成Nacos/ZooKeeper實(shí)現(xiàn)規(guī)則持久存儲

Sentinel通過精細(xì)化的流量控制和多種防護(hù)機(jī)制,為微服務(wù)架構(gòu)提供可靠的穩(wěn)定性保障。建議生產(chǎn)環(huán)境結(jié)合控制臺使用,充分發(fā)揮動態(tài)配置和實(shí)時監(jiān)控的優(yōu)勢。

到此這篇關(guān)于Springboot集成Sentinel 組件實(shí)現(xiàn)基本限流功能(快速入門)的文章就介紹到這了,更多相關(guān)Springboot Sentinel 限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis plus開發(fā)過程中遇到的問題記錄及解決

    mybatis plus開發(fā)過程中遇到的問題記錄及解決

    這篇文章主要介紹了mybatis plus開發(fā)過程中遇到的問題記錄及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • IDEA接入Deepseek的圖文教程

    IDEA接入Deepseek的圖文教程

    在本篇文章中,我們將詳細(xì)介紹如何在 JetBrains IDEA 中使用 Continue 插件接入 DeepSeek,讓你的 AI 編程助手更智能,提高開發(fā)效率,感興趣的小伙伴跟著小編一起來看看吧
    2025-03-03
  • SpringBoot項目啟動失敗的常見錯誤總結(jié)

    SpringBoot項目啟動失敗的常見錯誤總結(jié)

    文章總結(jié)了SpringBoot項目啟動失敗的常見錯誤及其解決方法,涵蓋了項目識別與依賴問題、配置文件問題、環(huán)境配置問題、依賴與Bean注入問題、數(shù)據(jù)庫連接問題、啟動類問題以及其他常見問題,需要的朋友可以參考下
    2025-11-11
  • Java圖片處理 (文字水印、圖片水印、縮放、補(bǔ)白)代碼實(shí)例

    Java圖片處理 (文字水印、圖片水印、縮放、補(bǔ)白)代碼實(shí)例

    這篇文章主要介紹了Java圖片處理 (文字水印、圖片水印、縮放、補(bǔ)白)代碼實(shí)例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-06-06
  • MyBatis和MyBatis Plus并存問題及解決

    MyBatis和MyBatis Plus并存問題及解決

    最近需要使用MyBatis和MyBatis Plus,就會導(dǎo)致MyBatis和MyBatis Plus并存,本文主要介紹了MyBatis和MyBatis Plus并存問題及解決,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • Spring中的AOP動態(tài)代理源碼詳解

    Spring中的AOP動態(tài)代理源碼詳解

    這篇文章主要介紹了Spring中的AOP動態(tài)代理源碼詳解,AOP即面向切面編程也稱面向方面編程,它是面向?qū)ο缶幊蘋OP的一種補(bǔ)充,目前已成為一種比較成熟的編程方式,本文就其源碼進(jìn)行解析,需要的朋友可以參考下
    2023-09-09
  • 關(guān)于Swagger注釋API的使用說明

    關(guān)于Swagger注釋API的使用說明

    這篇文章主要介紹了關(guān)于Swagger注釋API的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Idea配置Maven阿里云鏡像加速的實(shí)現(xiàn)

    Idea配置Maven阿里云鏡像加速的實(shí)現(xiàn)

    這篇文章主要介紹了Idea配置Maven阿里云鏡像加速的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java?switch?case語句舉例詳解

    Java?switch?case語句舉例詳解

    這篇文章主要給大家介紹了關(guān)于Java?switch?case語句舉例詳解的相關(guān)資料,switch case語句是一種流程控制語句,用于根據(jù)不同的條件執(zhí)行不同的代碼塊,需要的朋友可以參考下
    2023-10-10
  • shardingsphere-jdbc5.5.1分庫分表實(shí)戰(zhàn)

    shardingsphere-jdbc5.5.1分庫分表實(shí)戰(zhàn)

    本文主要介紹了shardingsphere-jdbc5.5.1分庫分表實(shí)戰(zhàn),解決了分表和讀寫分離的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01

最新評論

宣威市| 广汉市| 鹤岗市| 淮北市| 梅州市| 淄博市| 卢湾区| 施秉县| 博客| 贵港市| 方正县| 鹤壁市| 阳西县| 富民县| 晋城| 神农架林区| 东乡| 兴和县| 政和县| 宁阳县| 武威市| 八宿县| 江陵县| 大方县| 禹城市| 称多县| 南城县| 五寨县| 连州市| 莫力| 天峻县| 连州市| 彭州市| 巴林右旗| 钟山县| 永靖县| 铁岭县| 彰武县| 北辰区| 吉林市| 交口县|