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メソッドを例にとると、次のようなメソッドが追加されます.
providerの方法は少し違います
認可ルールには、次の方法を追加する必要があります.
ホットスポット規則には、次の方法を追加する必要があります.
getRulesメソッドの
return converter.convert(s); return converterに調整します.convert(this.parseRules(s));
問題が解決する.
sentinel dashboardの持続化改造zookeeper nacosのソースコードについて、https://gitee.com/ankeway/Sentinel.gitmaster-dashboardブランチ表示
その原因として,クラスタ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ブランチ表示