sentinel 1.8.6 持久化数据到nacos配置中心,修改规则刷新页面数据有延迟

rur96b6h  于 2个月前  发布在  Nacos
关注(0)|答案(2)|浏览(34)

Issue Description

sentinel 1.8.6 数据持久化nacos,dashboard页面刷新还是修改之前的数据,再次刷新后正常
Type: bug report

Describe what happened

数据保存nacos后数据不实时刷新

Describe what you expected to happen

dashboard修改规则,刷新页面后实时更新修改后的内容

How to reproduce it (as minimally and precisely as possible)

  1. 实现DynamicRulePublisher后重写: public void publish(String app, T rules) throws Exception {
    AssertUtil.notEmpty(app, "app name cannot be empty");
    if (rules == null) {
    return;
    }
String dataId = app + this.getDataIdPostfix();
 String groupId = nacosProperties.getGroupId();

 log.info("publish; dataId: {},groupId: {},rules: {}",dataId,groupId,rules);

 nacosConfigService.publishConfig(dataId,groupId, converter.convert(rules), ConfigType.JSON.getType());

}

  1. FlowController 代码:
    public Result apiQueryMachineRules(@RequestParam String app) {
if (StringUtil.isEmpty(app)) {
     return Result.ofFail(-1, "app can't be null or empty");
 }
 try {
     List<FlowRuleEntity> rules = ruleProvider.getRules(app);
     if (rules != null && !rules.isEmpty()) {
         for (FlowRuleEntity entity : rules) {
             entity.setApp(app);
             if (entity.getClusterConfig() != null && entity.getClusterConfig().getFlowId() != null) {
                 entity.setId(entity.getClusterConfig().getFlowId());
             }
         }
     }
     rules = repository.saveAll(rules);
     return Result.ofSuccess(rules);
 } catch (Throwable throwable) {
     logger.error("Error when querying flow rules", throwable);
     return Result.ofThrowable(-1, throwable);
 }

}
public Result apiUpdateFlowRule(@PathVariable("id") Long id,
@requestbody FlowRuleEntity entity) {
if (id == null || id <= 0) {
return Result.ofFail(-1, "Invalid id");
}
FlowRuleEntity oldEntity = repository.findById(id);
if (oldEntity == null) {
return Result.ofFail(-1, "id " + id + " does not exist");
}
if (entity == null) {
return Result.ofFail(-1, "invalid body");
}

entity.setApp(oldEntity.getApp());
 entity.setIp(oldEntity.getIp());
 entity.setPort(oldEntity.getPort());
 Result<FlowRuleEntity> checkResult = checkEntityInternal(entity);
 if (checkResult != null) {
     return checkResult;
 }

 entity.setId(id);
 Date date = new Date();
 entity.setGmtCreate(oldEntity.getGmtCreate());
 entity.setGmtModified(date);
 try {
     entity = repository.save(entity);
     if (entity == null) {
         return Result.ofFail(-1, "save entity fail");
     }
     publishRules(oldEntity.getApp());
 } catch (Throwable throwable) {
     logger.error("Failed to update flow rule", throwable);
     return Result.ofThrowable(-1, throwable);
 }
 return Result.ofSuccess(entity);

}

  1. 页面操作修改刷新页面数据还是修改前的,强刷页面后正常显示
k3bvogb1

k3bvogb11#

数据保存完之后,又刷新获取,nacos数据有延迟的,可以修改成优先从内存获取。

vi4fp9gy

vi4fp9gy2#

感觉使用内存的数据来展示 dashboard 不大合适,因为这样的话就不知道是否成功变更到 sentinel 应用. @LearningGp

相关问题