sentinel 1.8之nacos持久化之授权与热点规则序列化问题
sentinel持久化之nacos原理
上图就是官方的图,其实原理就是通过sentinel-dashboard的管理后台去进行控制,然后将修改后的数据发送到各个数据源中,比如我们这里用的nacos,当然还可以有其他的。DataSource 数据源扩展常见的实现方式有:
- 拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更;
- 推模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。
具体来说是跟nacos和zookeeper的“推”的特性有关,严格的来说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的一些问题,细节的还要自己去看,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。