前一篇关于nacos的文章,是从bootstarp的角度去说, 那么本篇将从admin端的角度去看看。话不多说,那就开始吧!
配置类DataSyncConfiguration
这里必须要提一下DataSyncConfiguration这个类,因为在admin端几种数据同步配置类都是在此构建的,如下:
@Configuration
public class DataSyncConfiguration {
// 这里通过 @ConditionalOnProperty 注解来控制 @Configuration 是否生效
// 同时导入 NacosConfiguration
@Configuration
@ConditionalOnProperty(prefix = "soul.sync.nacos", name = "url")
@Import(NacosConfiguration.class)
static class NacosListener {
// @ConditionalOnMissingBean 表示如果存在 NacosDataChangedListener,则不需要装配
@Bean
@ConditionalOnMissingBean(NacosDataChangedListener.class)
public DataChangedListener nacosDataChangedListener(final ConfigService configService) {
return new NacosDataChangedListener(configService);
}
// 同上
@Bean
@ConditionalOnMissingBean(NacosDataInit.class)
public NacosDataInit nacosDataInit(final ConfigService configService, final SyncDataService syncDataService) {
return new NacosDataInit(configService, syncDataService);
}
}
}
上面的代码只是一个配置类,是为了装配:NacosDataChangedListener、NacosDataInit,同时在注解上我也标注了相关注解的含义,那么继续看看:NacosDataChangedListener、NacosDataInit这两个类的代码。
NacosDataChangedListener
public class NacosDataChangedListener implements DataChangedListener {
// 省略N行代码
public NacosDataChangedListener(final ConfigService configService) {
this.configService = configService;
}
@SneakyThrows
private String getConfig(final String dataId) {
String config = configService.getConfig(dataId, NacosPathConstants.GROUP, NacosPathConstants.DEFAULT_TIME_OUT);
return StringUtils.hasLength(config) ? config : NacosPathConstants.EMPTY_CONFIG_DEFAULT_VALUE;
}
@SneakyThrows
private void publishConfig(final String dataId, final Object data) {
configService.publishConfig(dataId, NacosPathConstants.GROUP, GsonUtils.getInstance().toJson(data));
}
@Override
@SneakyThrows
public void onAppAuthChanged(final List<AppAuthData> changed, final DataEventTypeEnum eventType) {
updateAuthMap(getConfig(NacosPathConstants.AUTH_DATA_ID));
switch (eventType) {
// 省略N行代码
}
publishConfig(NacosPathConstants.AUTH_DATA_ID, AUTH_MAP);
}
@Override
public void onPluginChanged(final List<PluginData> changed, final DataEventTypeEnum eventType) {
updatePluginMap(getConfig(NacosPathConstants.PLUGIN_DATA_ID));
switch (eventType) {
// 省略N行代码
}
publishConfig(NacosPathConstants.PLUGIN_DATA_ID, PLUGIN_MAP);
}
@Override
public void onSelectorChanged(final List<SelectorData> changed, final DataEventTypeEnum eventType) {
updateSelectorMap(getConfig(NacosPathConstants.SELECTOR_DATA_ID));
switch (eventType) {
// 省略N行代码
}
publishConfig(NacosPathConstants.SELECTOR_DATA_ID, SELECTOR_MAP);
}
@Override
public void onMetaDataChanged(final List<MetaData> changed, final DataEventTypeEnum eventType) {
updateMetaDataMap(getConfig(NacosPathConstants.META_DATA_ID));
switch (eventType) {
// 省略N行代码
}
publishConfig(NacosPathConstants.META_DATA_ID, META_DATA);
}
@Override
public void onRuleChanged(final List<RuleData> changed, final DataEventTypeEnum eventType) {
updateRuleMap(getConfig(NacosPathConstants.RULE_DATA_ID));
switch (eventType) {
// 省略N行代码
}
publishConfig(NacosPathConstants.RULE_DATA_ID, RULE_MAP);
}
private void updateAuthMap(final String configInfo) {
// 省略N行代码
}
private void updatePluginMap(final String configInfo) {
// 省略N行代码
}
private void updateSelectorMap(final String configInfo) {
// 省略N行代码
}
private void updateMetaDataMap(final String configInfo) {
// 省略N行代码
}
private void updateRuleMap(final String configInfo) {
// 省略N行代码
}
}
上面类的代码很多,这里先简单说下,例如它实现了的DataChangedListener,至于这个接口在前面有提过,这里就不多说了。然后便是代码里涉及到数据变化后,处理事件时所调用的一些方法:onAppAuthChanged、onPluginChanged、onSelectorChanged、onMetaDataChanged、onRuleChanged;这些方法在DataChangedEventDispatcher.class中有调用。
上面提及的那些方法都是根据事件类型,来做相应的判断,然后执行相应的逻辑。
NacosDataInit
public class NacosDataInit implements CommandLineRunner {
private final ConfigService configService;
private final SyncDataService syncDataService;
// 构造函数
public NacosDataInit(final ConfigService configService, final SyncDataService syncDataService) {
this.configService = configService;
this.syncDataService = syncDataService;
}
@Override
public void run(final String... args) {
String pluginDataId = NacosPathConstants.PLUGIN_DATA_ID;
String authDataId = NacosPathConstants.AUTH_DATA_ID;
String metaDataId = NacosPathConstants.META_DATA_ID;
if (dataIdNotExist(pluginDataId) && dataIdNotExist(authDataId) && dataIdNotExist(metaDataId)) {
// 同步数据
syncDataService.syncAll(DataEventTypeEnum.REFRESH);
}
}
// 判断 pluginDataId 是否存在
@SneakyThrows
private boolean dataIdNotExist(final String pluginDataId) {
String group = NacosPathConstants.GROUP;
long timeout = NacosPathConstants.DEFAULT_TIME_OUT;
return configService.getConfig(pluginDataId, group, timeout) == null;
}
}
// 同步数据操作
@Override
public boolean syncAll(final DataEventTypeEnum type) {
appAuthService.syncData();
List<PluginData> pluginDataList = pluginService.listAll();
eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.PLUGIN, type, pluginDataList));
List<SelectorData> selectorDataList = selectorService.listAll();
eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.SELECTOR, type, selectorDataList));
List<RuleData> ruleDataList = ruleService.listAll();
eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.RULE, type, ruleDataList));
metaDataService.syncData();
return true;
}
上面的代码我们在其他文章中已有所涉及,这里就不多说了。但是这里其实就是数据操作后,会发布事件的这么一个操作。
总结
本篇文章简单的补充了一下nacos同步数据在admin端的一些操作,这里涉及到了数据同步的配置类、nacos数据同步配置类、nacos数据初始化的操作。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/1295.html