天天看點

sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題

sentinel 1.8之nacos持久化之授權與熱點規則序列化問題

  • sentinel持久化之nacos原理
  • 授權與熱點規則序列化問題
    • AuthorityRuleNacosProvider的publish問題
    • AuthorityRuleNacosProvider的getRules問題
    • 持久化配置的5種規則
    • 用戶端debug推到的規則

sentinel持久化之nacos原理

sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題

上圖就是官方的圖,其實原理就是通過sentinel-dashboard的管理背景去進行控制,然後将修改後的資料發送到各個資料源中,比如我們這裡用的nacos,當然還可以有其他的。DataSource 資料源擴充常見的實作方式有:

  1. 拉模式:用戶端主動向某個規則管理中心定期輪詢拉取規則,這個規則中心可以是 RDBMS、檔案,甚至是 VCS 等。這樣做的方式是簡單,缺點是無法及時擷取變更;
  2. 推模式:規則中心統一推送,用戶端通過注冊監聽器的方式時刻監聽變化,比如使用 Nacos、Zookeeper 等配置中心。這種方式有更好的實時性和一緻性保證。

具體來說是跟nacos和zookeeper的“推”的特性有關,嚴格的來說nacos不是算推,也是拉,隻不過這個請求是長輪詢,伺服器端hang住,然後有更新了立馬傳回而已,具體可以看我的nacos的文章,有相關解析。而zookeeper才是所謂的推,通過watch機制,就是遠端的釋出訂閱機制,有改變就通過網絡發送資料到用戶端。

簡單的流程就是這樣:

sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題

說完了這個原理就是怎麼做這個持久化了,這個網上很多文章講了,我就不說了,我說這些方案實作的坑,這些他們沒說,但是你真的去做就會發現問題了。比如授權與熱點規則序列化問題。

授權與熱點規則序列化問題

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

種配置的結果應該是這樣:

sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題
sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題
sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題
sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題
sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題
sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題
sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題

用戶端debug推到的規則

sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題
sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題
sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題
sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題
sentinel 1.8之nacos持久化之授權與熱點規則序列化問題sentinel持久化之nacos原理授權與熱點規則序列化問題

好了,今天就到這裡了,說了下持久化到nacos的一些問題,細節的還要自己去看,希望對學習了解有幫助,大神看見勿噴,僅為自己的學習了解,能力有限,請多包涵。

繼續閱讀