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
}
]
实现说明
- 依赖说明:引入了Sentinel核心包和Nacos数据源支持,实现规则动态推送
- 参数索引 :
paramIdx: 1
表示对方法的第二个参数(activityId)进行限流 - 例外项配置:对特定活动ID(如1001)设置更高的阈值
- 降级策略:分别实现了限流降级和异常降级两种处理逻辑
- 动态配置:支持通过Nacos控制台实时调整限流规则,无需重启服务
使用时需确保Sentinel控制台和Nacos服务已启动,具体部署可参考项目中docs/dev-ops
目录下的部署文档。