106
社区成员




已知代码如下:
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的请求进行拦截。想请问下这是为什么
又参考博客的内容做出了进一步修改,
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的拦截。