pull/451/head
wulingxiao 3 years ago
parent ae2974fc5a
commit 0007b4a95b

@ -0,0 +1,174 @@
package com.tencent.cloud.polaris.config.adapter;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.tencent.cloud.polaris.config.config.ConfigFileGroup;
import com.tencent.cloud.polaris.config.enums.ConfigFileFormat;
import com.tencent.cloud.polaris.context.config.PolarisContextProperties;
import com.tencent.polaris.configuration.api.core.ConfigFileMetadata;
import com.tencent.polaris.configuration.api.core.ConfigFileService;
import com.tencent.polaris.configuration.api.core.ConfigKVFile;
import com.tencent.polaris.configuration.client.internal.DefaultConfigFileMetadata;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.CompositePropertySource;
import org.springframework.core.env.Environment;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
/**
* Pull configFile from Polaris
*
* @author wlx
*/
public class PolarisConfigFilePuller {
private static final Logger LOGGER = LoggerFactory.getLogger(PolarisConfigFileLocator.class);
private final PolarisContextProperties polarisContextProperties;
private final ConfigFileService configFileService;
private final PolarisPropertySourceManager polarisPropertySourceManager;
private Environment environment;
public PolarisConfigFilePuller(PolarisContextProperties polarisContextProperties,
ConfigFileService configFileService,
PolarisPropertySourceManager polarisPropertySourceManager,
Environment environment) {
this.polarisContextProperties = polarisContextProperties;
this.configFileService = configFileService;
this.polarisPropertySourceManager = polarisPropertySourceManager;
this.environment = environment;
}
public PolarisConfigFilePuller(PolarisContextProperties polarisContextProperties,
ConfigFileService configFileService,
PolarisPropertySourceManager polarisPropertySourceManager) {
this.polarisContextProperties = polarisContextProperties;
this.configFileService = configFileService;
this.polarisPropertySourceManager = polarisPropertySourceManager;
}
public void initInternalConfigFiles(CompositePropertySource compositePropertySource) {
List<ConfigFileMetadata> internalConfigFiles = getInternalConfigFiles();
for (ConfigFileMetadata configFile : internalConfigFiles) {
PolarisPropertySource polarisPropertySource = loadPolarisPropertySource(
configFile.getNamespace(), configFile.getFileGroup(), configFile.getFileName());
compositePropertySource.addPropertySource(polarisPropertySource);
polarisPropertySourceManager.addPropertySource(polarisPropertySource);
LOGGER.info("[SCT Config] Load and inject polaris config file. file = {}", configFile);
}
}
public List<ConfigFileMetadata> getInternalConfigFiles() {
String namespace = polarisContextProperties.getNamespace();
String serviceName = polarisContextProperties.getService();
if (!StringUtils.hasText(serviceName)) {
serviceName = environment.getProperty("spring.application.name");
}
List<ConfigFileMetadata> internalConfigFiles = new LinkedList<>();
// priority: application-${profile} > application > boostrap-${profile} > boostrap
String[] activeProfiles = environment.getActiveProfiles();
for (String activeProfile : activeProfiles) {
if (!StringUtils.hasText(activeProfile)) {
continue;
}
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application-" + activeProfile + ".properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application-" + activeProfile + ".yml"));
}
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application.properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application.yml"));
for (String activeProfile : activeProfiles) {
if (!StringUtils.hasText(activeProfile)) {
continue;
}
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap-" + activeProfile + ".properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap-" + activeProfile + ".yml"));
}
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap.properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap.yml"));
return internalConfigFiles;
}
public void initCustomPolarisConfigFiles(CompositePropertySource compositePropertySource,
List<ConfigFileGroup> configFileGroups) {
configFileGroups.forEach(
configFileGroup -> initCustomPolarisConfigFile(compositePropertySource, configFileGroup)
);
}
public void initCustomPolarisConfigFile(CompositePropertySource compositePropertySource,
ConfigFileGroup configFileGroup) {
String namespace = polarisContextProperties.getNamespace();
String group = configFileGroup.getName();
if (!StringUtils.hasText(group)) {
throw new IllegalArgumentException("polaris config group name cannot be empty.");
}
List<String> files = configFileGroup.getFiles();
if (CollectionUtils.isEmpty(files)) {
return;
}
for (String fileName : files) {
PolarisPropertySource polarisPropertySource = loadPolarisPropertySource(namespace, group, fileName);
compositePropertySource.addPropertySource(polarisPropertySource);
polarisPropertySourceManager.addPropertySource(polarisPropertySource);
LOGGER.info(
"[SCT Config] Load and inject polaris config file success. namespace = {}, group = {}, fileName = {}",
namespace, group, fileName);
}
}
private PolarisPropertySource loadPolarisPropertySource(String namespace, String group, String fileName) {
ConfigKVFile configKVFile;
// unknown extension is resolved as properties file
if (ConfigFileFormat.isPropertyFile(fileName)
|| ConfigFileFormat.isUnknownFile(fileName)) {
configKVFile = configFileService.getConfigPropertiesFile(namespace, group, fileName);
} else if (ConfigFileFormat.isYamlFile(fileName)) {
configKVFile = configFileService.getConfigYamlFile(namespace, group, fileName);
} else {
LOGGER.warn("[SCT Config] Unsupported config file. namespace = {}, group = {}, fileName = {}", namespace,
group, fileName);
throw new IllegalStateException("Only configuration files in the format of properties / yaml / yaml"
+ " can be injected into the spring context");
}
Map<String, Object> map = new ConcurrentHashMap<>();
for (String key : configKVFile.getPropertyNames()) {
map.put(key, configKVFile.getProperty(key, null));
}
return new PolarisPropertySource(namespace, group, fileName, configKVFile, map);
}
}

@ -1,5 +1,6 @@
package com.tencent.cloud.polaris.config.configdata;
import com.tencent.cloud.polaris.config.adapter.PolarisConfigFilePuller;
import com.tencent.cloud.polaris.config.adapter.PolarisPropertySource;
import com.tencent.cloud.polaris.config.adapter.PolarisPropertySourceManager;
import com.tencent.cloud.polaris.config.config.ConfigFileGroup;
@ -63,22 +64,16 @@ public class PolarisConfigDataLoader implements ConfigDataLoader<PolarisConfigDa
}
private CompositePropertySource locate(ConfigurableBootstrapContext bootstrapContext,
PolarisConfigDataResource resource) {
PolarisConfigDataResource resource) {
CompositePropertySource compositePropertySource = new CompositePropertySource(
POLARIS_CONFIG_PROPERTY_SOURCE_NAME);
// load spring boot default config files
initInternalConfigFiles(compositePropertySource, bootstrapContext,resource);
PolarisConfigProperties polarisConfigProperties = bootstrapContext.get(PolarisConfigProperties.class);
// load custom config files
List<ConfigFileGroup> configFileGroups = polarisConfigProperties.getGroups();
if (CollectionUtils.isEmpty(configFileGroups)) {
return compositePropertySource;
}
initCustomPolarisConfigFiles(compositePropertySource, configFileGroups, bootstrapContext);
SDKContext sdkContext = bootstrapContext.get(SDKContext.class);
ConfigFileService configFileService = ConfigFileServiceFactory.createConfigFileService(sdkContext);
PolarisConfigFilePuller puller = new PolarisConfigFilePuller(resource.getPolarisContextProperties()
,configFileService,
bootstrapContext.get(PolarisPropertySourceManager.class));
puller.initCustomPolarisConfigFile(compositePropertySource, configFileGroup(resource));
return compositePropertySource;
}
@ -89,136 +84,19 @@ public class PolarisConfigDataLoader implements ConfigDataLoader<PolarisConfigDa
options.add(IGNORE_PROFILES);
// mark it as 'PROFILE_SPECIFIC' config, it has higher priority,
// will override the none profile specific config.
// options.add(PROFILE_SPECIFIC);
options.add(PROFILE_SPECIFIC);
return options.toArray(new ConfigData.Option[0]);
}
private void initInternalConfigFiles(CompositePropertySource compositePropertySource,
ConfigurableBootstrapContext bootstrapContext,
PolarisConfigDataResource resource) {
PolarisPropertySourceManager polarisPropertySourceManager =
bootstrapContext.get(PolarisPropertySourceManager.class);
List<ConfigFileMetadata> internalConfigFiles = getInternalConfigFiles(bootstrapContext,resource);
for (ConfigFileMetadata configFile : internalConfigFiles) {
PolarisPropertySource polarisPropertySource = loadPolarisPropertySource(bootstrapContext,
configFile.getNamespace(), configFile.getFileGroup(), configFile.getFileName());
compositePropertySource.addPropertySource(polarisPropertySource);
polarisPropertySourceManager.addPropertySource(polarisPropertySource);
log.info("[SCT Config] Load and inject polaris config file. file = " + configFile);
}
private ConfigFileGroup configFileGroup(PolarisConfigDataResource polarisConfigDataResource) {
String fileName = polarisConfigDataResource.getFileName();
String serviceName = polarisConfigDataResource.getServiceName();
ConfigFileGroup configFileGroup = new ConfigFileGroup();
configFileGroup.setName(serviceName);
List<String> flies = new ArrayList<>();
flies.add(fileName);
configFileGroup.setFiles(flies);
return configFileGroup;
}
private List<ConfigFileMetadata> getInternalConfigFiles(ConfigurableBootstrapContext bootstrapContext,
PolarisConfigDataResource resource) {
PolarisContextProperties polarisContextProperties = bootstrapContext.get(PolarisContextProperties.class);
String namespace = polarisContextProperties.getNamespace();
String serviceName = polarisContextProperties.getService();
if (!StringUtils.hasText(serviceName)) {
serviceName = resource.getServiceName();
}
List<ConfigFileMetadata> internalConfigFiles = new LinkedList<>();
// priority: application-${profile} > application > boostrap-${profile} > boostrap
List<String> activeProfiles = resource.getProfiles().getActive();
for (String activeProfile : activeProfiles) {
if (!StringUtils.hasText(activeProfile)) {
continue;
}
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application-" + activeProfile + ".properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application-" + activeProfile + ".yml"));
}
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application.properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application.yml"));
for (String activeProfile : activeProfiles) {
if (!StringUtils.hasText(activeProfile)) {
continue;
}
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap-" + activeProfile + ".properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap-" + activeProfile + ".yml"));
}
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap.properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap.yml"));
return internalConfigFiles;
}
private void initCustomPolarisConfigFiles(CompositePropertySource compositePropertySource,
List<ConfigFileGroup> configFileGroups,
ConfigurableBootstrapContext bootstrapContext
) {
PolarisContextProperties polarisContextProperties = bootstrapContext.get(PolarisContextProperties.class);
String namespace = polarisContextProperties.getNamespace();
PolarisPropertySourceManager polarisPropertySourceManager =
bootstrapContext.get(PolarisPropertySourceManager.class);
for (ConfigFileGroup configFileGroup : configFileGroups) {
String group = configFileGroup.getName();
if (!StringUtils.hasText(group)) {
throw new IllegalArgumentException("polaris config group name cannot be empty.");
}
List<String> files = configFileGroup.getFiles();
if (CollectionUtils.isEmpty(files)) {
return;
}
for (String fileName : files) {
PolarisPropertySource polarisPropertySource = loadPolarisPropertySource(bootstrapContext,
namespace, group, fileName);
compositePropertySource.addPropertySource(polarisPropertySource);
polarisPropertySourceManager.addPropertySource(polarisPropertySource);
String loggerFormat = "[SCT Config] Load and inject polaris config file success. " +
"namespace = %s, group = %s, fileName = %s";
log.info(String.format(loggerFormat,namespace, group, fileName));
}
}
}
private PolarisPropertySource loadPolarisPropertySource(
ConfigurableBootstrapContext bootstrapContext,
String namespace, String group, String fileName) {
SDKContext sdkContext = bootstrapContext.get(SDKContext.class);
ConfigKVFile configKVFile;
ConfigFileService configFileService = ConfigFileServiceFactory.createConfigFileService(sdkContext);
// unknown extension is resolved as properties file
if (ConfigFileFormat.isPropertyFile(fileName)
|| ConfigFileFormat.isUnknownFile(fileName)) {
configKVFile = configFileService.getConfigPropertiesFile(namespace, group, fileName);
}
else if (ConfigFileFormat.isYamlFile(fileName)) {
configKVFile = configFileService.getConfigYamlFile(namespace, group, fileName);
}
else {
String loggerFormat = "[SCT Config] Unsupported config file. namespace = %s, group = %s, fileName = %s";
log.warn(String.format(loggerFormat,namespace, group, fileName) );
throw new IllegalStateException("Only configuration files in the format of properties / yaml / yaml"
+ " can be injected into the spring context");
}
Map<String, Object> map = new ConcurrentHashMap<>();
for (String key : configKVFile.getPropertyNames()) {
map.put(key, configKVFile.getProperty(key, null));
}
return new PolarisPropertySource(namespace, group, fileName, configKVFile, map);
}
}

@ -115,10 +115,8 @@ public class PolarisConfigDataLocationResolver implements
// stop sdkContext and register PolarisPropertySourceManager to context
bootstrapContext.addCloseListener(
event -> {
event.getApplicationContext().getBeanFactory().registerSingleton(
"sdkContext", event.getBootstrapContext().get(SDKContext.class)
event.getBootstrapContext().get(SDKContext.class).destroy();
);
event.getApplicationContext().getBeanFactory().registerSingleton(
"polarisPropertySourceManager",
event.getBootstrapContext().get(PolarisPropertySourceManager.class)

@ -14,7 +14,7 @@ spring:
files: [ "config/application.properties", "config/bootstrap.yml" ]
config:
import:
- optional:polaris:test.yml
- optional:polaris:application.properties
management:
endpoints:
web:

Loading…
Cancel
Save