转载自 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)*/@Componentpublic class CleanupRamConfig implements ApplicationListener<RefreshEvent>, Ordered {@Resourceprivate MerchantKey merchantKey;@Overridepublic void onApplicationEvent(RefreshEvent event) {merchantKey.setKeyAndSecrets(emptyMap());}@Overridepublic 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: appValue1appKey2: appValue2appKey3: 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)
