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还是读到删除之前的值