开发者社区 > 云原生 > 正文

I found a place code wrong in nacos-client:2.0.2(有

也就是在nacosConfigService类中getConfigInner方法中使用了LocalConfigInfoProcessor.getFailover方法; 而这个方法在配置刷新之后,server端反馈给client端,最后调用spring的刷新机制,spring最后又会调用nacos-client的getConfig方法,在这里本来不应该再去请求server端了,因为之前nacos-client端已经请求过server,得到变更的配置并且更新仔本地文件中,我认为这里的LocalConfigInfoProcessor.getFailover(worker.getAgentName(), dataId, group, tenant) getFailover是废弃方法,它根本拿不到本地文件的最新配置,导致又请求了nacos-server,没有必要多做这一次请求,所以我觉得这里应该调用getSnapshot方法来获取本地最新的content然后直接返回

`private String getConfigInner(String tenant, String dataId, String group, long timeoutMs) throws NacosException { group = blank2defaultGroup(group); ParamUtils.checkKeyParam(dataId, group); ConfigResponse cr = new ConfigResponse();

cr.setDataId(dataId);
cr.setTenant(tenant);
cr.setGroup(group);
************************************** **************************************
**// i think this can not use getFailover,it need use getSnapshot.

//Otherwise, the local config will not be used here, and the server will always be requested. //This will cause the client to request the server twice when refreshing the configuration. //And there is no savefailover,so I guess the code here is your careless mistake.**

**String content = LocalConfigInfoProcessor.getFailover(worker.getAgentName(), dataId, group, tenant);**

if (content != null) {
    LOGGER.warn("[{}] [get-config] get failover ok, dataId={}, group={}, tenant={}, config={}",
            worker.getAgentName(), dataId, group, tenant, ContentUtils.truncateContent(content));
    cr.setContent(content);
    String encryptedDataKey = LocalEncryptedDataKeyProcessor
            .getEncryptDataKeyFailover(agent.getName(), dataId, group, tenant);
    cr.setEncryptedDataKey(encryptedDataKey);
    configFilterChainManager.doFilter(null, cr);
    content = cr.getContent();
    return content;
}

try {
    ConfigResponse response = worker.getServerConfig(dataId, group, tenant, timeoutMs, false);
    cr.setContent(response.getContent());
    cr.setEncryptedDataKey(response.getEncryptedDataKey());
    configFilterChainManager.doFilter(null, cr);
    content = cr.getContent();
    
    return content;`

原提问者GitHub用户kangarooking

展开
收起
学习娃 2023-05-22 16:19:09 100 0
1 条回答
写回答
取消 提交回答
  • 1、getFailover 并不是废弃方法,而是提供在配置中心失联的紧急情况下的干预手段。Failover是用于容灾的,如果出现客户端和服务端完全无法通信,但又需要修改配置的时候,手动创建failover目录及对应dataid配置内容。

    2、getSnapshot 并不是用来获取最新的配置,而是提供在配置中心失联的情况下的,人工的 容灾干预是滞后的,这个时候客户端至少还可以从snapshot中获取旧的配置,而不至于直接报错罢工。

    3、getConfig方法每一次都会请求nacos-server,这是合理的,在配置中心正常工作的情况下,该方法获取到的配置可以确认一定是最新可靠的。

    4、如果不想因为每一次获取配置都去请求nacos-server造成配置中心压力过大,应该使用监听的方式。这样客户端只会在启动的时候访问一次nacos-server,之后依赖配置中心的主动推送异步更新配置,而不是每一次用到配置了就去发起请求。

    原回答者GitHub用户MajorHe1

    2023-05-23 09:41:52
    赞同 展开评论 打赏
问答分类:
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载