Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion demo/demo-spring-boot-discovery/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<dependency>
<groupId>io.servicecomb</groupId>
<artifactId>spring-boot-starter-provider</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
APPLICATION_ID: spring-boot-jaxrstest
cse-config-order: 1
APPLICATION_ID: spring-boot-jaxrstest
service_description:
name: jaxrsClient
version: 0.0.1
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
cse-config-order: 1
APPLICATION_ID: spring-boot-jaxrstest
service_description:
name: jaxrs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,17 @@
<groupId>io.servicecomb.demo</groupId>
<artifactId>springmvc-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-core</artifactId>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,17 @@
<groupId>io.servicecomb.demo</groupId>
<artifactId>springmvc-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-core</artifactId>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -20,34 +20,25 @@
import java.util.List;
import java.util.Properties;

import io.servicecomb.foundation.common.config.impl.IdXmlLoader;
import io.servicecomb.foundation.common.config.impl.PaaSPropertiesLoaderUtils;
import io.servicecomb.foundation.common.config.impl.XmlLoader;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.Resource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import io.servicecomb.foundation.common.config.impl.IdXmlLoader;
import io.servicecomb.foundation.common.config.impl.PaaSPropertiesLoaderUtils;
import io.servicecomb.foundation.common.config.impl.XmlLoader;
import io.servicecomb.foundation.common.utils.BeanUtils;
import io.servicecomb.foundation.common.utils.Log4jUtils;

public class TestConfig {

private static final int TEST_PROP_LIST_SIZE = 2;

private static ApplicationContext context;

@Before
public void init() throws Exception {
Log4jUtils.init();
BeanUtils.init();

}

@Test
public void loadMergedProperties() throws Exception {
Properties prop = ConfigMgr.INSTANCE.getConfig("pTest");
Expand All @@ -57,7 +48,9 @@ public void loadMergedProperties() throws Exception {
}

@Test
public void testBean() {
public void testBean() throws Exception {
Log4jUtils.init();
BeanUtils.init();
BeanProp bp = (BeanProp) BeanUtils.getBean("beanProp");
Assert.assertEquals("2", bp.getTest());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ public void testRollingFileAppenderExt(@Injectable LoggingEvent event,
ext.subAppend(event);
Assert.assertTrue(temp.exists());

ext.close();
temp.delete();
Assert.assertFalse(temp.exists());
}
}
158 changes: 153 additions & 5 deletions foundation-config/src/main/java/io/servicecomb/config/ConfigUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,170 @@

package io.servicecomb.config;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.configuration.AbstractConfiguration;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.EnvironmentConfiguration;
import org.apache.commons.configuration.SystemConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.netflix.config.ConcurrentCompositeConfiguration;
import com.netflix.config.ConcurrentMapConfiguration;
import com.netflix.config.ConfigurationManager;
import com.netflix.config.DynamicConfiguration;
import com.netflix.config.DynamicPropertyFactory;
import com.netflix.config.DynamicWatchedConfiguration;
import com.netflix.config.PollResult;
import com.netflix.config.PolledConfigurationSource;
import com.netflix.config.WatchedConfigurationSource;

import io.servicecomb.config.archaius.scheduler.NeverStartPollingScheduler;
import io.servicecomb.config.archaius.sources.ConfigModel;
import io.servicecomb.config.archaius.sources.MicroserviceConfigLoader;
import io.servicecomb.config.archaius.sources.MicroserviceConfigurationSource;
import io.servicecomb.foundation.common.utils.SPIServiceUtils;

/**
* Created by on 2017/3/28.
*/
public final class ConfigUtil {
private ConfigUtil() { }
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigUtil.class);

private static final String configCenterUrlKey = "cse.config.client.serverUri";

private static final String MICROSERVICE_CONFIG_LOADER_KEY = "cse-microservice-config-loader";

private static final String ADDITIONAL_KEY = "cse-config-additional";

private ConfigUtil() {
}

public static Object getProperty(String key) {
Object config = DynamicPropertyFactory.getBackingConfigurationSource();
if (null != config && ConcurrentCompositeConfiguration.class.isInstance(config)) {
ConcurrentCompositeConfiguration concurrentCompositeConfiguration =
(ConcurrentCompositeConfiguration) config;
return concurrentCompositeConfiguration.getProperty(key);
return getProperty(config, key);
}

public static Object getProperty(Object config, String key) {
if (null != config && Configuration.class.isInstance(config)) {
Configuration configuration = (Configuration) config;
return configuration.getProperty(key);
}
return null;
}

public static void setToAdditionalConfig(ConfigModel configModel) {
configModel.getConfig().put(ADDITIONAL_KEY, true);
}

public static boolean isAdditionalConfig(ConfigModel configModel) {
Object value = configModel.getConfig().get(ADDITIONAL_KEY);
return (value != null) ? (boolean) value : false;
}

public static void setMicroserviceConfigLoader(Configuration config, MicroserviceConfigLoader loader) {
config.setProperty(MICROSERVICE_CONFIG_LOADER_KEY, loader);
}

public static MicroserviceConfigLoader getMicroserviceConfigLoader() {
return (MicroserviceConfigLoader) getProperty(MICROSERVICE_CONFIG_LOADER_KEY);
}

public static MicroserviceConfigLoader getMicroserviceConfigLoader(Configuration config) {
return (MicroserviceConfigLoader) getProperty(config, MICROSERVICE_CONFIG_LOADER_KEY);
}

public static DynamicConfiguration createConfigFromYamlFile(List<ConfigModel> configModelList) {
// configuration from yaml files: default microservice.yaml
MicroserviceConfigurationSource yamlConfigurationSource = new MicroserviceConfigurationSource();
yamlConfigurationSource.setConfigModelList(configModelList);
DynamicConfiguration configFromYamlFile =
new DynamicConfiguration(yamlConfigurationSource, new NeverStartPollingScheduler());
return configFromYamlFile;
}

public static AbstractConfiguration createConfig(List<ConfigModel> configModelList) {
DynamicConfiguration configFromYamlFile = createConfigFromYamlFile(configModelList);
return createConfig(configFromYamlFile, null);
}

public static AbstractConfiguration createConfig(DynamicConfiguration configFromYamlFile,
DynamicWatchedConfiguration configFromConfigCenter) {
// create a hierarchy of configuration that makes
// 1) dynamic configuration source override system properties
ConcurrentCompositeConfiguration config = new ConcurrentCompositeConfiguration();
if (configFromConfigCenter != null) {
config.addConfiguration(configFromConfigCenter, "configCenterConfig");
}

config.addConfiguration(new ConcurrentMapConfiguration(new SystemConfiguration()), "systemConfig");
config.addConfiguration(new ConcurrentMapConfiguration(new EnvironmentConfiguration()),
"systemEnvConfig");
config.addConfiguration(configFromYamlFile, "configFromYamlFile");

return config;
}

public static DynamicWatchedConfiguration createConfigFromConfigCenter(
PolledConfigurationSource polledConfigurationSource) {
// configuration from config center
// Need to check whether the config center has been defined
Map<String, Object> configMap;
try {
PollResult result = polledConfigurationSource.poll(true, null);
configMap = result.getComplete();
} catch (Exception e) {
configMap = new HashMap<String, Object>();
}
DynamicWatchedConfiguration configFromConfigCenter = null;
if (configMap.get(configCenterUrlKey) != null) {
WatchedConfigurationSource configCenterConfigurationSource =
SPIServiceUtils.getTargetService(WatchedConfigurationSource.class);
if (null != configCenterConfigurationSource) {
// configuration from config center
configFromConfigCenter =
new DynamicWatchedConfiguration(configCenterConfigurationSource);
} else {
LOGGER.info(
"config center SPI service can not find, skip to load configuration from config center");
}
} else {
LOGGER.info("config center URL is missing, skip to load configuration from config center");
}
return configFromConfigCenter;
}

public static AbstractConfiguration createDynamicConfig(MicroserviceConfigLoader loader) {
LOGGER.info("create dynamic config:");
for (ConfigModel configModel : loader.getConfigModelList()) {
LOGGER.info(" {}.", configModel.getUrl());
}
DynamicConfiguration configFromYamlFile = ConfigUtil.createConfigFromYamlFile(loader.getConfigModelList());
DynamicWatchedConfiguration configFromConfigCenter =
createConfigFromConfigCenter(configFromYamlFile.getSource());
return ConfigUtil.createConfig(configFromYamlFile, configFromConfigCenter);
}

public static AbstractConfiguration createDynamicConfig() {
MicroserviceConfigLoader loader = new MicroserviceConfigLoader();
loader.loadAndSort();

AbstractConfiguration dynamicConfig = createDynamicConfig(loader);
ConfigUtil.setMicroserviceConfigLoader(dynamicConfig, loader);

return dynamicConfig;
}

public static void installDynamicConfig() {
if (ConfigurationManager.isConfigurationInstalled()) {
LOGGER.warn("Configuration installed by others, will ignore this configuration.");
return;
}

AbstractConfiguration dynamicConfig = ConfigUtil.createDynamicConfig();
ConfigurationManager.install(dynamicConfig);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,81 +16,10 @@

package io.servicecomb.config;

import java.util.HashMap;
import java.util.Map;

import io.servicecomb.config.archaius.scheduler.NeverStartPollingScheduler;
import io.servicecomb.config.archaius.sources.YAMLConfigurationSource;
import org.apache.commons.configuration.EnvironmentConfiguration;
import org.apache.commons.configuration.SystemConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

import io.servicecomb.foundation.common.utils.SPIServiceUtils;
import com.netflix.config.ConcurrentCompositeConfiguration;
import com.netflix.config.ConcurrentMapConfiguration;
import com.netflix.config.ConfigurationManager;
import com.netflix.config.DynamicConfiguration;
import com.netflix.config.DynamicWatchedConfiguration;
import com.netflix.config.PollResult;
import com.netflix.config.WatchedConfigurationSource;

public class ConfigurationSpringInitializer extends PropertyPlaceholderConfigurer {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationSpringInitializer.class);

private final String configCenterUrlKey = "cse.config.client.serverUri";

public ConfigurationSpringInitializer() {
if (ConfigurationManager.isConfigurationInstalled()) {
LOGGER.warn("Configuration installed by others, will ignore this configuration.");
} else {
YAMLConfigurationSource yamlConfigurationSource = new YAMLConfigurationSource();
// configuration from yaml files: default microservice.yaml
DynamicConfiguration configFromYamlFile =
new DynamicConfiguration(yamlConfigurationSource, new NeverStartPollingScheduler());
// configuration from system properties
ConcurrentMapConfiguration configFromEnvProperties =
new ConcurrentMapConfiguration(new EnvironmentConfiguration());

ConcurrentMapConfiguration configFromSystemProperties =
new ConcurrentMapConfiguration(new SystemConfiguration());
// configuration from config center
// Need to check whether the config center has been defined
Map<String, Object> configMap;
try {
PollResult result = yamlConfigurationSource.poll(true, null);
configMap = result.getComplete();
} catch (Exception e) {
configMap = new HashMap<String, Object>();
}
DynamicWatchedConfiguration configFromConfigCenter = null;
if (configMap.get(configCenterUrlKey) != null) {
WatchedConfigurationSource configCenterConfigurationSource =
SPIServiceUtils.getTargetService(WatchedConfigurationSource.class);
if (null != configCenterConfigurationSource) {
// configuration from config center
configFromConfigCenter =
new DynamicWatchedConfiguration(configCenterConfigurationSource);
} else {
LOGGER.info(
"config center SPI service can not find, skip to load configuration from config center");
}
} else {
LOGGER.info("config center URL is missing, skip to load configuration from config center");
}

// create a hierarchy of configuration that makes
// 1) dynamic configuration source override system properties
ConcurrentCompositeConfiguration finalConfig = new ConcurrentCompositeConfiguration();
if (configFromConfigCenter != null) {
finalConfig.addConfiguration(configFromConfigCenter, "configCenterConfig");
}
finalConfig.addConfiguration(configFromSystemProperties, "systemConfig");
finalConfig.addConfiguration(configFromEnvProperties, "systemEnvConfig");
finalConfig.addConfiguration(configFromYamlFile, "configFromYamlFile");

ConfigurationManager.install(finalConfig);
}
ConfigUtil.installDynamicConfig();
}
}
Loading