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://www.pswp.cn/news/914639.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914639.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914639.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式深度解析:从LeetCode 3136题说起

正则表达式深度解析&#xff1a;从LeetCode 3136题说起 引言 正则表达式&#xff08;Regular Expression&#xff0c;简称RegEx&#xff09;是一种强大的字符串匹配工具&#xff0c;在字符串处理、数据验证、文本搜索等场景中有着广泛的应用。本文将以LeetCode 3136题"有效…

映美打印机-URL页面打印

<?php /** 打印 - 映美云 https://open.jolimark.com/doc/ */ namespace Home\Controller; use Admin\Logic\OrderLogic;class PrintController extends BaseController {private $appid "";private $appkey "";//打印机编号private $deviceIds &qu…

机器学习算法 ——XGBoost 的介绍和使用

前言&#xff1a; 最近在工作中遇到一个结构化数据回归预测的问题&#xff0c;用到了很多回归算法&#xff08;如多元线性回归等&#xff09;都没有很好的效果&#xff0c;于是使用了XGBoost&#xff0c;自己也冲三个特征参数人为的增加来几个&#xff0c;训练出来的效果还是很…

Linux操作系统之信号:保存与处理信号

目录 前言&#xff1a; 前文回顾与补充&#xff1a; 信号的保存 PCB里的信号保存 sigset_t 信号集操作函数 信号的处理 信号捕捉的流程&#xff1a;​编辑 操作系统的运行原理 硬件中断 时钟中断 死循环 软中断 总结&#xff1a; 前言&#xff1a; 在上一篇文…

Spring Boot 设置滚动日志logback

Spring Boot 的 logback 框架 Spring Boot 默认内置了 Logback 作为日志实现框架&#xff0c;只需要在resources文件夹下添加一个logback-spring.xml&#xff0c;springboot会按照你的设置自动开启logback日志功能。 配置 logback-spring.xml 实现每天产生一个日志文件&#xf…

如何定义一个只能在堆上或栈上生成对象的类

在C中&#xff0c;可以通过特定的技术手段来控制对象只能在堆(heap)或栈(stack)上创建。只能在堆上创建对象的类要实现这一点&#xff0c;我们需要阻止用户直接实例化对象&#xff0c;而只能通过new操作符创建。class HeapOnly { public:static HeapOnly* create() {return new…

1.1 前端-vue3项目的创建

构建工具先搭好vue3框架 vue2的vue-cli脚手架基于webpack构建工具创建vue的框架. 而在vue3&#xff0c;可以通过vite构建工具创建vue3项目&#xff0c;性能更优。 两者创建方式的区别&#xff1a;cmd命令基于的构建工具vue2/vue3vue create 项目名称&#xff08;或 vue ui图形化…

PHP password_get_info() 函数

password_get_info() 函数用于返回指定散列&#xff08;hash&#xff09;的相关信息。 PHP 版本要求: PHP 5 > 5.5.0, PHP 7 语法 array password_get_info ( string $hash ) 参数说明&#xff1a; $hash: 一个由 password_hash() 创建的散列值。 返回值 返回三个元素…

mac上的app如何自动分类

使用文件夹进行手动分类在Finder中创建文件夹&#xff0c;将同类应用拖入同一文件夹。右键点击Dock上的应用图标&#xff0c;选择「选项」→「在Finder中显示」&#xff0c;可快速定位应用安装位置。利用Launchpad自动分组打开Launchpad&#xff08;触控板四指捏合或按F4键&…

LLM面试题目 3

LLM面试题目 3 什么是自注意力机制(Self-Attention)?为什么它在LLM中很重要?如何评估LLM的性能?LLM面临的挑战有哪些?Transformer和RNN的区别是什么?LLM如何处理多轮对话? 题目讲解 什么是自注意力机制(Self-Attention)?为什么它在LLM中很重要? 自注意力机制是一种…

linux上的软挂载操作方法

针对linux上的软挂载 可以查看linux已经挂载和存储的磁盘分区 df -hfdisk 命令是检索相同信息的另一种方法&#xff0c;可以看到所有的磁盘分区 sudo fdisk -l 要将磁盘分区 /dev/sda1 挂载到 /home/visionx/EXD1 目录 步骤 1&#xff1a;准备工作 1.创建挂载目录&#xff08;如…

SecretFlow 隐语 (2) --- 隐语架构概览

在前边两篇文章中&#xff0c;介绍了数据要素和可信流通相关的内容&#xff0c;以及基于p2p模式的安装方法 SecretFlow 隐语 (1) --- 快速入门 关于在Linux上部署 SecretFlow --- P2P部署模式 由于安装过程中出现意外报错&#xff0c;现已提交issue等待官方技术人员查阅&#x…

PHP语言基础知识(超详细)第二节

二十七. 数组的遍历 1)通过函数进行遍历:(例:demo07) (此方式不能完全遍历数组,需要借助其他功能辅助)(不推荐,了解即可) key():返回数组中当前指针所在位置的键。 current():返回数组中当前指针所在位置的值。 例如:demo07: <?php/*key():返回数组中…

网络--OSPF实验

目录 OSPF实验报告 一、实验拓扑 二、实验要求 三、实验思路 1.IP地址划分 2. OSPF 部署 3. 其它配置 4. 验证测试 四、实验步骤 1.IP 地址配置 2.OSPF 部署 3.其它配置 4.验证测试 OSPF实验报告 一、实验拓扑 二、实验要求 1、R1-R3为区域0&#xff0c;R3-R4为…

Go语言第一个程序--hello world!

文章目录一、Go 语言程序安装二、运行程序三、go mod tidy 命令四、遇到的问题五、VS Code 调试 go 程序的相关配置说明一、Go 语言程序安装 Go语言下载链接&#xff1a;https://studygolang.com/dl 双击打开下一步下一步即可。 验证安装&#xff1a;go version 二、运行程序 创…

【MCU控制 初级手札】1.1 电阻

作者&#xff1a;电控工程手札 本博文内容著作权归作者所有&#xff0c;转载请务必保留本文链接 目录1. 定义2. 电导3. 电阻率4. 电导率5. 伏安特性6. 开路与短路7. 功率8. 应用元件特性&#xff08;端子特性&#xff09;&#xff1a;元件的两个端子的电路物理量之间的代数函数…

JS中async/await功能介绍和使用演示

JS 中 async/await 功能介绍与使用演示 一、功能介绍基本概念 async&#xff1a;用于声明异步函数&#xff0c;返回一个 Promise 对象。即使函数内没有显式返回 Promise&#xff0c;也会隐式将返回值封装为 Promise.resolve()。await&#xff1a;仅能在 async 函数内部使用&…

系统调用入口机制:多架构对比理解(以 ARM64 为主)

&#x1f4d6; 推荐阅读&#xff1a;《Yocto项目实战教程:高效定制嵌入式Linux系统》 &#x1f3a5; 更多学习视频请关注 B 站&#xff1a;嵌入式Jerry 系统调用入口机制&#xff1a;多架构对比理解&#xff08;以 ARM64 为主&#xff09; 本篇内容聚焦于系统调用的入口实现机…

java MultipartFile初始化

在Java中&#xff0c;MultipartFile 是Spring框架中用于处理文件上传的接口。​开发者通常不会直接初始化MultipartFile对象&#xff0c;而是通过Spring MVC的控制器方法参数接收上传的文件。如果需要在测试或模拟场景中创建其实例&#xff0c;可以使用Spring的MockMultipartFi…

Linux C IO多路复用

在上一节利用管道实现了一个简单的聊天室&#xff0c;但这个聊天室有一个很明显的问题就是&#xff0c;当A处于读阻塞情况下是不能向B发送消息的&#xff0c;只有收到B的消息才能发送。如何实现同时既能接受B的消息&#xff0c;又能向其发送消息&#xff1f;很遗憾&#xff0c;…