作者:窝巢哥_809 | 来源:互联网 | 2023-10-10 14:02
使用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, 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 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)