nacos监听更新bean和apollo的区别

背景

最近公司微服务全面转向了alibaba阵营,apollo也换成了nacos,配置监听上有些许变动,记录一下。

Apollo实现

    @Value("${channel}")
    private String channel;

    @PostConstruct
    public void init() {
        try {
			updateChannel(channel);
        } catch (Exception e) {
            log.error("初始化配置出错,请检查渠道配置!",e);
        }
    }
    /**
     * apollo配置监听器,默认监听的是application命名空间
     * @param changeEvent
     * 这里的value=表示你要监听的命名空间配置
     */
    @ApolloConfigChangeListener
    public void onChange(ConfigChangeEvent changeEvent) {
        for (String changedKey : changeEvent.changedKeys()) {
            ConfigChange change = changeEvent.getChange(changedKey);
            if (changedKey.startsWith("channel")) {
                updateChannel(change.getNewValue());
                log.info("key : {}, olderValue : {}, new Value : {}", "sp-channel", change.getOldValue(), change.getNewValue());
            }
        }
    }
       
    private void updateChannel(String newValue) {
        try {
            RevenueChannelComponent.CHANNEL_LIST.clear();
            String[] channelListStr = newValue.split(",");
            for (String channelStr : channelListStr) {
                String[] split = channelStr.split(":");
                RevenueChannelComponent.CHANNEL_LIST.put(split[0],split[1]);
            }
        } catch (Exception e) {
            log.error("更新配置出错,请检查渠道配置!",e);
        }
    } 

这是一个map数据,我在配置里将其配置成了String,通过字符串的形式进行切割。应用启动时将初始化数据读取到并放到缓存列表中。
监听apollo改变事件,如果有变化更新缓存。

nacos实现

添加监听器

@Slf4j
@Configuration
//如果nacos配置关闭,就不添加监听器
@ConditionalOnProperty(name = "spring.cloud.nacos.config.enabled", matchIfMissing = true)
public class NacosConfigListenerManager  {
    @Resource
    NacosConfigManager nacosConfigManager;
    @Resource
    NacosConfigProperties configProperties;
    @Resource
    private NacosConfigListener nacosConfigListener;

    @PostConstruct
    public void init() {
        try {
        //这里是指定监听哪些配置文件,注意这里获取的是extensionConfig,需要配置yaml中的extensionConfig
            for (NacosConfigProperties.Config extensionConfig : configProperties.getExtensionConfigs()) {
nacosConfigManager.getConfigService().addListener(extensionConfig.getDataId(), configProperties.getGroup(),nacosConfigListener);
            }
        } catch (NacosException e) {
            log.error("nacos 监听异常:", e);
        }
    }

这里主要是

configProperties.getSharedConfigs(); //获取共享配置
configProperties.getExtensionConfigs();//获取拓展配置

因此如果想监听其中的某个配置就需要在YAML中配置它,by the way遵循nacos默认规则不配置shared-configs无法做到监听,我这里监听了ExtensionConfigs(),因此我配置了它。shared-configs并没有监听,但是因为项目需要所以也配置了。

在这里插入图片描述
热加载

@Component
@Slf4j
public class NacosConfigListener extends AbstractConfigChangeListener {

    @Value("${vims.sp.channel}")
    private String channel;
	
	//初始化
    @PostConstruct
    public void init() {
        try {
            updateChannel(channel);
            log.info("初始化渠道配置成功!");
        } catch (Exception e) {
            log.error("初始化渠道配置出错,请检查渠道nacos配置!",e);
        }
    }

    //接收监听事件
    @Override
    public void receiveConfigChange(ConfigChangeEvent changeEvent) {
        ConfigChangeItem changeItem = changeEvent.getChangeItem("vims.sp.channel");
        String newValue = changeItem.getNewValue();
        log.info("渠道配置更新:{}",newValue);
        updateChannel(newValue);
    }
    //加载
    private void updateChannel(String newValue) {
        try {
            RevenueChannelComponent.CHANNEL_LIST.clear();
            String[] channelListStr = newValue.split(",");
            for (String channelStr : channelListStr) {
                String[] split = channelStr.split(":");
                ChannelComponent.CHANNEL_LIST.put(split[0],split[1]);
            }
        } catch (Exception e) {
            log.error("更新配置出错,请检查渠道nacos配置!",e);
        }
    }
}

总结:先说结论nacos使用起来不如apollo,很多奇怪的问题,比如密码不能用一些特殊字符(客户端1.2.1),和logback的加载有优先级问题,可能会导致logback的配置出错,这些都需要去解决,如果只是用配置中心的话,建议apollo。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值