转载自 https://blog.csdn.net/WANTAWAY314/article/details/118489812
1,现象
https://[github](https://so.csdn.net/so/search?q=github&spm=1001.2101.3001.7020).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)