sentinel热点参数流控 之 对象参数流控

LXMXHJ 2025-01-27 10:06:25

已知代码如下:

controller部分

@RequestMapping("/hello2")
@ServiceId(BusinessEnum.TEST_XHJ)
public ResultDto hello2(TestObject testObject){
   return  testHandler.hello2(testObject);
}

handler部分

@SentinelResource(value = "test2",blockHandler = "handleBlockForHello2")
public ResultDto hello2(TestObject testObject) {
      System.out.println("hello2:"+testObject.getApikey()+","+testObject.getName());
      return ResultDto.result(ResultCodeEnum.SUCCESS,"Hello,Sentinel!");
}

public ResultDto handleBlockForHello2(TestObject testObject,BlockException e) {
      log.error("sentinel block2 :",e);
      return ResultDto.result(ResultCodeEnum.ApikeyError);
}

对象部分

public class TestObject {

    private String name;
    private String apikey;

    public TestObject(String name, String apikey) {
        this.name = name;
        this.apikey = apikey;
    }
    public TestObject(){}

    @Override
    public boolean equals(Object o) {
        // 首先检查是不是同一个对象实例
        if (this == o) return true;
        // 检查o是不是null或者类型是否正确
        if (!(o instanceof TestObject)) return false;

        // 将o转换为UnifySendReqDto类型
        TestObject that = (TestObject) o;
        System.out.println("testObject ing");
        // 比较两者的appCode字段
        return Objects.equals(this.apikey, that.apikey);

    }
    @Override
    public int hashCode() {
        return Objects.hash(apikey);
    }


}

sentinelConfig部分

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
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 com.unicom.opn.api.core.dto.TestObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Slf4j
@Configuration
public class SentinelConfig {

    public static TestObject testObject = new TestObject("xxx","a");

    @PostConstruct
    public void initFlowRules() {
        limitApikey();
    }

    public void limitApikey(){
        List<ParamFlowRule> rules = new ArrayList<>();
        ParamFlowRule a = new ParamFlowRule("test2")
                .setCount(Double.MAX_VALUE) // 允许访问的数量
                .setParamIdx(0)
                .setGrade(RuleConstant.FLOW_GRADE_QPS)
                .setDurationInSec(10) // 持续时间,单位为秒
                .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) //即当流量达到阈值时,直接拒绝多余的请求。
                .setParamFlowItemList(
                        Collections.singletonList(new ParamFlowItem()
                                .setObject(testObject.toString())
                                .setCount(0))
                );
        rules.add(a);
        ParamFlowRuleManager.loadRules(rules);
    }
}

其中上述的setObject部分 已经改成过"a" 进行尝试;

问题:

访问hell2接口 无法实现对apikey=a的请求进行拦截。想请问下这是为什么

...全文
70 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
LXMXHJ 02-06
  • 打赏
  • 举报
回复

又参考博客的内容做出了进一步修改,

public class TestObject implements ParamFlowArgument{

    @NotBlank(message = "name为空")
    private String name;
    @Getter
    @NotBlank(message = "apikey为空")
    private String apikey;


    // 重写 paramFlowKey 方法,返回需要进行热点参数限流的键
    @Override
    public Object paramFlowKey() {
        return apikey;
    }
}

TestObject改成这个样子,但是运行项目却显示Error creating bean with name 'sentinelConfig': Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowRule
如果不修改TestObject是可以正常运行项目 只是不能实现apikey=a的拦截。

LXMXHJ 02-06
  • 举报
回复

106

社区成员

发帖
与我相关
我的任务
社区描述
全栈领域基础知识共享社区。 前端基础知识和前端常用的框架、后端知识和后端常用的框架。linux方面的相关知识、jvm相关的知识、数据库相关的知识。目的是分享知识、对新手小白很友好
前端后端微信小程序 个人社区 广东省·广州市
社区管理员
  • 乡下小哥编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧