Soul API网关数据同步之Nacos数据同步(admin端)详解程序员

前一篇关于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

(0)
上一篇 2021年7月15日
下一篇 2021年7月15日

相关推荐

发表回复

登录后才能评论