refactor:optimize config locate. (#1742)

Signed-off-by: Haotian Zhang <928016560@qq.com>
pull/1744/head
Haotian Zhang 1 month ago committed by GitHub
parent 7414328883
commit 99ec4c59ce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -3,3 +3,4 @@
- [feat: upgrade springdoc to 1.8.0.](https://github.com/Tencent/spring-cloud-tencent/pull/1737) - [feat: upgrade springdoc to 1.8.0.](https://github.com/Tencent/spring-cloud-tencent/pull/1737)
- [refactor:optimize auto configuration.](https://github.com/Tencent/spring-cloud-tencent/pull/1740) - [refactor:optimize auto configuration.](https://github.com/Tencent/spring-cloud-tencent/pull/1740)
- [refactor:optimize config locate.](https://github.com/Tencent/spring-cloud-tencent/pull/1742)

@ -17,20 +17,14 @@
package com.tencent.cloud.polaris.config.adapter; package com.tencent.cloud.polaris.config.adapter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import com.tencent.cloud.common.util.EnvironmentUtils;
import com.tencent.cloud.polaris.config.config.ConfigFileGroup; import com.tencent.cloud.polaris.config.config.ConfigFileGroup;
import com.tencent.cloud.polaris.config.config.PolarisConfigProperties; import com.tencent.cloud.polaris.config.config.PolarisConfigProperties;
import com.tencent.cloud.polaris.context.config.PolarisContextProperties; import com.tencent.cloud.polaris.context.config.PolarisContextProperties;
import com.tencent.polaris.api.utils.CollectionUtils; import com.tencent.polaris.api.utils.CollectionUtils;
import com.tencent.polaris.api.utils.StringUtils; import com.tencent.polaris.api.utils.StringUtils;
import com.tencent.polaris.configuration.api.core.ConfigFileMetadata;
import com.tencent.polaris.configuration.api.core.ConfigFileService; import com.tencent.polaris.configuration.api.core.ConfigFileService;
import com.tencent.polaris.configuration.client.internal.DefaultConfigFileMetadata;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -40,9 +34,6 @@ import org.springframework.core.env.CompositePropertySource;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.core.env.PropertySource; import org.springframework.core.env.PropertySource;
import static com.tencent.cloud.polaris.config.utils.PolarisPropertySourceUtils.loadGroupPolarisPropertySource;
import static com.tencent.cloud.polaris.config.utils.PolarisPropertySourceUtils.loadPolarisPropertySource;
/** /**
* Spring cloud reserved core configuration loading SPI. * Spring cloud reserved core configuration loading SPI.
* <p> * <p>
@ -60,6 +51,7 @@ public class PolarisConfigFileLocator implements PropertySourceLocator {
private final PolarisConfigProperties polarisConfigProperties; private final PolarisConfigProperties polarisConfigProperties;
private final PolarisContextProperties polarisContextProperties; private final PolarisContextProperties polarisContextProperties;
private final ConfigFileService configFileService; private final ConfigFileService configFileService;
private final PolarisConfigFilePuller puller;
private final Environment environment; private final Environment environment;
// this class provides customized logic for some customers to configure special business group files // this class provides customized logic for some customers to configure special business group files
private final PolarisConfigCustomExtensionLayer polarisConfigCustomExtensionLayer = PolarisServiceLoaderUtil.getPolarisConfigCustomExtensionLayer(); private final PolarisConfigCustomExtensionLayer polarisConfigCustomExtensionLayer = PolarisServiceLoaderUtil.getPolarisConfigCustomExtensionLayer();
@ -69,6 +61,7 @@ public class PolarisConfigFileLocator implements PropertySourceLocator {
this.polarisConfigProperties = polarisConfigProperties; this.polarisConfigProperties = polarisConfigProperties;
this.polarisContextProperties = polarisContextProperties; this.polarisContextProperties = polarisContextProperties;
this.configFileService = configFileService; this.configFileService = configFileService;
this.puller = PolarisConfigFilePuller.get(polarisContextProperties, configFileService);
this.environment = environment; this.environment = environment;
} }
@ -94,10 +87,7 @@ public class PolarisConfigFileLocator implements PropertySourceLocator {
// load spring boot default config files // load spring boot default config files
initInternalConfigFiles(compositePropertySource); initInternalConfigFiles(compositePropertySource);
// load custom config files // load custom config files
List<ConfigFileGroup> configFileGroups = polarisConfigProperties.getGroups(); initCustomPolarisConfigFiles(compositePropertySource);
if (CollectionUtils.isNotEmpty(configFileGroups)) {
initCustomPolarisConfigFiles(compositePropertySource, configFileGroups);
}
// load tsf default config group // load tsf default config group
initTsfConfigGroups(compositePropertySource); initTsfConfigGroups(compositePropertySource);
return compositePropertySource; return compositePropertySource;
@ -129,142 +119,24 @@ public class PolarisConfigFileLocator implements PropertySourceLocator {
if (!polarisConfigProperties.isInternalEnabled()) { if (!polarisConfigProperties.isInternalEnabled()) {
return; return;
} }
List<ConfigFileMetadata> internalConfigFiles = getInternalConfigFiles();
for (ConfigFileMetadata configFile : internalConfigFiles) {
if (StringUtils.isEmpty(configFile.getFileGroup())) {
continue;
}
PolarisPropertySource polarisPropertySource = loadPolarisPropertySource(configFileService, configFile.getNamespace(), configFile.getFileGroup(), configFile.getFileName());
compositePropertySource.addPropertySource(polarisPropertySource);
PolarisPropertySourceManager.addPropertySource(polarisPropertySource);
LOGGER.info("[SCT Config] Load and inject polaris config file. file = {}", configFile);
}
}
private List<ConfigFileMetadata> getInternalConfigFiles() {
String namespace = polarisContextProperties.getNamespace();
String serviceName = polarisContextProperties.getService();
if (StringUtils.isBlank(serviceName)) {
serviceName = environment.getProperty("spring.application.name");
}
List<ConfigFileMetadata> internalConfigFiles = new LinkedList<>();
// priority: application-${profile} > application > boostrap-${profile} > boostrap // priority: application-${profile} > application > boostrap-${profile} > boostrap
String[] activeProfiles = environment.getActiveProfiles(); String[] activeProfiles = environment.getActiveProfiles();
String[] defaultProfiles = environment.getDefaultProfiles(); String[] defaultProfiles = environment.getDefaultProfiles();
List<String> profileList = new ArrayList<>(); String serviceName = polarisContextProperties.getService();
if (CollectionUtils.isNotEmpty(activeProfiles)) { if (StringUtils.isBlank(serviceName)) {
profileList.addAll(Arrays.asList(activeProfiles)); serviceName = environment.getProperty("spring.application.name");
}
else if (CollectionUtils.isNotEmpty(defaultProfiles)) {
profileList.addAll(Arrays.asList(defaultProfiles));
}
// build application config files
buildInternalApplicationConfigFiles(internalConfigFiles, namespace, serviceName, profileList);
// build bootstrap config files
buildInternalBootstrapConfigFiles(internalConfigFiles, namespace, serviceName, profileList);
return internalConfigFiles;
}
private void buildInternalApplicationConfigFiles(List<ConfigFileMetadata> internalConfigFiles, String namespace, String serviceName, List<String> profileList) {
for (String profile : profileList) {
if (StringUtils.isBlank(profile)) {
continue;
}
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application-" + profile + ".properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application-" + profile + ".yml"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application-" + profile + ".yaml"));
}
// build default config properties files.
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application.properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application.yml"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application.yaml"));
}
private void buildInternalBootstrapConfigFiles(List<ConfigFileMetadata> internalConfigFiles, String namespace, String serviceName, List<String> profileList) {
for (String profile : profileList) {
if (StringUtils.isBlank(profile)) {
continue;
}
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap-" + profile + ".properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap-" + profile + ".yml"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap-" + profile + ".yaml"));
}
// build default config properties files.
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap.properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap.yml"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap.yaml"));
}
void initTsfConfigGroups(CompositePropertySource compositePropertySource) {
String tsfId = environment.getProperty("tsf_id");
String tsfNamespaceName = environment.getProperty("tsf_namespace_name");
String tsfGroupName = environment.getProperty("tsf_group_name");
if (StringUtils.isEmpty(tsfNamespaceName) || StringUtils.isEmpty(tsfGroupName)) {
return;
}
String namespace = polarisContextProperties.getNamespace();
List<String> tsfConfigGroups = new ArrayList<>();
tsfConfigGroups.add((StringUtils.isNotBlank(tsfId) ? tsfId + "." : "") + tsfGroupName + ".application_config_group");
tsfConfigGroups.add((StringUtils.isNotBlank(tsfId) ? tsfId + "." : "") + tsfNamespaceName + ".global_config_group");
if (EnvironmentUtils.isGateway()) {
tsfConfigGroups.add((StringUtils.isNotBlank(tsfId) ? tsfId + "." : "") + tsfGroupName + ".gateway_config_group");
}
for (String tsfConfigGroup : tsfConfigGroups) {
PolarisPropertySource polarisPropertySource = loadGroupPolarisPropertySource(configFileService, namespace, tsfConfigGroup);
if (polarisPropertySource == null) {
// not register to polaris
continue;
}
compositePropertySource.addPropertySource(polarisPropertySource);
PolarisPropertySourceManager.addPropertySource(polarisPropertySource);
}
}
private void initCustomPolarisConfigFiles(CompositePropertySource compositePropertySource, List<ConfigFileGroup> configFileGroups) {
String namespace = polarisContextProperties.getNamespace();
for (ConfigFileGroup configFileGroup : configFileGroups) {
String groupNamespace = configFileGroup.getNamespace();
if (StringUtils.isBlank(groupNamespace)) {
groupNamespace = namespace;
} }
this.puller.initInternalConfigFiles(compositePropertySource, activeProfiles, defaultProfiles, serviceName);
String group = configFileGroup.getName();
if (StringUtils.isBlank(group)) {
continue;
} }
List<String> files = configFileGroup.getFiles(); private void initCustomPolarisConfigFiles(CompositePropertySource compositePropertySource) {
List<ConfigFileGroup> configFileGroups = polarisConfigProperties.getGroups();
if (CollectionUtils.isEmpty(files)) { if (CollectionUtils.isNotEmpty(configFileGroups)) {
PolarisPropertySource polarisPropertySource = loadGroupPolarisPropertySource(configFileService, namespace, group); this.puller.initCustomPolarisConfigFiles(compositePropertySource, configFileGroups);
if (polarisPropertySource == null) {
continue;
} }
compositePropertySource.addPropertySource(polarisPropertySource);
PolarisPropertySourceManager.addPropertySource(polarisPropertySource);
LOGGER.info("[SCT Config] Load and inject polaris config file success. namespace = {}, group = {}", namespace, group);
} }
else {
for (String fileName : files) {
PolarisPropertySource polarisPropertySource = loadPolarisPropertySource(configFileService, groupNamespace, group, fileName);
compositePropertySource.addPropertySource(polarisPropertySource);
PolarisPropertySourceManager.addPropertySource(polarisPropertySource);
LOGGER.info("[SCT Config] Load and inject polaris config file success. namespace = {}, group = {}, fileName = {}", groupNamespace, group, fileName); private void initTsfConfigGroups(CompositePropertySource compositePropertySource) {
} this.puller.initTsfConfigGroups(compositePropertySource);
}
}
} }
} }

@ -31,9 +31,11 @@ import com.tencent.polaris.api.utils.StringUtils;
import com.tencent.polaris.configuration.api.core.ConfigFileMetadata; import com.tencent.polaris.configuration.api.core.ConfigFileMetadata;
import com.tencent.polaris.configuration.api.core.ConfigFileService; import com.tencent.polaris.configuration.api.core.ConfigFileService;
import com.tencent.polaris.configuration.client.internal.DefaultConfigFileMetadata; import com.tencent.polaris.configuration.client.internal.DefaultConfigFileMetadata;
import org.apache.commons.logging.Log;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.boot.logging.DeferredLogFactory;
import org.springframework.core.env.CompositePropertySource; import org.springframework.core.env.CompositePropertySource;
import static com.tencent.cloud.polaris.config.utils.PolarisPropertySourceUtils.loadGroupPolarisPropertySource; import static com.tencent.cloud.polaris.config.utils.PolarisPropertySourceUtils.loadGroupPolarisPropertySource;
@ -46,7 +48,9 @@ import static com.tencent.cloud.polaris.config.utils.PolarisPropertySourceUtils.
*/ */
public final class PolarisConfigFilePuller { public final class PolarisConfigFilePuller {
private static final Logger LOGGER = LoggerFactory.getLogger(PolarisConfigFileLocator.class); private static final Logger LOGGER = LoggerFactory.getLogger(PolarisConfigFilePuller.class);
private static Log log;
private PolarisContextProperties polarisContextProperties; private PolarisContextProperties polarisContextProperties;
@ -55,6 +59,10 @@ public final class PolarisConfigFilePuller {
private PolarisConfigFilePuller() { private PolarisConfigFilePuller() {
} }
public static PolarisConfigFilePuller get(PolarisContextProperties polarisContextProperties, ConfigFileService configFileService) {
return get(polarisContextProperties, configFileService, null);
}
/** /**
* Factory method to create PolarisConfigFilePuller for * Factory method to create PolarisConfigFilePuller for
* {@link PolarisConfigDataLoader},{@link PolarisConfigFileLocator}. * {@link PolarisConfigDataLoader},{@link PolarisConfigFileLocator}.
@ -63,13 +71,26 @@ public final class PolarisConfigFilePuller {
* @param configFileService configFileService * @param configFileService configFileService
* @return PolarisConfigFilePuller instance * @return PolarisConfigFilePuller instance
*/ */
public static PolarisConfigFilePuller get(PolarisContextProperties polarisContextProperties, ConfigFileService configFileService) { public static PolarisConfigFilePuller get(PolarisContextProperties polarisContextProperties,
ConfigFileService configFileService, DeferredLogFactory logFactory) {
PolarisConfigFilePuller puller = new PolarisConfigFilePuller(); PolarisConfigFilePuller puller = new PolarisConfigFilePuller();
puller.polarisContextProperties = polarisContextProperties; puller.polarisContextProperties = polarisContextProperties;
puller.configFileService = configFileService; puller.configFileService = configFileService;
if (logFactory != null) {
log = logFactory.getLog(PolarisConfigFilePuller.class);
}
return puller; return puller;
} }
private static void logInfo(String msg) {
if (log != null) {
log.info(msg);
}
else {
LOGGER.info(msg);
}
}
/** /**
* InitInternalConfigFiles for {@link PolarisConfigDataLoader}. * InitInternalConfigFiles for {@link PolarisConfigDataLoader}.
* *
@ -80,13 +101,14 @@ public final class PolarisConfigFilePuller {
*/ */
public void initInternalConfigFiles(CompositePropertySource compositePropertySource, String[] activeProfiles, public void initInternalConfigFiles(CompositePropertySource compositePropertySource, String[] activeProfiles,
String[] defaultProfiles, String serviceName) { String[] defaultProfiles, String serviceName) {
logInfo("[SCT Config] Loading polaris internal config files");
List<ConfigFileMetadata> internalConfigFiles = getInternalConfigFiles(activeProfiles, defaultProfiles, serviceName); List<ConfigFileMetadata> internalConfigFiles = getInternalConfigFiles(activeProfiles, defaultProfiles, serviceName);
for (ConfigFileMetadata configFile : internalConfigFiles) { for (ConfigFileMetadata configFile : internalConfigFiles) {
PolarisPropertySource polarisPropertySource = loadPolarisPropertySource(configFileService, PolarisPropertySource polarisPropertySource = loadPolarisPropertySource(configFileService,
configFile.getNamespace(), configFile.getFileGroup(), configFile.getFileName()); configFile.getNamespace(), configFile.getFileGroup(), configFile.getFileName());
compositePropertySource.addPropertySource(polarisPropertySource); compositePropertySource.addPropertySource(polarisPropertySource);
PolarisPropertySourceManager.addPropertySource(polarisPropertySource); PolarisPropertySourceManager.addPropertySource(polarisPropertySource);
LOGGER.info("[SCT Config] Load and inject polaris config file. file = {}", configFile); logInfo(String.format("[SCT Config] Load and inject polaris internal config file success. file = %s", configFile));
} }
} }
@ -98,6 +120,7 @@ public final class PolarisConfigFilePuller {
*/ */
public void initCustomPolarisConfigFiles(CompositePropertySource compositePropertySource, public void initCustomPolarisConfigFiles(CompositePropertySource compositePropertySource,
List<ConfigFileGroup> configFileGroups) { List<ConfigFileGroup> configFileGroups) {
logInfo("[SCT Config] Loading polaris custom config files");
configFileGroups.forEach( configFileGroups.forEach(
configFileGroup -> initCustomPolarisConfigFile(compositePropertySource, configFileGroup) configFileGroup -> initCustomPolarisConfigFile(compositePropertySource, configFileGroup)
); );
@ -121,15 +144,21 @@ public final class PolarisConfigFilePuller {
} }
List<String> files = configFileGroup.getFiles(); List<String> files = configFileGroup.getFiles();
if (CollectionUtils.isEmpty(files)) { if (CollectionUtils.isEmpty(files)) {
PolarisPropertySource polarisPropertySource = loadGroupPolarisPropertySource(configFileService, groupNamespace, group);
if (polarisPropertySource == null) {
return; return;
} }
compositePropertySource.addPropertySource(polarisPropertySource);
PolarisPropertySourceManager.addPropertySource(polarisPropertySource);
logInfo(String.format("[SCT Config] Load and inject polaris custom group config file success. namespace = %s, group = %s", groupNamespace, group));
}
else {
for (String fileName : files) { for (String fileName : files) {
PolarisPropertySource polarisPropertySource = loadPolarisPropertySource(configFileService, groupNamespace, group, fileName); PolarisPropertySource polarisPropertySource = loadPolarisPropertySource(configFileService, groupNamespace, group, fileName);
compositePropertySource.addPropertySource(polarisPropertySource); compositePropertySource.addPropertySource(polarisPropertySource);
PolarisPropertySourceManager.addPropertySource(polarisPropertySource); PolarisPropertySourceManager.addPropertySource(polarisPropertySource);
LOGGER.info( logInfo(String.format("[SCT Config] Load and inject polaris custom config file success. namespace = %s, group = %s, fileName = %s", groupNamespace, group, fileName));
"[SCT Config] Load and inject polaris config file success. namespace = {}, group = {}, fileName = {}", }
groupNamespace, group, fileName);
} }
} }
@ -145,6 +174,7 @@ public final class PolarisConfigFilePuller {
if (StringUtils.isEmpty(tsfNamespaceName) || StringUtils.isEmpty(tsfGroupName)) { if (StringUtils.isEmpty(tsfNamespaceName) || StringUtils.isEmpty(tsfGroupName)) {
return; return;
} }
logInfo("[SCT Config] Loading tsf config files");
String namespace = polarisContextProperties.getNamespace(); String namespace = polarisContextProperties.getNamespace();
List<String> tsfConfigGroups = new ArrayList<>(); List<String> tsfConfigGroups = new ArrayList<>();
tsfConfigGroups.add((StringUtils.isNotBlank(tsfId) ? tsfId + "." : "") + tsfGroupName + ".application_config_group"); tsfConfigGroups.add((StringUtils.isNotBlank(tsfId) ? tsfId + "." : "") + tsfGroupName + ".application_config_group");
@ -161,6 +191,7 @@ public final class PolarisConfigFilePuller {
} }
compositePropertySource.addPropertySource(polarisPropertySource); compositePropertySource.addPropertySource(polarisPropertySource);
PolarisPropertySourceManager.addPropertySource(polarisPropertySource); PolarisPropertySourceManager.addPropertySource(polarisPropertySource);
logInfo(String.format("[SCT Config] Load and inject tsf config file success. namespace = %s, group = %s", namespace, tsfConfigGroup));
} }
} }

@ -28,12 +28,13 @@ import com.tencent.cloud.polaris.config.adapter.PolarisConfigFilePuller;
import com.tencent.cloud.polaris.config.adapter.PolarisServiceLoaderUtil; import com.tencent.cloud.polaris.config.adapter.PolarisServiceLoaderUtil;
import com.tencent.cloud.polaris.config.config.ConfigFileGroup; import com.tencent.cloud.polaris.config.config.ConfigFileGroup;
import com.tencent.cloud.polaris.config.config.PolarisConfigProperties; import com.tencent.cloud.polaris.config.config.PolarisConfigProperties;
import com.tencent.polaris.api.utils.CollectionUtils;
import com.tencent.polaris.api.utils.StringUtils;
import com.tencent.polaris.client.api.SDKContext; import com.tencent.polaris.client.api.SDKContext;
import com.tencent.polaris.configuration.api.core.ConfigFileService; import com.tencent.polaris.configuration.api.core.ConfigFileService;
import com.tencent.polaris.configuration.factory.ConfigFileServiceFactory; import com.tencent.polaris.configuration.factory.ConfigFileServiceFactory;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.springframework.boot.ConfigurableBootstrapContext;
import org.springframework.boot.context.config.ConfigData; import org.springframework.boot.context.config.ConfigData;
import org.springframework.boot.context.config.ConfigDataLoader; import org.springframework.boot.context.config.ConfigDataLoader;
import org.springframework.boot.context.config.ConfigDataLoaderContext; import org.springframework.boot.context.config.ConfigDataLoaderContext;
@ -42,8 +43,6 @@ import org.springframework.boot.context.config.Profiles;
import org.springframework.boot.logging.DeferredLogFactory; import org.springframework.boot.logging.DeferredLogFactory;
import org.springframework.core.env.CompositePropertySource; import org.springframework.core.env.CompositePropertySource;
import org.springframework.core.env.PropertySource; import org.springframework.core.env.PropertySource;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import static org.springframework.boot.context.config.ConfigData.Option.IGNORE_IMPORTS; import static org.springframework.boot.context.config.ConfigData.Option.IGNORE_IMPORTS;
import static org.springframework.boot.context.config.ConfigData.Option.IGNORE_PROFILES; import static org.springframework.boot.context.config.ConfigData.Option.IGNORE_PROFILES;
@ -61,13 +60,16 @@ public class PolarisConfigDataLoader implements ConfigDataLoader<PolarisConfigDa
static final AtomicBoolean INTERNAL_CONFIG_FILES_LOADED = new AtomicBoolean(false); static final AtomicBoolean INTERNAL_CONFIG_FILES_LOADED = new AtomicBoolean(false);
static final AtomicBoolean CUSTOM_POLARIS_CONFIG_FILE_LOADED = new AtomicBoolean(false); static final AtomicBoolean CUSTOM_POLARIS_CONFIG_FILE_LOADED = new AtomicBoolean(false);
static final AtomicBoolean TSF_CONFIG_FILE_LOADED = new AtomicBoolean(false);
private static final String POLARIS_CONFIG_PROPERTY_SOURCE_NAME = "polaris-config"; private static final String POLARIS_CONFIG_PROPERTY_SOURCE_NAME = "polaris-config";
private final Log log; private final Log log;
private final DeferredLogFactory logFactory;
private final PolarisConfigCustomExtensionLayer polarisConfigCustomExtensionLayer = PolarisServiceLoaderUtil.getPolarisConfigCustomExtensionLayer(); private final PolarisConfigCustomExtensionLayer polarisConfigCustomExtensionLayer = PolarisServiceLoaderUtil.getPolarisConfigCustomExtensionLayer();
private ConfigFileService configFileService; private ConfigFileService configFileService;
private PolarisConfigFilePuller puller; private PolarisConfigFilePuller puller;
public PolarisConfigDataLoader(DeferredLogFactory logFactory) { public PolarisConfigDataLoader(DeferredLogFactory logFactory) {
this.logFactory = logFactory;
this.log = logFactory.getLog(getClass()); this.log = logFactory.getLog(getClass());
} }
@ -75,7 +77,7 @@ public class PolarisConfigDataLoader implements ConfigDataLoader<PolarisConfigDa
public ConfigData load(ConfigDataLoaderContext context, PolarisConfigDataResource resource) public ConfigData load(ConfigDataLoaderContext context, PolarisConfigDataResource resource)
throws ConfigDataResourceNotFoundException { throws ConfigDataResourceNotFoundException {
try { try {
return load(context.getBootstrapContext(), resource); return load(resource);
} }
catch (Exception e) { catch (Exception e) {
log.warn("Error getting properties from polaris: " + resource, e); log.warn("Error getting properties from polaris: " + resource, e);
@ -86,15 +88,14 @@ public class PolarisConfigDataLoader implements ConfigDataLoader<PolarisConfigDa
} }
} }
public ConfigData load(ConfigurableBootstrapContext bootstrapContext, PolarisConfigDataResource resource) { public ConfigData load(PolarisConfigDataResource resource) {
CompositePropertySource compositePropertySource = locate(bootstrapContext, resource); CompositePropertySource compositePropertySource = locate(resource);
List<PropertySource<?>> propertySourceList = new ArrayList<>(compositePropertySource.getPropertySources()); List<PropertySource<?>> propertySourceList = new ArrayList<>(compositePropertySource.getPropertySources());
Collections.reverse(propertySourceList); Collections.reverse(propertySourceList);
return new ConfigData(propertySourceList, getOptions(resource)); return new ConfigData(propertySourceList, getOptions(resource));
} }
private CompositePropertySource locate(ConfigurableBootstrapContext bootstrapContext, private CompositePropertySource locate(PolarisConfigDataResource resource) {
PolarisConfigDataResource resource) {
CompositePropertySource compositePropertySource = new CompositePropertySource( CompositePropertySource compositePropertySource = new CompositePropertySource(
POLARIS_CONFIG_PROPERTY_SOURCE_NAME); POLARIS_CONFIG_PROPERTY_SOURCE_NAME);
SDKContext sdkContext = PolarisConfigSDKContextManager.innerGetConfigSDKContext(); SDKContext sdkContext = PolarisConfigSDKContextManager.innerGetConfigSDKContext();
@ -102,41 +103,76 @@ public class PolarisConfigDataLoader implements ConfigDataLoader<PolarisConfigDa
this.configFileService = ConfigFileServiceFactory.createConfigFileService(sdkContext); this.configFileService = ConfigFileServiceFactory.createConfigFileService(sdkContext);
} }
if (null == this.puller) { if (null == this.puller) {
this.puller = PolarisConfigFilePuller.get(resource.getPolarisContextProperties(), configFileService); this.puller = PolarisConfigFilePuller.get(resource.getPolarisContextProperties(), configFileService, logFactory);
} }
PolarisConfigProperties polarisConfigProperties = resource.getPolarisConfigProperties();
try {
// load custom config extension files // load custom config extension files
if (polarisConfigCustomExtensionLayer != null) { initCustomPolarisConfigExtensionFiles(compositePropertySource);
// load spring boot default config files
initInternalConfigFiles(compositePropertySource, polarisConfigProperties, resource);
// load custom config files
initCustomPolarisConfigFiles(compositePropertySource, polarisConfigProperties);
// load config data
initCustomPolarisConfigDataFiles(compositePropertySource, resource);
// load tsf default config group
initTsfConfigGroups(compositePropertySource);
}
finally {
afterLocatePolarisConfigExtension(compositePropertySource);
}
return compositePropertySource;
}
private void initCustomPolarisConfigExtensionFiles(CompositePropertySource compositePropertySource) {
if (polarisConfigCustomExtensionLayer == null) {
log.debug("[SCT Config] PolarisConfigCustomExtensionLayer is not init, ignore the following execution steps");
return;
}
polarisConfigCustomExtensionLayer.initConfigFiles(null, compositePropertySource, configFileService); polarisConfigCustomExtensionLayer.initConfigFiles(null, compositePropertySource, configFileService);
} }
// load spring boot default config files
PolarisConfigProperties polarisConfigProperties = resource.getPolarisConfigProperties(); private void afterLocatePolarisConfigExtension(CompositePropertySource compositePropertySource) {
if (polarisConfigCustomExtensionLayer == null) {
log.debug("[SCT Config] PolarisConfigCustomExtensionLayer is not init, ignore the following execution steps");
return;
}
polarisConfigCustomExtensionLayer.executeAfterLocateConfigReturning(compositePropertySource);
}
private void initInternalConfigFiles(CompositePropertySource compositePropertySource,
PolarisConfigProperties polarisConfigProperties, PolarisConfigDataResource resource) {
Profiles profiles = resource.getProfiles(); Profiles profiles = resource.getProfiles();
if (polarisConfigProperties.isInternalEnabled() && INTERNAL_CONFIG_FILES_LOADED.compareAndSet(false, true)) { if (polarisConfigProperties.isInternalEnabled() && INTERNAL_CONFIG_FILES_LOADED.compareAndSet(false, true)) {
log.info("loading internal config files");
String[] activeProfiles = profiles.getActive().toArray(new String[] {}); String[] activeProfiles = profiles.getActive().toArray(new String[] {});
String[] defaultProfiles = profiles.getDefault().toArray(new String[] {}); String[] defaultProfiles = profiles.getDefault().toArray(new String[] {});
this.puller.initInternalConfigFiles( this.puller.initInternalConfigFiles(
compositePropertySource, activeProfiles, defaultProfiles, resource.getServiceName()); compositePropertySource, activeProfiles, defaultProfiles, resource.getServiceName());
} }
// load custom config files }
private void initCustomPolarisConfigFiles(CompositePropertySource compositePropertySource,
PolarisConfigProperties polarisConfigProperties) {
if (!CollectionUtils.isEmpty(polarisConfigProperties.getGroups()) && if (!CollectionUtils.isEmpty(polarisConfigProperties.getGroups()) &&
CUSTOM_POLARIS_CONFIG_FILE_LOADED.compareAndSet(false, true)) { CUSTOM_POLARIS_CONFIG_FILE_LOADED.compareAndSet(false, true)) {
log.info("loading custom config files");
this.puller.initCustomPolarisConfigFiles(compositePropertySource, this.puller.initCustomPolarisConfigFiles(compositePropertySource,
polarisConfigProperties.getGroups()); polarisConfigProperties.getGroups());
} }
// load config data }
if (StringUtils.hasText(resource.getFileName())) {
log.info("loading config data config file, group:" + resource.getGroupName() + " file: " + resource.getFileName()); private void initCustomPolarisConfigDataFiles(CompositePropertySource compositePropertySource,
PolarisConfigDataResource resource) {
if (StringUtils.isNotBlank(resource.getFileName())) {
log.info("[SCT Config] Loading polaris custom config data file, group:" + resource.getGroupName() + " file: " + resource.getFileName());
this.puller.initCustomPolarisConfigFile(compositePropertySource, configFileGroup(resource)); this.puller.initCustomPolarisConfigFile(compositePropertySource, configFileGroup(resource));
} }
// load tsf default config group
this.puller.initTsfConfigGroups(compositePropertySource);
if (polarisConfigCustomExtensionLayer != null) {
polarisConfigCustomExtensionLayer.executeAfterLocateConfigReturning(compositePropertySource);
} }
return compositePropertySource; private void initTsfConfigGroups(CompositePropertySource compositePropertySource) {
if (TSF_CONFIG_FILE_LOADED.compareAndSet(false, true)) {
this.puller.initTsfConfigGroups(compositePropertySource);
}
} }
private ConfigData.Option[] getOptions(PolarisConfigDataResource resource) { private ConfigData.Option[] getOptions(PolarisConfigDataResource resource) {

@ -28,7 +28,6 @@ import java.util.Map;
import com.tencent.cloud.polaris.config.config.ConfigFileGroup; import com.tencent.cloud.polaris.config.config.ConfigFileGroup;
import com.tencent.cloud.polaris.config.config.PolarisConfigProperties; import com.tencent.cloud.polaris.config.config.PolarisConfigProperties;
import com.tencent.cloud.polaris.config.enums.RefreshType; import com.tencent.cloud.polaris.config.enums.RefreshType;
import com.tencent.cloud.polaris.config.utils.PolarisPropertySourceUtils;
import com.tencent.cloud.polaris.context.config.PolarisContextProperties; import com.tencent.cloud.polaris.context.config.PolarisContextProperties;
import com.tencent.polaris.configuration.api.core.ConfigFileService; import com.tencent.polaris.configuration.api.core.ConfigFileService;
import com.tencent.polaris.configuration.api.core.ConfigKVFile; import com.tencent.polaris.configuration.api.core.ConfigKVFile;
@ -37,18 +36,12 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.core.env.CompositePropertySource;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.core.env.PropertySource; import org.springframework.core.env.PropertySource;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
/** /**
@ -277,51 +270,6 @@ public class PolarisConfigFileLocatorTest {
assertThat(propertySource.getProperty("k3")).isEqualTo("v3"); assertThat(propertySource.getProperty("k3")).isEqualTo("v3");
} }
@Test
void testInitTsfConfigGroupsSuccessfulLoad() {
clearCompositePropertySourceCache();
// Arrange
String tsfId = "test-id";
String tsfNamespace = "test-namespace";
String tsfGroup = "test-group";
String polarisNamespace = "polaris-namespace";
when(environment.getProperty("tsf_id")).thenReturn(tsfId);
when(environment.getProperty("tsf_namespace_name")).thenReturn(tsfNamespace);
when(environment.getProperty("tsf_group_name")).thenReturn(tsfGroup);
when(polarisContextProperties.getNamespace()).thenReturn(polarisNamespace);
String expectedAppConfigGroup = tsfId + "." + tsfGroup + ".application_config_group";
// mock polaris config properties
PolarisPropertySource mockPropertySource = mock(PolarisPropertySource.class);
when(mockPropertySource.getPropertySourceName()).thenReturn(expectedAppConfigGroup);
CompositePropertySource compositePropertySource = mock(CompositePropertySource.class);
try (MockedStatic<PolarisPropertySourceUtils> mockedStatic = mockStatic(PolarisPropertySourceUtils.class)) {
mockedStatic.when(() -> PolarisPropertySourceUtils.loadGroupPolarisPropertySource(
eq(configFileService),
eq(polarisNamespace),
any()
)).thenReturn(mockPropertySource);
PolarisConfigFileLocator locator = new PolarisConfigFileLocator(
polarisConfigProperties,
polarisContextProperties,
configFileService,
environment
);
// Act
locator.initTsfConfigGroups(compositePropertySource);
// Verify
List<PolarisPropertySource> polarisPropertySources = PolarisPropertySourceManager.getAllPropertySources();
assertThat(polarisPropertySources.stream().map(PolarisPropertySource::getPropertySourceName).
filter(name -> name.equals(expectedAppConfigGroup)).count() == 1);
}
}
@Test @Test
void testPolarisConfigProperties() { void testPolarisConfigProperties() {
PolarisConfigProperties testProperties = new PolarisConfigProperties(); PolarisConfigProperties testProperties = new PolarisConfigProperties();

@ -23,6 +23,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import com.tencent.cloud.polaris.config.config.ConfigFileGroup; import com.tencent.cloud.polaris.config.config.ConfigFileGroup;
import com.tencent.cloud.polaris.config.utils.PolarisPropertySourceUtils;
import com.tencent.cloud.polaris.context.config.PolarisContextProperties; import com.tencent.cloud.polaris.context.config.PolarisContextProperties;
import com.tencent.polaris.configuration.api.core.ConfigFileService; import com.tencent.polaris.configuration.api.core.ConfigFileService;
import com.tencent.polaris.configuration.api.core.ConfigKVFile; import com.tencent.polaris.configuration.api.core.ConfigKVFile;
@ -30,11 +31,16 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.core.env.CompositePropertySource; import org.springframework.core.env.CompositePropertySource;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
/** /**
@ -175,4 +181,44 @@ public class PolarisConfigFilePullerTest {
assertThat(compositePropertySource.getProperty("k2")).isEqualTo("v2"); assertThat(compositePropertySource.getProperty("k2")).isEqualTo("v2");
assertThat(compositePropertySource.getProperty("k3")).isEqualTo("v3"); assertThat(compositePropertySource.getProperty("k3")).isEqualTo("v3");
} }
@Test
void testInitTsfConfigGroupsSuccessfulLoad() {
PolarisConfigFilePuller puller = PolarisConfigFilePuller.get(polarisContextProperties, configFileService);
// Arrange
String tsfId = "test-id";
String tsfNamespace = "test-namespace";
String tsfGroup = "test-group";
String polarisNamespace = "polaris-namespace";
System.setProperty("tsf_id", tsfId);
System.setProperty("tsf_namespace_name", tsfNamespace);
System.setProperty("tsf_group_name", tsfGroup);
when(polarisContextProperties.getNamespace()).thenReturn(polarisNamespace);
String expectedAppConfigGroup = tsfId + "." + tsfGroup + ".application_config_group";
// mock polaris config properties
PolarisPropertySource mockPropertySource = mock(PolarisPropertySource.class);
when(mockPropertySource.getPropertySourceName()).thenReturn(expectedAppConfigGroup);
CompositePropertySource compositePropertySource = mock(CompositePropertySource.class);
try (MockedStatic<PolarisPropertySourceUtils> mockedStatic = mockStatic(PolarisPropertySourceUtils.class)) {
mockedStatic.when(() -> PolarisPropertySourceUtils.loadGroupPolarisPropertySource(
eq(configFileService),
eq(polarisNamespace),
any()
)).thenReturn(mockPropertySource);
// Act
puller.initTsfConfigGroups(compositePropertySource);
// Verify
List<PolarisPropertySource> polarisPropertySources = PolarisPropertySourceManager.getAllPropertySources();
assertThat(polarisPropertySources.stream().map(PolarisPropertySource::getPropertySourceName).
filter(name -> name.equals(expectedAppConfigGroup)).count() == 1);
}
}
} }

@ -37,7 +37,6 @@ import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.MockedStatic; import org.mockito.MockedStatic;
import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.boot.ConfigurableBootstrapContext;
import org.springframework.boot.context.config.ConfigData; import org.springframework.boot.context.config.ConfigData;
import org.springframework.boot.context.config.ConfigDataLoaderContext; import org.springframework.boot.context.config.ConfigDataLoaderContext;
import org.springframework.boot.context.config.Profiles; import org.springframework.boot.context.config.Profiles;
@ -82,7 +81,6 @@ public class PolarisConfigDataLoaderTest {
try (MockedStatic<ConfigFileServiceFactory> mockedStatic = mockStatic(ConfigFileServiceFactory.class)) { try (MockedStatic<ConfigFileServiceFactory> mockedStatic = mockStatic(ConfigFileServiceFactory.class)) {
ConfigDataLoaderContext context = mock(ConfigDataLoaderContext.class); ConfigDataLoaderContext context = mock(ConfigDataLoaderContext.class);
PolarisConfigDataResource polarisConfigDataResource = mock(PolarisConfigDataResource.class); PolarisConfigDataResource polarisConfigDataResource = mock(PolarisConfigDataResource.class);
ConfigurableBootstrapContext bootstrapContext = mock(ConfigurableBootstrapContext.class);
PolarisConfigProperties polarisConfigProperties = mock(PolarisConfigProperties.class); PolarisConfigProperties polarisConfigProperties = mock(PolarisConfigProperties.class);
PolarisContextProperties polarisContextProperties = mock(PolarisContextProperties.class); PolarisContextProperties polarisContextProperties = mock(PolarisContextProperties.class);
ConfigFileService configFileService = mock(ConfigFileService.class); ConfigFileService configFileService = mock(ConfigFileService.class);
@ -101,7 +99,6 @@ public class PolarisConfigDataLoaderTest {
ConfigKVFile propertiesFile = new MockedConfigKVFile(applicationProperties); ConfigKVFile propertiesFile = new MockedConfigKVFile(applicationProperties);
when(configFileService.getConfigPropertiesFile(testNamespace, testServiceName, "application.properties")) when(configFileService.getConfigPropertiesFile(testNamespace, testServiceName, "application.properties"))
.thenReturn(propertiesFile); .thenReturn(propertiesFile);
when(context.getBootstrapContext()).thenReturn(bootstrapContext);
when(polarisContextProperties.getNamespace()).thenReturn(testNamespace); when(polarisContextProperties.getNamespace()).thenReturn(testNamespace);
when(polarisContextProperties.getService()).thenReturn(testServiceName); when(polarisContextProperties.getService()).thenReturn(testServiceName);
@ -141,7 +138,6 @@ public class PolarisConfigDataLoaderTest {
try (MockedStatic<ConfigFileServiceFactory> mockedStatic = mockStatic(ConfigFileServiceFactory.class)) { try (MockedStatic<ConfigFileServiceFactory> mockedStatic = mockStatic(ConfigFileServiceFactory.class)) {
ConfigDataLoaderContext context = mock(ConfigDataLoaderContext.class); ConfigDataLoaderContext context = mock(ConfigDataLoaderContext.class);
PolarisConfigDataResource polarisConfigDataResource = mock(PolarisConfigDataResource.class); PolarisConfigDataResource polarisConfigDataResource = mock(PolarisConfigDataResource.class);
ConfigurableBootstrapContext bootstrapContext = mock(ConfigurableBootstrapContext.class);
PolarisConfigProperties polarisConfigProperties = mock(PolarisConfigProperties.class); PolarisConfigProperties polarisConfigProperties = mock(PolarisConfigProperties.class);
PolarisContextProperties polarisContextProperties = mock(PolarisContextProperties.class); PolarisContextProperties polarisContextProperties = mock(PolarisContextProperties.class);
ConfigFileService configFileService = mock(ConfigFileService.class); ConfigFileService configFileService = mock(ConfigFileService.class);
@ -180,8 +176,6 @@ public class PolarisConfigDataLoaderTest {
active.add("dev"); active.add("dev");
when(profiles.getActive()).thenReturn(active); when(profiles.getActive()).thenReturn(active);
when(context.getBootstrapContext()).thenReturn(bootstrapContext);
when(polarisContextProperties.getNamespace()).thenReturn(testNamespace); when(polarisContextProperties.getNamespace()).thenReturn(testNamespace);
when(polarisContextProperties.getService()).thenReturn(testServiceName); when(polarisContextProperties.getService()).thenReturn(testServiceName);
@ -221,7 +215,6 @@ public class PolarisConfigDataLoaderTest {
try (MockedStatic<ConfigFileServiceFactory> mockedStatic = mockStatic(ConfigFileServiceFactory.class)) { try (MockedStatic<ConfigFileServiceFactory> mockedStatic = mockStatic(ConfigFileServiceFactory.class)) {
ConfigDataLoaderContext context = mock(ConfigDataLoaderContext.class); ConfigDataLoaderContext context = mock(ConfigDataLoaderContext.class);
PolarisConfigDataResource polarisConfigDataResource = mock(PolarisConfigDataResource.class); PolarisConfigDataResource polarisConfigDataResource = mock(PolarisConfigDataResource.class);
ConfigurableBootstrapContext bootstrapContext = mock(ConfigurableBootstrapContext.class);
PolarisConfigProperties polarisConfigProperties = mock(PolarisConfigProperties.class); PolarisConfigProperties polarisConfigProperties = mock(PolarisConfigProperties.class);
PolarisContextProperties polarisContextProperties = mock(PolarisContextProperties.class); PolarisContextProperties polarisContextProperties = mock(PolarisContextProperties.class);
ConfigFileService configFileService = mock(ConfigFileService.class); ConfigFileService configFileService = mock(ConfigFileService.class);
@ -253,8 +246,6 @@ public class PolarisConfigDataLoaderTest {
ConfigKVFile file1 = new MockedConfigKVFile(file1Map); ConfigKVFile file1 = new MockedConfigKVFile(file1Map);
when(configFileService.getConfigPropertiesFile(testNamespace, customGroup, customFile1)).thenReturn(file1); when(configFileService.getConfigPropertiesFile(testNamespace, customGroup, customFile1)).thenReturn(file1);
when(context.getBootstrapContext()).thenReturn(bootstrapContext);
when(polarisContextProperties.getNamespace()).thenReturn(testNamespace); when(polarisContextProperties.getNamespace()).thenReturn(testNamespace);
when(polarisContextProperties.getService()).thenReturn(testServiceName); when(polarisContextProperties.getService()).thenReturn(testServiceName);

Loading…
Cancel
Save