背景
最近公司微服务全面转向了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。