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数据初始化的操作。

猜你喜欢

转载自blog.csdn.net/zfy163520/article/details/113358641