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

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

1. 添加Maven依赖 (pom.xml)
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)
yaml 复制代码
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080  # Sentinel控制台地址
        port: 8719
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-sentinel
            groupId: DEFAULT_GROUP
            rule-type: param-flow

# 自定义限流规则配置
sentinel:
  hot-param:
    activity-qps: 100  # 活动ID参数限流阈值
3. 热点参数限流规则配置类

创建 config/SentinelConfig.java:

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;

    @PostConstruct
    public 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:

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:

json 复制代码
[
  {
    "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目录下的部署文档。

相关推荐
名字还没想好☜10 小时前
Python itertools 实战:用 groupby、chain、islice 优雅处理大数据流
linux·windows·python·迭代器·itertools
ziguo112212 小时前
深入浅出 C/C++ 数据类型:从入门到踩坑
linux·c语言·c++·windows·visual studio
阿扬ABCD14 小时前
ipmitool的Windows版本编译
windows·驱动开发
王维同学16 小时前
Credential Provider、Filter 与 PLAP 的 CLSID 枚举
c++·windows·安全·注册表
寒水馨18 小时前
Windows下载、安装 Codex CLI(附安装包codex-x86_64-pc-windows-msvc.exe)
windows·rust·codex·终端工具·自动化编程·codex cli·ai编码代理
其实防守也摸鱼21 小时前
镜像校验完成iso完整操作流程(Windows 环境,适配 Ubuntu 22.04 / 24.04)
linux·服务器·windows·学习·ubuntu·教程
像风一样自由20201 天前
从本地到公网:Windows 下使用 Cloudflare Quick Tunnel 与 Natapp 联调 FastAPI
windows·fastapi
2601_960906722 天前
科技“无人区”跋涉,难度高、不确定性大
windows·macos·pycharm·myeclipse
会飞的大鱼人2 天前
一文搞懂 Java HashSet:把它想成游乐园里只允许一次入场的盖章名单
java·开发语言·windows
ziguo11222 天前
C/C++ 错误处理全解:从 errno 到 C++ 异常
linux·c语言·c++·windows·visual studio