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)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

water___Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值