Alibaba Sentinel dashboardがデータを永続化してデータソースに保存することについて、ホットスポットルールとライセンスルールとスタンドアロンモードが互換性がない問題の解決策

4278 ワード

Sentinal sashboardの実装とデータソースの永続化を改造する過程で、ホットスポットルールとライセンスルールとスタンドアロンモードが互換性がないという問題に遭遇しました.クラスタのホットスポットルールとライセンスルールを変更した後、データソースに永続化しましたが、スタンドアロンモードではルールを解析できません.ルールが通じなくなる.
その原因として,クラスタV 2モードで保存されたデータが,1レベルruleより多くなったためである.保存や読み込みの際は少し調整しておきます.
単機のloadConfig解析[{"burstCount":0,"clusterConfig":{"fallbackToLocalWhenFail":true,"sampleCount":10,"thresholdType":0,"windowIntervalMs":1000},"clusterMode":false,"controlBehavior":0,"count":8888.0,"duratioInSec":8888,"grade":1,"limitApp":"default""":"default"""""""""""""""""""""""""""""""""""default""""",[maxQueueingTimeMs]:0,[paramFlowItemList]:[],[paramIdx]:8888,[resource]:[66666]]]
V 2のloadConfig解析[{"app":"i 5 xforyou","gmtCreatee":15942287624052,"gmtModified":15942889440542,"id":38,"ip":"192.168.14.187","port":8720,"rule":{"burstCount":0,"clusterConfig":{"fallbackToLockWhenFail":true,"sampleCount":10,"thresholdType"Type"""""""""""""""","fallbackToLockToLocalWhenFail":true,"sampleCount":10,"thresholdType:0、[windowIntervalMs]:1000}、[clusterMode]:false、[controlBehavior]:0、[count]:111.0、[durationInSec]:1111111112、[grade]:1、[limitApp]:[default]、「maxQueueingTimeMs」:0,"paramFlowItemList":[],"paramIdx":22222222,"resource":"SSSS"}}]
原理は説明しすぎないが、解決方法は以下の通りである.
Publisherメソッドを例にとると、次のようなメソッドが追加されます.
    private String parseRules(String rules) {
        JSONArray oldRuleJsons = JSONArray.parseArray(rules);
        for (int i = 0; i < oldRuleJsons.size(); i++) {
        	JSONObject oldRuleJson = oldRuleJsons.getJSONObject(i);
        	JSONObject ruleJson = oldRuleJson.getJSONObject("rule");
        	oldRuleJson.putAll(ruleJson);
        	oldRuleJson.remove("rule");
		}
        return oldRuleJsons.toJSONString();
    }


 byte[] data = CollectionUtils.isEmpty(rules) ? "[]".getBytes() : converter.convert(rules).getBytes();

  

 byte[] data = CollectionUtils.isEmpty(rules) ? "[]".getBytes() : this.parseRules(converter.convert(rules)).getBytes();


providerの方法は少し違います
認可ルールには、次の方法を追加する必要があります.
 private String parseRules(String rules) {
    	JSONArray newRuleJsons = new JSONArray();
        JSONArray ruleJsons = JSONArray.parseArray(rules);
        for (int i = 0; i < ruleJsons.size(); i++) {       	
        	JSONObject ruleJson = ruleJsons.getJSONObject(i);
        	AuthorityRuleEntity ruleEntity = JSON.parseObject(ruleJson.toJSONString(), AuthorityRuleEntity.class);
        	JSONObject newRuleJson = JSON.parseObject(JSON.toJSONString(ruleEntity));
        	AuthorityRule rule = JSON.parseObject(ruleJson.toJSONString(), AuthorityRule.class);
        	newRuleJson.put("rule", rule);
        	newRuleJsons.add(newRuleJson);
		}
        return newRuleJsons.toJSONString();
    }

ホットスポット規則には、次の方法を追加する必要があります.
    private String parseRules(String rules) {
    	JSONArray newRuleJsons = new JSONArray();
        JSONArray ruleJsons = JSONArray.parseArray(rules);
        for (int i = 0; i < ruleJsons.size(); i++) {       	
        	JSONObject ruleJson = ruleJsons.getJSONObject(i);
        	ParamFlowRuleEntity ruleEntity = JSON.parseObject(ruleJson.toJSONString(), ParamFlowRuleEntity.class);
        	JSONObject newRuleJson = JSON.parseObject(JSON.toJSONString(ruleEntity));
        	ParamFlowRule rule = JSON.parseObject(ruleJson.toJSONString(), ParamFlowRule.class);
        	newRuleJson.put("rule", rule);
        	newRuleJsons.add(newRuleJson);
		}
        return newRuleJsons.toJSONString();
    }

getRulesメソッドの
return converter.convert(s); return converterに調整します.convert(this.parseRules(s));
問題が解決する.
 
sentinel dashboardの持続化改造zookeeper nacosのソースコードについて、https://gitee.com/ankeway/Sentinel.gitmaster-dashboardブランチ表示