sentinel 1.8. 2持久化Nacos动态规则热点规则和授权规则不生效的问题

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

sentinel 1.8.2 持久化Nacos动态规则热点规则和授权规则不生效的问题

问题:规则持久化到nacos之后,我在本地测试时候只有热点和授权规则不生效,我慢慢的在客户端sentinel-csp-nacos源码下然后推送之后BUG源码 一步一步查看,发现 ParamFlowRuleManager 类中map中一直没有规则,慢慢发现里面是实体类ParamFlowRule数据就是初始化类数据,这时候我继续看修改和查看 RulePropertyListener监听器 监听到了 但是在ParamFlowRuleManager.configUpdateconfigLoad 方法中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
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值