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}
]
實現說明
- 依賴說明:引入了Sentinel核心包和Nacos數據源支持,實現規則動態推送
- 參數索引:
paramIdx: 1
表示對方法的第二個參數(activityId)進行限流 - 例外項配置:對特定活動ID(如1001)設置更高的閾值
- 降級策略:分別實現了限流降級和異常降級兩種處理邏輯
- 動態配置:支持通過Nacos控制臺實時調整限流規則,無需重啟服務
使用時需確保Sentinel控制臺和Nacos服務已啟動,具體部署可參考項目中docs/dev-ops
目錄下的部署文檔。