前言:

项目中经常用会有恶意刷接口的情况,例如频繁发送手机短信。针对这类问题,可以用sentinel作为限流。以下是实战过程。

注意:入参非对象,如果是对象不好处理。
入参的非对象的,可以通过参数(下标)作为限制参数,
例如:30秒内同一手机号只能发送一次,限流返回 “操作过于频繁,请稍后”

@SentinelResource(value = "sentinel_getCaptchaSms",blockHandler = "getCaptchaSmsHandler")
@PostMapping("/getCaptchaSms")
@Operation(summary = "【验证码】 - 获取验证码(手机短信) ")
public AppApiResponse<Object> getCaptchaSms(@RequestParam @Parameter(name = "手机号")      String phoneNumber,
                                            @RequestParam @Parameter(name = "手机区号ID")  Long phoneAreaCodeId ){
    return AppApiResponse.success(captchaService.getCaptchaSms(phoneNumber,phoneAreaCodeId));
}
 
/**
 * 兜底方法
 * @return 结果
 */
public AppApiResponse<Object> getCaptchaSmsHandler(String phoneNumber,Long phoneAreaCodeId, BlockException e ) {
    System.out.println("[  ] ====>操作过于频繁,请稍后"  );
    return AppApiResponse.error(AppResponseCodeEnum.CODE_501_ERROR);//操作过于频繁,请稍后。
}

1、在Nacos配置中心添加Sentinel的热点参数限流规则:

nacos-----配置中心----新建配置----- app-sentinel-config.json

在这里插入图片描述

[
  {
    "resource": "sentinel_getCaptchaSms",
    "limitApp": "default",
    "grade": 1,
    "paramIdx": 0,
    "count": 1,
    "strategy": 0,
    "controlBehavior": 0,
    "burstCount": 0,
    "durationInSec": 30,
    "paramFlowItemList": [],
    "clusterMode": false
  }
]
 配置说明:
[
  {
    "resource": "sentinel_getCaptchaSms",  // 限流资源名称,通常是接口或方法名(此处为获取验证码短信接口)
    "limitApp": "default",  // 限制的应用来源,default表示不区分来源
    "grade": 1,  // 限流阈值类型:0表示线程数,1表示QPS(此处为QPS限流)
    "paramIdx": 0,  // 热点参数索引,0表示第一个参数
    "count": 1,  // 限流阈值:此处QPS阈值为1
    "strategy": 0,  // 限流策略:0表示直接限流,1表示关联限流,2表示链路限流
    "controlBehavior": 0,  // 流量控制行为:0表示快速失败,1表示Warm Up,2表示排队等待
    "burstCount": 0,  // 突发流量阈值,允许的额外请求数
    "durationInSec": 30,  // 统计时间窗口,单位为秒(此处为30秒)
    "paramFlowItemList": [],  // 热点参数的特殊项配置,为空表示不区分参数值
    "clusterMode": false  // 是否集群限流模式:false表示单机限流
  }
]

2、引入sentinel的数据依赖maven

<!-- Sentinel 集成 Nacos 数据源的关键依赖(必须添加) -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

<!-- 1. Sentinel 核心依赖(必须:包含 ParamFlowArgumentParser 类) -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-parameter-flow-control</artifactId>
</dependency>

3、测试效果

在这里插入图片描述

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐