This is an automated email from the ASF dual-hosted git repository.
huxing pushed a commit to branch 2.7.3-release
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/2.7.3-release by this push:
new 6667a6f automatically append env parameters. (#4407)
6667a6f is described below
commit 6667a6f7ff44131f74d3af84326a0b645f1782cc
Author: ken.lj <[email protected]>
AuthorDate: Thu Jul 4 17:23:11 2019 +0800
automatically append env parameters. (#4407)
---
.../apache/dubbo/common/config/Environment.java | 1 +
.../common/config/EnvironmentConfiguration.java | 8 +-
.../dubbo/common/constants/CommonConstants.java | 11 +++
.../org/apache/dubbo/common/utils/StringUtils.java | 32 ++++++++
.../config/EnvironmentConfigurationTest.java | 86 +++++++++++++---------
.../apache/dubbo/common/utils/StringUtilsTest.java | 14 ++++
.../org/apache/dubbo/config/AbstractConfig.java | 6 +-
.../org/apache/dubbo/config/ApplicationConfig.java | 48 ++++++++++++
.../apache/dubbo/config/ApplicationConfigTest.java | 34 +++++++++
9 files changed, 202 insertions(+), 38 deletions(-)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
index b632808..372d5cb 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
@@ -115,6 +115,7 @@ public class Environment {
CompositeConfiguration compositeConfiguration = new
CompositeConfiguration();
// Config center has the highest priority
compositeConfiguration.addConfiguration(this.getSystemConfig(prefix,
id));
+
compositeConfiguration.addConfiguration(this.getEnvironmentConfig(prefix, id));
compositeConfiguration.addConfiguration(this.getAppExternalConfig(prefix, id));
compositeConfiguration.addConfiguration(this.getExternalConfig(prefix,
id));
compositeConfiguration.addConfiguration(this.getPropertiesConfig(prefix, id));
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/EnvironmentConfiguration.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/EnvironmentConfiguration.java
index c6d6523..c61e954 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/EnvironmentConfiguration.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/EnvironmentConfiguration.java
@@ -16,6 +16,8 @@
*/
package org.apache.dubbo.common.config;
+import org.apache.dubbo.common.utils.StringUtils;
+
/**
* Configuration from system environment
*/
@@ -31,7 +33,11 @@ public class EnvironmentConfiguration extends
AbstractPrefixConfiguration {
@Override
public Object getInternalProperty(String key) {
- return System.getenv(key);
+ String value = System.getenv(key);
+ if (StringUtils.isEmpty(value)) {
+ value = System.getenv(StringUtils.toOSStyleKey(key));
+ }
+ return value;
}
}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
index 8a9d870..19e8df4 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
@@ -58,6 +58,8 @@ public interface CommonConstants {
Pattern SEMICOLON_SPLIT_PATTERN = Pattern.compile("\\s*[;]+\\s*");
+ Pattern EQUAL_SPLIT_PATTERN = Pattern.compile("\\s*[=]+\\s*");
+
String DEFAULT_PROXY = "javassist";
String DEFAULT_DIRECTORY = "dubbo";
@@ -102,10 +104,16 @@ public interface CommonConstants {
String PROPERTIES_CHAR_SEPERATOR = "-";
+ String UNDERLINE_SEPARATOR = "_";
+
+ String SEPARATOR_REGEX = "_|-";
+
String GROUP_CHAR_SEPERATOR = ":";
String HIDE_KEY_PREFIX = ".";
+ String DOT_REGEX = "\\.";
+
String DEFAULT_KEY_PREFIX = "default.";
String DEFAULT_KEY = "default";
@@ -171,4 +179,7 @@ public interface CommonConstants {
String SHUTDOWN_WAIT_SECONDS_KEY = "dubbo.service.shutdown.wait.seconds";
String SHUTDOWN_WAIT_KEY = "dubbo.service.shutdown.wait";
String DUBBO_PROTOCOL = "dubbo";
+
+ String DUBBO_LABELS = "dubbo.labels";
+ String DUBBO_ENV_KEYS = "dubbo.env.keys";
}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java
index 20331e3..b51c1bc 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java
@@ -34,8 +34,12 @@ import java.util.regex.Pattern;
import static
org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;
import static
org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
+import static org.apache.dubbo.common.constants.CommonConstants.DOT_REGEX;
import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
+import static
org.apache.dubbo.common.constants.CommonConstants.HIDE_KEY_PREFIX;
import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
+import static
org.apache.dubbo.common.constants.CommonConstants.SEPARATOR_REGEX;
+import static
org.apache.dubbo.common.constants.CommonConstants.UNDERLINE_SEPARATOR;
import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
/**
@@ -798,4 +802,32 @@ public final class StringUtils {
public static String trim(String str) {
return str == null ? null : str.trim();
}
+
+ public static String toURLKey(String key) {
+ return key.toLowerCase().replaceAll(SEPARATOR_REGEX, HIDE_KEY_PREFIX);
+ }
+
+ public static String toOSStyleKey(String key) {
+ key = key.toUpperCase().replaceAll(DOT_REGEX, UNDERLINE_SEPARATOR);
+ if (!key.startsWith("DUBBO_")) {
+ key = "DUBBO_" + key;
+ }
+ return key;
+ }
+
+ public static boolean isAllUpperCase(String str) {
+ if (str != null && !isEmpty(str)) {
+ int sz = str.length();
+
+ for(int i = 0; i < sz; ++i) {
+ if (!Character.isUpperCase(str.charAt(i))) {
+ return false;
+ }
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentConfigurationTest.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentConfigurationTest.java
index 00fda43..974e07c 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentConfigurationTest.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentConfigurationTest.java
@@ -21,15 +21,18 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import java.lang.reflect.Field;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
/**
* The type Environment configuration test.
*/
class EnvironmentConfigurationTest {
- private static EnvironmentConfiguration environmentConfig;
- private static final String MOCK_KEY = "mockKey";
+ private static final String MOCK_KEY = "DUBBO_KEY";
private static final String MOCK_VALUE = "mockValue";
- private static final String PATH_KEY="PATH";
/**
* Init.
@@ -37,46 +40,59 @@ class EnvironmentConfigurationTest {
@BeforeEach
public void init() {
- environmentConfig = new EnvironmentConfiguration();
- }
-
- /**
- * Test get internal property.
- */
- @Test
- public void testGetInternalProperty(){
- Assertions.assertNull(environmentConfig.getInternalProperty(MOCK_KEY));
-
Assertions.assertEquals(System.getenv(PATH_KEY),environmentConfig.getInternalProperty(PATH_KEY));
-
}
- /**
- * Test contains key.
- */
@Test
- public void testContainsKey(){
- Assertions.assertTrue(environmentConfig.containsKey(PATH_KEY));
- Assertions.assertFalse(environmentConfig.containsKey(MOCK_KEY));
+ public void testGetInternalProperty() {
+ Map<String, String> map = new HashMap<>();
+ map.put(MOCK_KEY, MOCK_VALUE);
+ try {
+ setEnv(map);
+ EnvironmentConfiguration configuration = new
EnvironmentConfiguration();
+ // this UT maybe only works on particular platform, assert only
when value is not null.
+ Assertions.assertEquals(MOCK_VALUE,
configuration.getInternalProperty("dubbo.key"));
+ Assertions.assertEquals(MOCK_VALUE,
configuration.getInternalProperty("key"));
+ Assertions.assertEquals(MOCK_VALUE,
configuration.getInternalProperty("dubbo_key"));
+ Assertions.assertEquals(MOCK_VALUE,
configuration.getInternalProperty(MOCK_KEY));
+ } catch (Exception e) {
+ // skip test.
+ e.printStackTrace();
+ }
}
- /**
- * Test get string.
- */
- @Test
- public void testGetString(){
- Assertions.assertNull(environmentConfig.getString(MOCK_KEY));
-
Assertions.assertEquals(MOCK_VALUE,environmentConfig.getString(MOCK_KEY,MOCK_VALUE));
+ protected static void setEnv(Map<String, String> newenv) throws Exception {
+ try {
+ Class<?> processEnvironmentClass =
Class.forName("java.lang.ProcessEnvironment");
+ Field theEnvironmentField =
processEnvironmentClass.getDeclaredField("theEnvironment");
+ theEnvironmentField.setAccessible(true);
+ Map<String, String> env = (Map<String, String>)
theEnvironmentField.get(null);
+ env.putAll(newenv);
+ Field theCaseInsensitiveEnvironmentField =
processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment");
+ theCaseInsensitiveEnvironmentField.setAccessible(true);
+ Map<String, String> cienv = (Map<String, String>)
theCaseInsensitiveEnvironmentField.get(null);
+ cienv.putAll(newenv);
+ } catch (NoSuchFieldException e) {
+ Class[] classes = Collections.class.getDeclaredClasses();
+ Map<String, String> env = System.getenv();
+ for (Class cl : classes) {
+ if
("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
+ Field field = cl.getDeclaredField("m");
+ field.setAccessible(true);
+ Object obj = field.get(env);
+ Map<String, String> map = (Map<String, String>) obj;
+ map.clear();
+ map.putAll(newenv);
+ }
+ }
+ }
}
- /**
- * Test get property.
- */
- @Test
- public void testGetProperty(){
- Assertions.assertNull(environmentConfig.getProperty(MOCK_KEY));
-
Assertions.assertEquals(MOCK_VALUE,environmentConfig.getProperty(MOCK_KEY,MOCK_VALUE));
+ private static void updateEnv(String name, String val) throws
ReflectiveOperationException {
+ Map<String, String> env = System.getenv();
+ Field field = env.getClass().getDeclaredField("m");
+ field.setAccessible(true);
+ ((Map<String, String>) field.get(env)).put(name, val);
}
-
/**
* Clean.
*/
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/StringUtilsTest.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/StringUtilsTest.java
index 632c999..76a91c2 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/StringUtilsTest.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/StringUtilsTest.java
@@ -294,6 +294,20 @@ public class StringUtilsTest {
assertEquals("left blank", StringUtils.trim(" left blank"));
assertEquals("right blank", StringUtils.trim("right blank "));
assertEquals("bi-side blank", StringUtils.trim(" bi-side blank "));
+ }
+
+ @Test
+ public void testToURLKey() {
+ assertEquals("dubbo.tag1", StringUtils.toURLKey("dubbo_tag1"));
+ assertEquals("dubbo.tag1.tag11",
StringUtils.toURLKey("dubbo-tag1_tag11"));
+ }
+ @Test
+ public void testToOSStyleKey() {
+ assertEquals("DUBBO_TAG1", StringUtils.toOSStyleKey("dubbo_tag1"));
+ assertEquals("DUBBO_TAG1", StringUtils.toOSStyleKey("dubbo.tag1"));
+ assertEquals("DUBBO_TAG1_TAG11",
StringUtils.toOSStyleKey("dubbo.tag1.tag11"));
+ assertEquals("DUBBO_TAG1", StringUtils.toOSStyleKey("tag1"));
}
+
}
diff --git
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
index 2466948..88f1dc1 100644
---
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
+++
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
@@ -212,10 +212,12 @@ public abstract class AbstractConfig implements
Serializable {
}
}
+ @Deprecated
protected static void appendAttributes(Map<String, Object> parameters,
Object config) {
appendAttributes(parameters, config, null);
}
+ @Deprecated
protected static void appendAttributes(Map<String, Object> parameters,
Object config, String prefix) {
if (config == null) {
return;
@@ -550,10 +552,10 @@ public abstract class AbstractConfig implements
Serializable {
config.addProperties(getMetaData());
if (Environment.getInstance().isConfigCenterFirst()) {
// The sequence would be: SystemConfiguration ->
AppExternalConfiguration -> ExternalConfiguration -> AbstractConfig ->
PropertiesConfiguration
- compositeConfiguration.addConfiguration(3, config);
+ compositeConfiguration.addConfiguration(4, config);
} else {
// The sequence would be: SystemConfiguration ->
AbstractConfig -> AppExternalConfiguration -> ExternalConfiguration ->
PropertiesConfiguration
- compositeConfiguration.addConfiguration(1, config);
+ compositeConfiguration.addConfiguration(2, config);
}
// loop methods, get override value and set the new value back to
method
diff --git
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
index 824a0dd..aa723de 100644
---
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
+++
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
@@ -17,17 +17,24 @@
package org.apache.dubbo.config;
import org.apache.dubbo.common.compiler.support.AdaptiveCompiler;
+import org.apache.dubbo.common.config.ConfigurationUtils;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.config.support.Parameter;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static
org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
+import static
org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_ENV_KEYS;
+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_LABELS;
import static org.apache.dubbo.common.constants.CommonConstants.DUMP_DIRECTORY;
+import static
org.apache.dubbo.common.constants.CommonConstants.EQUAL_SPLIT_PATTERN;
+import static
org.apache.dubbo.common.constants.CommonConstants.SEMICOLON_SPLIT_PATTERN;
import static
org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;
import static org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP;
import static
org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP_COMPATIBLE;
@@ -375,4 +382,45 @@ public class ApplicationConfig extends AbstractConfig {
return !StringUtils.isEmpty(name);
}
+ @Override
+ public void refresh() {
+ super.refresh();
+ appendEnvironmentProperties();
+ }
+
+ /**
+ * 1. OS Environment: DUBBO_LABELS=tag=pre;key=value
+ * 2. JVM Options: -Denv_keys = DUBBO_KEY1, DUBBO_KEY2
+ */
+ private void appendEnvironmentProperties() {
+ String rawLabels = ConfigurationUtils.getProperty(DUBBO_LABELS);
+ if (StringUtils.isNotEmpty(rawLabels)) {
+ String[] labelPairs = SEMICOLON_SPLIT_PATTERN.split(rawLabels);
+ for (String pair : labelPairs) {
+ String[] label = EQUAL_SPLIT_PATTERN.split(pair);
+ if (label.length == 2) {
+ updateParameters(parameters, label[0], label[1]);
+ }
+ }
+ }
+
+ String rawKeys = ConfigurationUtils.getProperty(DUBBO_ENV_KEYS);
+ if (StringUtils.isNotEmpty(rawKeys)) {
+ String[] keys = COMMA_SPLIT_PATTERN.split(rawKeys);
+ for (String key : keys) {
+ String value = ConfigurationUtils.getProperty(key);
+ if (value != null) {
+ updateParameters(parameters, key, value);
+ }
+ }
+ }
+ }
+
+ private void updateParameters(Map<String, String> map, String key, String
value) {
+ if (parameters == null) {
+ parameters = new HashMap<>();
+ }
+ parameters.put(key, value);
+ }
+
}
diff --git
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ApplicationConfigTest.java
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ApplicationConfigTest.java
index 87fb621..f7ff994 100644
---
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ApplicationConfigTest.java
+++
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ApplicationConfigTest.java
@@ -180,4 +180,38 @@ public class ApplicationConfigTest {
assertThat(parameters, hasEntry("k1", "v1"));
assertThat(parameters, hasEntry(ACCEPT_FOREIGN_IP, "true"));
}
+
+ @Test
+ public void testAppendEnvironmentProperties() {
+ try {
+ ApplicationConfig application = new ApplicationConfig("app");
+ System.setProperty("dubbo.labels", "tag1=value1;tag2=value2 ; tag3
= value3");
+ application.refresh();
+ Map<String, String> parameters = application.getParameters();
+ Assertions.assertEquals("value1", parameters.get("tag1"));
+ Assertions.assertEquals("value2", parameters.get("tag2"));
+ Assertions.assertEquals("value3", parameters.get("tag3"));
+
+ ApplicationConfig application1 = new ApplicationConfig("app");
+ System.setProperty("dubbo.env.keys", "tag1, tag2,tag3");
+ // mock environment variables
+ System.setProperty("tag1", "value1");
+ System.setProperty("tag2", "value2");
+ System.setProperty("tag3", "value3");
+ application1.refresh();
+ Map<String, String> parameters1 = application1.getParameters();
+ Assertions.assertEquals("value1", parameters1.get("tag1"));
+ Assertions.assertEquals("value2", parameters1.get("tag2"));
+ Assertions.assertEquals("value3", parameters1.get("tag3"));
+
+ Map<String, String> urlParameters = new HashMap<>();
+ ApplicationConfig.appendParameters(urlParameters, application1);
+ Assertions.assertEquals("value1", urlParameters.get("tag1"));
+ Assertions.assertEquals("value2", urlParameters.get("tag2"));
+ Assertions.assertEquals("value3", urlParameters.get("tag3"));
+ } finally {
+ System.clearProperty("dubbo.labels");
+ System.clearProperty("dubbo.keys");
+ }
+ }
}