当前位置: 首页 > news >正文

Sentinel热点参数限流完整示例实现

Sentinel热点参数限流完整示例实现

1. 添加Maven依赖 (pom.xml)
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2.2.7.RELEASE</version>
</dependency>
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId><version>1.8.6</version>
</dependency>
2. 配置文件 (application.yml)
spring:cloud:sentinel:transport:dashboard: localhost:8080  # Sentinel控制台地址port: 8719datasource:ds1:nacos:server-addr: localhost:8848dataId: ${spring.application.name}-sentinelgroupId: DEFAULT_GROUPrule-type: param-flow# 自定义限流规则配置
sentinel:hot-param:activity-qps: 100  # 活动ID参数限流阈值
3. 热点参数限流规则配置类

创建 config/SentinelConfig.java:

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowItem;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;@Configuration
public class SentinelConfig {@Value("${sentinel.hot-param.activity-qps:100}")private int activityQps;@PostConstructpublic void initParamFlowRules() {List<ParamFlowRule> rules = new ArrayList<>();// 拼团活动热点参数限流规则ParamFlowRule activityRule = new ParamFlowRule();activityRule.setResource("createGroupActivity"); // 资源名称activityRule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 限流阈值类型(QPS)activityRule.setCount(activityQps); // 限流阈值activityRule.setParamIdx(1); // 参数索引,0表示第一个参数,1表示第二个参数// 例外项配置 (可选)List<ParamFlowItem> paramItems = new ArrayList<>();// 对特定活动ID设置不同的阈值paramItems.add(new ParamFlowItem().setObject(String.valueOf(1001)).setCount(200).setClassType(String.class.getName()));activityRule.setParamFlowItemList(paramItems);rules.add(activityRule);ParamFlowRuleManager.loadRules(rules);}
}
4. 服务中使用热点参数限流

创建 GroupActivityServiceImpl.java:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;@Service
@Slf4j
public class GroupActivityServiceImpl implements GroupActivityService {/*** 创建拼团活动接口,对活动ID进行热点参数限流* @param userId 用户ID* @param activityId 活动ID (热点参数)* @param dto 创建活动DTO* @return 活动创建结果*/@Override@SentinelResource(value = "createGroupActivity", // 资源名称,需与规则中配置一致blockHandler = "createGroupActivityBlockHandler", // 限流降级处理方法fallback = "createGroupActivityFallback" // 异常降级处理方法)public String createGroupActivity(Long userId, String activityId, GroupActivityCreateDTO dto) {// 业务逻辑实现log.info("用户{}创建拼团活动: {}", userId, activityId);return "活动创建成功: " + activityId;}/*** 热点参数限流降级处理*/public String createGroupActivityBlockHandler(Long userId, String activityId, GroupActivityCreateDTO dto, BlockException e) {log.warn("拼团活动创建限流, userId:{}, activityId:{}", userId, activityId, e);return "当前活动太火爆,请稍后再试!";}/*** 异常降级处理*/public String createGroupActivityFallback(Long userId, String activityId, GroupActivityCreateDTO dto, Throwable e) {log.error("拼团活动创建异常, userId:{}, activityId:{}", userId, activityId, e);return "活动创建失败,请稍后重试!";}
}
5. Nacos动态规则配置

在Nacos控制台添加配置,Data ID: app-sentinel, Group: DEFAULT_GROUP:

[{"resource": "createGroupActivity","grade": 1,"count": 100,"paramIdx": 1,"paramFlowItemList": [{"object": "1001","classType": "java.lang.String","count": 200}],"clusterMode": false}
]

实现说明

  1. 依赖说明:引入了Sentinel核心包和Nacos数据源支持,实现规则动态推送
  2. 参数索引paramIdx: 1表示对方法的第二个参数(activityId)进行限流
  3. 例外项配置:对特定活动ID(如1001)设置更高的阈值
  4. 降级策略:分别实现了限流降级和异常降级两种处理逻辑
  5. 动态配置:支持通过Nacos控制台实时调整限流规则,无需重启服务

使用时需确保Sentinel控制台和Nacos服务已启动,具体部署可参考项目中docs/dev-ops目录下的部署文档。


文章转载自:
http://argenteous.hfstrb.cn
http://capric.hfstrb.cn
http://bibliotics.hfstrb.cn
http://astraea.hfstrb.cn
http://caithness.hfstrb.cn
http://base.hfstrb.cn
http://beggar.hfstrb.cn
http://aghan.hfstrb.cn
http://astable.hfstrb.cn
http://cervicitis.hfstrb.cn
http://ariadne.hfstrb.cn
http://approving.hfstrb.cn
http://aomen.hfstrb.cn
http://aloft.hfstrb.cn
http://asserted.hfstrb.cn
http://admiralty.hfstrb.cn
http://blest.hfstrb.cn
http://achilles.hfstrb.cn
http://banefully.hfstrb.cn
http://associationism.hfstrb.cn
http://authoress.hfstrb.cn
http://boyhood.hfstrb.cn
http://acme.hfstrb.cn
http://bilharziasis.hfstrb.cn
http://badderlocks.hfstrb.cn
http://agedly.hfstrb.cn
http://cacotopia.hfstrb.cn
http://assayer.hfstrb.cn
http://aeroembolism.hfstrb.cn
http://calibration.hfstrb.cn
http://www.dtcms.com/a/280869.html

相关文章:

  • 力扣面试150题--排序链表
  • WebApplicationType.REACTIVE 的webSocket 多实例问题处理
  • MySQL数据库----约束
  • C# 构建动态查询表达式(含查询、排序、分页)
  • C语言基础第6天:分支循环
  • Ubuntu24 辅助系统-屏幕键盘的back按键在网页文本框删除不正常的问题解决方法
  • CentOS7 Docker安装MySQL全过程,包括配置远程连接账户
  • fastApi连接数据库
  • 如何正确分配及设置香港站群服务器IP?
  • 深入解析 Java AQS (AbstractQueuedSynchronizer) 的实现原理
  • LeetCode 3136.有效单词:遍历模拟
  • [实战] 基8 FFT/IFFT算法原理与实现(完整C代码)
  • 【每天一个知识点】多模态信息(Multimodal Information)
  • 【知识扫盲】tokenizer.json中的vocab和merges是什么?
  • 【机器学习】第二章 Python入门
  • 【Unity】MiniGame编辑器小游戏(十四)基础支持模块(游戏窗口、游戏对象、物理系统、动画系统、射线检测)
  • 数学中的教学思想
  • MySQL 8.0 OCP 1Z0-908 题目解析(24)
  • P3842 [TJOI2007] 线段
  • Sharding-JDBC 分布式事务实战指南:XA/Seata 方案解析
  • sqli-labs靶场通关笔记:第18-19关 HTTP头部注入
  • 【C++】初识C++(1)
  • 课题学习笔记1——文本问答与信息抽取关键技术研究论文阅读(用于无结构化文本问答的文本生成技术)
  • Java 大视界 -- Java 大数据机器学习模型在金融风险传染路径分析与防控策略制定中的应用(347)
  • QT——QList的详细讲解
  • Redis的下载安装+基础操作+redis客户端的安装
  • 使用 1Panel PHP 运行环境部署 WordPress
  • 辨析git reset三种模式以及和git revert的区别:回退到指定版本和撤销指定版本的操作
  • 零样本轴承故障诊断SC - GAN模型
  • 【PCIe 总线及设备入门学习专栏 5.1.2 -- PCIe EP core_rst_n 与 app_rst_n】