sentinel 1.8.2 持久化Nacos动态规则热点规则和授权规则不生效的问题
问题:规则持久化到nacos之后,我在本地测试时候只有热点和授权规则不生效,我慢慢的在客户端sentinel-csp-nacos源码下然后推送之后BUG源码 一步一步查看,发现 ParamFlowRuleManager 类中map中一直没有规则,慢慢发现里面是实体类ParamFlowRule数据就是初始化类数据,这时候我继续看修改和查看 RulePropertyListener监听器 监听到了 但是在ParamFlowRuleManager.configUpdate 和configLoad 方法中buildParamRuleMap时候一直返回数据为空。这时候我觉得是不是版本有问题,当时的时候控制台1.8.0版本,
客户端是1.7.1版本,这时候我更换了本地客户端所有的cloudAlibaba boot sentinel 版本。发现还是失效,这时候我就拿出来nacos里面数据结构和客户端数据结构对比。数据结构不一致。查看sentinel-dashboard在自定义ParamFlowRuleNacosPublisher时候 推送的数据是ParamFlowRuleEntity。 客户端接收的ParamFlowRule类。这时候就需要改一下。
接下来~~~~~~~~~~~~~~~~~~~~~~~~开始
解决方案:
重写ParamFlowRuleEntity与AuthorityRuleEntity
1.热点参数规则
第一步重写ParamFlowRuleEntity
import com.alibaba.csp.sentinel.slots.block.Rule;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowClusterConfig;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowItem;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
import java.util.*;
/**
* @author 阿志有点坑
* @description
* @date 2021/2/4 10:04
*/
public class ParamFlowRuleCorrectEntity implements RuleEntity {
private Long id;
private String app;
private String ip;
private Integer port;
private String limitApp;
private String resource;
private Date gmtCreate;
private int grade = 1;
private Integer paramIdx;
private double count;
private int controlBehavior = 0;
private int maxQueueingTimeMs = 0;
private int burstCount = 0;
private long durationInSec = 1L;
private List<ParamFlowItem> paramFlowItemList = new ArrayList();
private Map<Object, Integer> hotItems = new HashMap();
private boolean clusterMode = false;
private ParamFlowClusterConfig clusterConfig;
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public Integer getParamIdx() {
return paramIdx;
}
public void setParamIdx(Integer paramIdx) {
this.paramIdx = paramIdx;
}
public double getCount() {
return count;
}
public void setCount(double count) {
this.count = count;
}
public int getControlBehavior() {
return controlBehavior;
}
public void setControlBehavior(int controlBehavior) {
this.controlBehavior = controlBehavior;
}
public int getMaxQueueingTimeMs() {
return maxQueueingTimeMs;
}
public void setMaxQueueingTimeMs(int maxQueueingTimeMs) {
this.maxQueueingTimeMs = maxQueueingTimeMs;
}
public int getBurstCount() {
return burstCount;
}
public void setBurstCount(int burstCount) {
this.burstCount = burstCount;
}
public long getDurationInSec() {
return durationInSec;
}
public void setDurationInSec(long durationInSec) {
this.durationInSec = durationInSec;
}
public List<ParamFlowItem

本文详细记录了解决Sentinel 1.8.2版本中Nacos动态规则持久化热点规则和授权规则不生效的问题。通过分析Sentinel客户端和Nacos中数据结构不一致,作者重写了ParamFlowRuleEntity和AuthorityRuleEntity,实现了自定义的转换器,并修改了ParamFlowRuleNacosProvider和ParamFlowRuleNacosPublisher,确保推送和接收规则时转换为正确的格式。最终解决了规则不生效的bug。
最低0.47元/天 解锁文章

2242

被折叠的 条评论
为什么被折叠?



