Nacos删除配置后,sprintboot还是读到删除之前的值

Posted water___Wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nacos删除配置后,sprintboot还是读到删除之前的值相关的知识,希望对你有一定的参考价值。

使用nacos了一段时间,发现并解决了一些问题。再次记录下

1,现象

https://github.com/alibaba/nacos/issues/3803
正常情况下,更新nacos上的kv配置,客户端可以感知到,并且可以“实时”获取到最新的nacos配置。但是如果删除nacos的kv配置,客户端却依旧读取到的是旧的配置;


2,解释

删除nacos上的配置后,客户端其实读取到的是客户端内存中的配置,nacos将删除的kv变更没有同步到到客户端。所以感官上看到客户端依旧读的是“老的配置”;


3,解决

实现 ApplicationListener类,当有任何RefreshEvent变更的时候,将自己本地配置置空。具体代码如下:

import static java.util.Collections.emptyMap;

import javax.annotation.Resource;
import org.springframework.cloud.endpoint.event.RefreshEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;

/**
 * @author water
 * @desc 修复nacos的bug(删除nacos配置,但是SpringCloud还是能读到)
 * https://github.com/alibaba/nacos/issues/3803)
 */
@Component
public class CleanupRamConfig implements ApplicationListener<RefreshEvent>, Ordered 


  @Resource
  private MerchantKey merchantKey;


  @Override
  public void onApplicationEvent(RefreshEvent event) 
    merchantKey.setKeyAndSecrets(emptyMap());
  

  @Override
  public int getOrder() 
    return Ordered.HIGHEST_PRECEDENCE;
  

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @author water
 * @desc 存储商户鉴权信息
 */
@Data
@Component
@ConfigurationProperties(prefix = "merchant")
public class MerchantKey 

  private Map<String, String> keyAndSecrets;

nacos中的配置

merchant: 
   keyAndSecrets: 
      appKey1: appValue1
      appKey2: appValue2
      appKey3: appValue3


4, 思考

nacos这样做真的是bug吗? 假如将nacos的一个kv删除,客户端也清空一个kv,达到极限,nacos上的所有kv都删除,客户端的所有kv也删除。两种情况,1,正常情况下删除nacos的所有kv,那边客户端的所有kv清空,这算正常。2,异常情况下,如果nacos 挂了,客户端检查拿不到远程配置,也清空所有本地kv,这样是不是有问题;

5,建议

nacos可以增加一个配置:CleanupRam 默认设置为false(如果远程nacos的kv删除,不清理本地内存),如果用户修改为true(远程nacos的kv删除,清理本地kv)

以上是关于Nacos删除配置后,sprintboot还是读到删除之前的值的主要内容,如果未能解决你的问题,请参考以下文章

Nacos删除配置后,sprintboot还是读到删除之前的值

谷粒商城nacos远程配置中心出错

NACOS MalformedInputException 无法读取中文配置问题

sprintboot

sprintboot 中多环境配置

聊一聊Yarp结合Nacos完成服务发现