sentinel 1.8之nacos持久化之授权与热点规则序列化问题

sentinel持久化之nacos原理

在这里插入图片描述
上图就是官方的图,其实原理就是通过sentinel-dashboard的管理后台去进行控制,然后将修改后的数据发送到各个数据源中,比如我们这里用的nacos,当然还可以有其他的。DataSource 数据源扩展常见的实现方式有:

  1. 拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更;
  2. 推模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 NacosZookeeper 等配置中心。这种方式有更好的实时性和一致性保证。

具体来说是跟nacoszookeeper的“推”的特性有关,严格的来说nacos不是算推,也是拉,只不过这个请求是长轮询,服务器端hang住,然后有更新了立马返回而已,具体可以看我的nacos的文章,有相关解析。而zookeeper才是所谓的推,通过watch机制,就是远程的发布订阅机制,有改变就通过网络发送数据到客户端。

简单的流程就是这样:
在这里插入图片描述
说完了这个原理就是怎么做这个持久化了,这个网上很多文章讲了,我就不说了,我说这些方案实现的坑,这些他们没说,但是你真的去做就会发现问题了。比如授权与热点规则序列化问题。

授权与热点规则序列化问题

AuthorityRuleNacosProvider的publish问题

我直接贴代码了,如果按照正常的情况,你会发现客户端的JsonConverter是解析不出来的,因为AuthorityRule是套在AuthorityRuleEntity里面的,解出来的AuthorityRule都是默认的值,所以我们要进行一下转换,将AuthorityRuleEntity中的AuthorityRule提取出来序列化存到nacos,这样客户端拿到的就是AuthorityRule序列化的,就可以解出来了,其实你也可以参考内存数据源的方式,他就是这么做的,具体不清楚的要看下源码了解下:

 @Override
    public void publish(String appName, List<AuthorityRuleEntity> rules) throws Exception {
        AssertUtil.notEmpty(appName, "app name cannot be empty");
        if (rules == null) {
            return;
        }
        
        String data = JSON.toJSONString(
                rules.stream().map(r -> r.toRule()).collect(Collectors.toList()));
        configService.publishConfig(appName + NacosConfigUtil.AUTHORITY_DATA_ID_POSTFIX,
                appName + NacosConfigUtil.GROUP_ID, data);
    }

AuthorityRuleNacosProvider的getRules问题

当然获取AuthorityRule的数组后要转成AuthorityRuleEntity的数组才可以在页面上展示,所以需要以下的转换:

 @Override
    public List<AuthorityRuleEntity> getRules(String appName) throws Exception {
        String rules = configService.getConfig(appName + NacosConfigUtil.AUTHORITY_DATA_ID_POSTFIX,
                appName + NacosConfigUtil.GROUP_ID, nacosRulesProperties.getTimeoutMs());
        if (StringUtil.isEmpty(rules)) {
            return new ArrayList<>();
        }
        
        List<AuthorityRule> authorityRules = JSON.parseArray(rules, AuthorityRule.class);
        List<AuthorityRuleEntity> authorityRuleEntities = Optional.ofNullable(authorityRules).map(r -> r.stream()
                .map(e -> AuthorityRuleEntity.fromAuthorityRule(appName, null, null, e))
                .collect(Collectors.toList())
        ).orElse(null);

        return authorityRuleEntities;
    }

热点规则也一样,相同的改法。

持久化配置的5种规则

当然你可以不这样改,直接改客户端也可以啦,只要你服务端和客户端能解析即可。最后5种配置的结果应该是这样:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

客户端debug推到的规则

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

好了,今天就到这里了,说了下持久化到nacos的一些问题,细节的还要自己去看,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值