diff --git a/.travis.yml b/.travis.yml index b346423fd8942d49c5cfddb05a9f54386c601b8f..a4bac41ef37554466e34113d21b64fa6262091f0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,10 +12,11 @@ cache: install: true script: + - rm -rf $HOME/.m2/repository/org/glassfish/javax.el/3.0.1-b08 - travis_wait 30 ./mvnw --batch-mode --no-transfer-progress clean install -DskipTests=false -Dcheckstyle.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true after_success: - bash <(curl -s https://codecov.io/bash) after_failure: - - if [ -f dubbo.log ]; then echo "------TAIL of dubbo.log------"; tail -n 1000 dubbo.log; echo "------END of dubbo.log------"; fi + - echo "build failed!" diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java index c96f6a225cc19b532d88d3f90886c4a4ddc69122..d8b35bcd765b60eb2211b654fca2f22b84ecf3d8 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java @@ -40,6 +40,7 @@ import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; +import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE; import static org.apache.dubbo.rpc.Constants.FORCE_USE_TAG; import static org.apache.dubbo.rpc.cluster.Constants.TAG_KEY; @@ -52,6 +53,7 @@ public class TagRouter extends AbstractRouter implements ConfigurationListener { private static final Logger logger = LoggerFactory.getLogger(TagRouter.class); private static final String RULE_SUFFIX = ".tag-router"; + private TagRouterRule tagRouterRule; private String application; @@ -212,6 +214,9 @@ public class TagRouter extends AbstractRouter implements ConfigurationListener { if (NetUtils.matchIpExpression(address, host, port)) { return true; } + if ((ANYHOST_VALUE + ":" + port).equals(address)) { + return true; + } } catch (UnknownHostException e) { logger.error("The format of ip address is invalid in tag route. Address :" + address, e); } catch (Exception e) { 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 15720acf9387d5cb4c50691d8f7d80104c53be2d..a058ccadf58a09aacfe1df135942460212e75054 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 @@ -184,4 +184,9 @@ public interface CommonConstants { String DUBBO_LABELS = "dubbo.labels"; String DUBBO_ENV_KEYS = "dubbo.env.keys"; + + String CONFIG_CONFIGFILE_KEY = "config-file"; + String CONFIG_ENABLE_KEY = "highest-priority"; + String CONFIG_NAMESPACE_KEY = "namespace"; + String CHECK_KEY = "check"; } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java index 59c45144ac4098fed5b4e448b040a77ac2e4637a..d95165377f5e0cdbced0ef9d758fe10b04ded03b 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java @@ -492,12 +492,15 @@ public class ExtensionLoader { return (T) instance; } - private IllegalStateException findException(String name) { + private void findException(String name) { for (Map.Entry entry : exceptions.entrySet()) { if (entry.getKey().toLowerCase().contains(name.toLowerCase())) { - return entry.getValue(); + throw entry.getValue(); } } + } + + private IllegalStateException noExtensionException(String name) { StringBuilder buf = new StringBuilder("No such extension " + type.getName() + " by name " + name); @@ -519,9 +522,11 @@ public class ExtensionLoader { @SuppressWarnings("unchecked") private T createExtension(String name) { + // throws any possible exception in loading period. + findException(name); Class clazz = getExtensionClasses().get(name); if (clazz == null) { - throw findException(name); + throw noExtensionException(name); } try { T instance = (T) EXTENSION_INSTANCES.get(clazz); 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 28aca4a2e0779a45216b440661ab59f657ba652b..15bc93befc7ace9ca0eded5352987c8845fc88fa 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 @@ -25,6 +25,7 @@ import com.alibaba.fastjson.JSON; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -839,4 +840,30 @@ public final class StringUtils { return false; } } + + /** + * @param rawParameters format like '[{a:b},{c:d}]' + * @return + */ + public static Map parseParameters(String rawParameters) { + Pattern pattern = Pattern.compile("^\\[((\\s*\\{\\s*[\\w_\\-\\.]+\\s*:\\s*.+?\\s*\\}\\s*,?\\s*)+)\\s*\\]$"); + Pattern pairPattern = Pattern.compile("^\\{\\s*([\\w-_\\.]+)\\s*:\\s*(.+)\\s*\\}$"); + + Matcher matcher = pattern.matcher(rawParameters); + if (!matcher.matches()) { + return Collections.emptyMap(); + } + + String pairs = matcher.group(1); + String[] pairArr = pairs.split("\\s*,\\s*"); + + Map parameters = new HashMap<>(); + for (String pair : pairArr) { + Matcher pairMatcher = pairPattern.matcher(pair); + if (pairMatcher.matches()) { + parameters.put(pairMatcher.group(1), pairMatcher.group(2)); + } + } + return parameters; + } } diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConfigUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConfigUtilsTest.java index b8c7a737938912a938bea95b5f0dd2e9bb0e2de9..21b941722d73e8ccd5e5b2ad8079f9ef3747db3b 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConfigUtilsTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConfigUtilsTest.java @@ -257,4 +257,14 @@ public class ConfigUtilsTest { public void testGetPid() throws Exception { assertThat(ConfigUtils.getPid(), greaterThan(0)); } + + @Test + public void testPropertiesWithStructedValue() throws Exception { + Properties p = ConfigUtils.loadProperties("parameters.properties", false); + + Properties expected = new Properties(); + expected.put("dubbo.parameters", "[{a:b},{c_.d: r*}]"); + + assertEquals(expected, p); + } } 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 76a91c266c4c5f3e8d6b38e03768deaf367d829c..43303f93a52e7e4b42dacaabb7f31eaa72dd892d 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 @@ -310,4 +310,27 @@ public class StringUtilsTest { assertEquals("DUBBO_TAG1", StringUtils.toOSStyleKey("tag1")); } + @Test + public void testParseParameters() { + String legalStr = "[{key1:value1},{key2:value2}]"; + Map legalMap = StringUtils.parseParameters(legalStr); + assertEquals(2, legalMap.size()); + assertEquals("value2", legalMap.get("key2")); + + String legalSpaceStr = "[{key1: value1}, {key2 :value2}]"; + Map legalSpaceMap = StringUtils.parseParameters(legalSpaceStr); + assertEquals(2, legalSpaceMap.size()); + assertEquals("value2", legalSpaceMap.get("key2")); + + String legalSpecialStr = "[{key-1: value*.1}, {key.2 :value*.-_2}]"; + Map legalSpecialMap = StringUtils.parseParameters(legalSpecialStr); + assertEquals(2, legalSpecialMap.size()); + assertEquals("value*.1", legalSpecialMap.get("key-1")); + assertEquals("value*.-_2", legalSpecialMap.get("key.2")); + + String illegalStr = "[{key=value},{aa:bb}]"; + Map illegalMap = StringUtils.parseParameters(illegalStr); + assertEquals(0, illegalMap.size()); + } + } diff --git a/dubbo-common/src/test/resources/parameters.properties b/dubbo-common/src/test/resources/parameters.properties new file mode 100644 index 0000000000000000000000000000000000000000..103a61af733121435fae4979b550664292ba41ff --- /dev/null +++ b/dubbo-common/src/test/resources/parameters.properties @@ -0,0 +1 @@ +dubbo.parameters=[{a:b},{c_.d: r*}] \ No newline at end of file diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/Constants.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/Constants.java index 7b489a3e2c773c56c78c83465bc6c481f9691d92..6373c048b290e74ff4fb7ca058809fc066a9d6c5 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/Constants.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/Constants.java @@ -36,7 +36,6 @@ public class Constants implements CommonConstants, org.apache.dubbo.rpc.Constants, org.apache.dubbo.rpc.protocol.dubbo.Constants, org.apache.dubbo.common.serialize.Constants, - org.apache.dubbo.configcenter.Constants, org.apache.dubbo.metadata.support.Constants, org.apache.dubbo.rpc.protocol.rest.Constants, org.apache.dubbo.registry.Constants { 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 7f21f0aca3bcb0adee29907698e953c5b35ee7a6..40c2f759881de03323fb6d78335fa5c7d1fcaf9a 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 @@ -36,6 +36,7 @@ import org.apache.dubbo.rpc.model.ConsumerMethodModel; import java.io.Serializable; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -45,6 +46,7 @@ import java.util.stream.Collectors; import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY; import static org.apache.dubbo.common.constants.CommonConstants.REMOVE_VALUE_PREFIX; +import static org.apache.dubbo.common.utils.ReflectUtils.findMethodByMethodSignature; /** * Utility methods and public methods for parsing configuration @@ -195,17 +197,9 @@ public abstract class AbstractConfig implements Serializable { } else if (parameter != null && parameter.required()) { throw new IllegalStateException(config.getClass().getSimpleName() + "." + key + " == null"); } - } else if ("getParameters".equals(name) - && Modifier.isPublic(method.getModifiers()) - && method.getParameterTypes().length == 0 - && method.getReturnType() == Map.class) { + } else if (isParametersGetter(method)) { Map map = (Map) method.invoke(config, new Object[0]); - if (map != null && map.size() > 0) { - String pre = (prefix != null && prefix.length() > 0 ? prefix + "." : ""); - for (Map.Entry entry : map.entrySet()) { - parameters.put(pre + entry.getKey().replace('-', '.'), entry.getValue()); - } - } + parameters.putAll(convert(map, prefix)); } } catch (Exception e) { throw new IllegalStateException(e.getMessage(), e); @@ -424,6 +418,58 @@ public abstract class AbstractConfig implements Serializable { return getter.substring(i, i + 1).toLowerCase() + getter.substring(i + 1); } + private static void invokeSetParameters(Class c, Object o, Map map) { + try { + Method method = findMethodByMethodSignature(c, "setParameters", new String[]{Map.class.getName()}); + if (method != null && isParametersSetter(method)) { + method.invoke(o, map); + } + } catch (Throwable t) { + // ignore + } + } + + private static Map invokeGetParameters(Class c, Object o) { + try { + Method method = findMethodByMethodSignature(c, "getParameters", null); + if (method != null && isParametersGetter(method)) { + return (Map) method.invoke(o); + } + } catch (Throwable t) { + // ignore + } + return null; + } + + private static boolean isParametersGetter(Method method) { + String name = method.getName(); + return ("getParameters".equals(name) + && Modifier.isPublic(method.getModifiers()) + && method.getParameterTypes().length == 0 + && method.getReturnType() == Map.class); + } + + private static boolean isParametersSetter(Method method) { + return ("setParameters".equals(method.getName()) + && Modifier.isPublic(method.getModifiers()) + && method.getParameterCount() == 1 + && Map.class == method.getParameterTypes()[0] + && method.getReturnType() == void.class); + } + + private static Map convert(Map parameters, String prefix) { + if (parameters == null || parameters.isEmpty()) { + return Collections.emptyMap(); + } + + Map result = new HashMap<>(); + String pre = (prefix != null && prefix.length() > 0 ? prefix + "." : ""); + for (Map.Entry entry : parameters.entrySet()) { + result.put(pre + entry.getKey().replace('-', '.'), entry.getValue()); + } + return result; + } + @Parameter(excluded = true) public String getId() { return id; @@ -521,17 +567,9 @@ public abstract class AbstractConfig implements Serializable { } else { metaData.put(key, null); } - } else if ("getParameters".equals(name) - && Modifier.isPublic(method.getModifiers()) - && method.getParameterTypes().length == 0 - && method.getReturnType() == Map.class) { + } else if (isParametersGetter(method)) { Map map = (Map) method.invoke(this, new Object[0]); - if (map != null && map.size() > 0) { -// String pre = (prefix != null && prefix.length() > 0 ? prefix + "." : ""); - for (Map.Entry entry : map.entrySet()) { - metaData.put(entry.getKey().replace('-', '.'), entry.getValue()); - } - } + metaData.putAll(convert(map, "")); } } catch (Exception e) { throw new IllegalStateException(e.getMessage(), e); @@ -549,10 +587,6 @@ public abstract class AbstractConfig implements Serializable { this.prefix = prefix; } - /** - * TODO: Currently, only support overriding of properties explicitly defined in Config class, doesn't support - * overriding of customized parameters stored in 'parameters'. - */ public void refresh() { try { CompositeConfiguration compositeConfiguration = Environment.getInstance().getConfiguration(getPrefix(), getId()); @@ -569,16 +603,18 @@ public abstract class AbstractConfig implements Serializable { Method[] methods = getClass().getMethods(); for (Method method : methods) { if (MethodUtils.isSetter(method)) { - try { - String value = StringUtils.trim(compositeConfiguration.getString(extractPropertyName(getClass(), method))); - // isTypeMatch() is called to avoid duplicate and incorrect update, for example, we have two 'setGeneric' methods in ReferenceConfig. - if (StringUtils.isNotEmpty(value) && ClassUtils.isTypeMatch(method.getParameterTypes()[0], value)) { - method.invoke(this, ClassUtils.convertPrimitive(method.getParameterTypes()[0], value)); - } - } catch (NoSuchMethodException e) { - logger.info("Failed to override the property " + method.getName() + " in " + - this.getClass().getSimpleName() + - ", please make sure every property has getter/setter method provided."); + String value = StringUtils.trim(compositeConfiguration.getString(extractPropertyName(getClass(), method))); + // isTypeMatch() is called to avoid duplicate and incorrect update, for example, we have two 'setGeneric' methods in ReferenceConfig. + if (StringUtils.isNotEmpty(value) && ClassUtils.isTypeMatch(method.getParameterTypes()[0], value)) { + method.invoke(this, ClassUtils.convertPrimitive(method.getParameterTypes()[0], value)); + } + } else if (isParametersSetter(method)) { + String value = StringUtils.trim(compositeConfiguration.getString(extractPropertyName(getClass(), method))); + if (StringUtils.isNotEmpty(value)) { + Map map = invokeGetParameters(getClass(), this); + map = map == null ? new HashMap<>() : map; + map.putAll(convert(StringUtils.parseParameters(value), "")); + invokeSetParameters(getClass(), this, map); } } } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractReferenceConfig.java index 906759dc2dffde83ff13b882ac75a3f26d43d8fc..083ea6f0e52c4eaab510549f87524693d8478582 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractReferenceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractReferenceConfig.java @@ -16,18 +16,19 @@ */ package org.apache.dubbo.config; +import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.config.support.Parameter; import org.apache.dubbo.remoting.Constants; import org.apache.dubbo.rpc.InvokerListener; import org.apache.dubbo.rpc.support.ProtocolUtils; -import static org.apache.dubbo.rpc.cluster.Constants.CLUSTER_STICKY_KEY; import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY; import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY; -import static org.apache.dubbo.rpc.Constants.LAZY_CONNECT_KEY; import static org.apache.dubbo.rpc.Constants.INVOKER_LISTENER_KEY; +import static org.apache.dubbo.rpc.Constants.LAZY_CONNECT_KEY; import static org.apache.dubbo.rpc.Constants.REFERENCE_FILTER_KEY; import static org.apache.dubbo.rpc.Constants.STUB_EVENT_KEY; +import static org.apache.dubbo.rpc.cluster.Constants.CLUSTER_STICKY_KEY; /** * AbstractConsumerConfig @@ -120,7 +121,14 @@ public abstract class AbstractReferenceConfig extends AbstractInterfaceConfig { } public void setGeneric(String generic) { - this.generic = generic; + if (StringUtils.isEmpty(generic)) { + return; + } + if (ProtocolUtils.isValidGenericValue(generic)) { + this.generic = generic; + } else { + throw new IllegalArgumentException("Unsupported generic type " + generic); + } } /** diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java index 28d3c5a561fd40b30655dff07eee733cc413e841..1198826a90e416cc4625dcb5b5ac6af9bea1ed68 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java @@ -28,16 +28,11 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE; +import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_CONFIGFILE_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_ENABLE_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY; -import static org.apache.dubbo.config.Constants.CONFIG_CONFIGFILE_KEY; -import static org.apache.dubbo.config.Constants.CONFIG_ENABLE_KEY; -import static org.apache.dubbo.config.Constants.CONFIG_TIMEOUT_KEY; import static org.apache.dubbo.config.Constants.ZOOKEEPER_PROTOCOL; -import static org.apache.dubbo.configcenter.Constants.CONFIG_CHECK_KEY; -import static org.apache.dubbo.configcenter.Constants.CONFIG_CLUSTER_KEY; -import static org.apache.dubbo.configcenter.Constants.CONFIG_GROUP_KEY; -import static org.apache.dubbo.configcenter.Constants.CONFIG_NAMESPACE_KEY; /** * ConfigCenterConfig @@ -82,7 +77,7 @@ public class ConfigCenterConfig extends AbstractConfig { /* If the Config Center product you use have some special parameters that is not covered by this class, you can add it to here. For example, with XML: - + */ private Map parameters; @@ -133,7 +128,6 @@ public class ConfigCenterConfig extends AbstractConfig { this.address = address; } - @Parameter(key = CONFIG_CLUSTER_KEY) public String getCluster() { return cluster; } @@ -142,7 +136,6 @@ public class ConfigCenterConfig extends AbstractConfig { this.cluster = cluster; } - @Parameter(key = CONFIG_NAMESPACE_KEY) public String getNamespace() { return namespace; } @@ -151,7 +144,6 @@ public class ConfigCenterConfig extends AbstractConfig { this.namespace = namespace; } - @Parameter(key = CONFIG_GROUP_KEY) public String getGroup() { return group; } @@ -160,7 +152,6 @@ public class ConfigCenterConfig extends AbstractConfig { this.group = group; } - @Parameter(key = CONFIG_CHECK_KEY) public Boolean isCheck() { return check; } @@ -194,7 +185,6 @@ public class ConfigCenterConfig extends AbstractConfig { this.password = password; } - @Parameter(key = CONFIG_TIMEOUT_KEY) public Long getTimeout() { return timeout; } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/Constants.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/Constants.java index 97b0b936f8f909e88c3af08650188757a7053a7c..610763e2cf4a40fa0f032ca79b37f2f55ffe5934 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/Constants.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/Constants.java @@ -73,11 +73,6 @@ public interface Constants { */ String PRODUCTION_ENVIRONMENT = "product"; - String CONFIG_CONFIGFILE_KEY = "config.config-file"; - String CONFIG_ENABLE_KEY = "config.highest-priority"; - String CONFIG_TIMEOUT_KEY = "config.timeout"; - String CONFIG_APPNAME_KEY = "config.app-name"; - String MULTICAST = "multicast"; diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java index 07945adc163b9a60fa9be2406c14554842dcebe4..300cdb8d88e8de4536dc6a79daaf5eca8a9b3caa 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java @@ -65,34 +65,34 @@ import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_KEY; import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE; import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN; import static org.apache.dubbo.common.constants.CommonConstants.DUBBO; +import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_IP_TO_BIND; import static org.apache.dubbo.common.constants.CommonConstants.LOCALHOST_VALUE; import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE; import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY; import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY; -import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_IP_TO_BIND; +import static org.apache.dubbo.common.constants.RegistryConstants.DYNAMIC_KEY; +import static org.apache.dubbo.common.utils.NetUtils.getAvailablePort; +import static org.apache.dubbo.common.utils.NetUtils.getLocalHost; +import static org.apache.dubbo.common.utils.NetUtils.isInvalidLocalHost; +import static org.apache.dubbo.common.utils.NetUtils.isInvalidPort; import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY; import static org.apache.dubbo.config.Constants.DUBBO_PORT_TO_BIND; import static org.apache.dubbo.config.Constants.DUBBO_PORT_TO_REGISTRY; -import static org.apache.dubbo.config.Constants.REGISTER_KEY; -import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY; import static org.apache.dubbo.config.Constants.MULTICAST; import static org.apache.dubbo.config.Constants.PROTOCOLS_SUFFIX; -import static org.apache.dubbo.rpc.Constants.SCOPE_KEY; -import static org.apache.dubbo.rpc.Constants.SCOPE_LOCAL; +import static org.apache.dubbo.config.Constants.REGISTER_KEY; import static org.apache.dubbo.config.Constants.SCOPE_NONE; -import static org.apache.dubbo.rpc.Constants.SCOPE_REMOTE; -import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY; -import static org.apache.dubbo.common.constants.RegistryConstants.DYNAMIC_KEY; import static org.apache.dubbo.rpc.Constants.GENERIC_KEY; import static org.apache.dubbo.rpc.Constants.LOCAL_PROTOCOL; import static org.apache.dubbo.rpc.Constants.PROXY_KEY; +import static org.apache.dubbo.rpc.Constants.SCOPE_KEY; +import static org.apache.dubbo.rpc.Constants.SCOPE_LOCAL; +import static org.apache.dubbo.rpc.Constants.SCOPE_REMOTE; import static org.apache.dubbo.rpc.Constants.TOKEN_KEY; -import static org.apache.dubbo.common.utils.NetUtils.getAvailablePort; -import static org.apache.dubbo.common.utils.NetUtils.getLocalHost; -import static org.apache.dubbo.common.utils.NetUtils.isInvalidLocalHost; -import static org.apache.dubbo.common.utils.NetUtils.isInvalidPort; +import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY; /** * ServiceConfig @@ -1016,7 +1016,7 @@ public class ServiceConfig extends AbstractServiceConfig { if (StringUtils.isEmpty(generic)) { return; } - if (ProtocolUtils.isGeneric(generic)) { + if (ProtocolUtils.isValidGenericValue(generic)) { this.generic = generic; } else { throw new IllegalArgumentException("Unsupported generic type " + generic); diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java index c481e32badcf18c9ea4109927211b4ee680991db..4bac34f307e2036c64fd56c51bfd0147ec8a3c31 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java @@ -450,6 +450,41 @@ public class AbstractConfigTest { } } + @Test + public void testRefreshParameters() { + try { + Map parameters = new HashMap<>(); + parameters.put("key1", "value1"); + parameters.put("key2", "value2"); + OverrideConfig overrideConfig = new OverrideConfig(); + overrideConfig.setParameters(parameters); + + + Map external = new HashMap<>(); + external.put("dubbo.override.parameters", "[{key3:value3},{key4:value4},{key2:value5}]"); + Environment.getInstance().setExternalConfigMap(external); + + ConfigCenterConfig configCenter = new ConfigCenterConfig(); + overrideConfig.setConfigCenter(configCenter); + // Load configuration from system properties -> externalConfiguration -> RegistryConfig -> dubbo.properties + overrideConfig.refresh(); + + Assertions.assertEquals("value1", overrideConfig.getParameters().get("key1")); + Assertions.assertEquals("value5", overrideConfig.getParameters().get("key2")); + Assertions.assertEquals("value3", overrideConfig.getParameters().get("key3")); + Assertions.assertEquals("value4", overrideConfig.getParameters().get("key4")); + + System.setProperty("dubbo.override.parameters", "[{key3:value6}]"); + overrideConfig.refresh(); + + Assertions.assertEquals("value6", overrideConfig.getParameters().get("key3")); + Assertions.assertEquals("value4", overrideConfig.getParameters().get("key4")); + } finally { + System.clearProperty("dubbo.override.parameters"); + Environment.getInstance().clearExternalConfigs(); + } + } + @Test public void testOnlyPrefixedKeyTakeEffect() { try { diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigCenterConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigCenterConfigTest.java index cf10ed50b852a62f9e4cee158c2f789e84c28b4a..6221d6e22d9e9fd628b0cf6c1d6acc599eef762a 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigCenterConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigCenterConfigTest.java @@ -37,9 +37,9 @@ public class ConfigCenterConfigTest { config.setGroup("group"); config.setAddress("zookeeper://127.0.0.1:2181"); - Assertions.assertEquals("zookeeper://127.0.0.1:2181/ConfigCenterConfig?config.check=true&" + - "config.config-file=dubbo.properties&config.group=group&config.highest-priority=true&" + - "config.namespace=namespace&config.timeout=3000", + Assertions.assertEquals("zookeeper://127.0.0.1:2181/ConfigCenterConfig?check=true&" + + "config-file=dubbo.properties&group=group&highest-priority=true&" + + "namespace=namespace&timeout=3000", config.toUrl().toFullString() ); } diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/builders/AbstractReferenceBuilderTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/builders/AbstractReferenceBuilderTest.java index 2a5f697684d22742a6edbb3a6522bdb4e02cbc3f..2936f009e02aaf8e437f731cdff5455d19103923 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/builders/AbstractReferenceBuilderTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/builders/AbstractReferenceBuilderTest.java @@ -21,6 +21,8 @@ import org.apache.dubbo.config.AbstractReferenceConfig; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import static org.apache.dubbo.rpc.Constants.GENERIC_SERIALIZATION_BEAN; + class AbstractReferenceBuilderTest { @Test @@ -53,8 +55,8 @@ class AbstractReferenceBuilderTest { @Test void generic1() { ReferenceBuilder builder = new ReferenceBuilder(); - builder.generic("generic"); - Assertions.assertEquals("generic", builder.build().getGeneric()); + builder.generic(GENERIC_SERIALIZATION_BEAN); + Assertions.assertEquals(GENERIC_SERIALIZATION_BEAN, builder.build().getGeneric()); } @Test diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessor.java index 64327b72b702d30be6c7a775c93675cdf8510e10..9b181cbc8e5739bd0ab2f4850095bbb2b437b91a 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessor.java @@ -17,6 +17,7 @@ package org.apache.dubbo.config.spring.beans.factory.annotation; import org.apache.dubbo.common.utils.Assert; +import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.config.AbstractConfig; import org.apache.dubbo.config.spring.context.annotation.DubboConfigBindingRegistrar; import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfigBinding; @@ -29,6 +30,10 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.core.annotation.AnnotationAwareOrderComparator; @@ -49,7 +54,8 @@ import static org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncl * @since 2.5.8 */ -public class DubboConfigBindingBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware, InitializingBean { +public class DubboConfigBindingBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware, InitializingBean + , BeanDefinitionRegistryPostProcessor { private final Log log = LogFactory.getLog(getClass()); @@ -67,6 +73,8 @@ public class DubboConfigBindingBeanPostProcessor implements BeanPostProcessor, A private ApplicationContext applicationContext; + private BeanDefinitionRegistry beanDefinitionRegistry; + private boolean ignoreUnknownFields = true; private boolean ignoreInvalidFields = true; @@ -145,6 +153,15 @@ public class DubboConfigBindingBeanPostProcessor implements BeanPostProcessor, A @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof AbstractConfig) { + String id = ((AbstractConfig) bean).getId(); + if (beanDefinitionRegistry != null && beanDefinitionRegistry instanceof DefaultListableBeanFactory) { + DefaultListableBeanFactory factory = (DefaultListableBeanFactory) beanDefinitionRegistry; + if (!StringUtils.isBlank(id) && !factory.hasAlias(beanName, id)) { + beanDefinitionRegistry.registerAlias(beanName, id); + } + } + } return bean; } @@ -203,4 +220,15 @@ public class DubboConfigBindingBeanPostProcessor implements BeanPostProcessor, A return defaultDubboConfigBinder; } + @Override + public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { + if (this.beanDefinitionRegistry == null) { + this.beanDefinitionRegistry = registry; + } + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + //do nothing here + } } diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessorTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessorTest.java index 62a9a26643e286546f8d77523ce8fbb4f0d3e763..301c1d9d0251276bb618a41a358a9a266a60eccc 100644 --- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessorTest.java +++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessorTest.java @@ -17,6 +17,7 @@ package org.apache.dubbo.config.spring.beans.factory.annotation; import org.apache.dubbo.config.ApplicationConfig; +import org.apache.dubbo.config.ProtocolConfig; import org.apache.dubbo.config.spring.context.config.NamePropertyDefaultValueDubboConfigBeanCustomizer; import org.apache.dubbo.config.spring.context.properties.DefaultDubboConfigBinder; @@ -52,6 +53,14 @@ public class DubboConfigBindingBeanPostProcessorTest { return new ApplicationConfig(); } + @Bean("dubbo-demo-protocol") + public ProtocolConfig protocolConfig() { + ProtocolConfig protocolConfig = new ProtocolConfig(); + protocolConfig.setName("dubbo"); + protocolConfig.setId("customConfigAlias"); + return protocolConfig; + } + @Bean public DubboConfigBindingBeanPostProcessor bindingBeanPostProcessor() { return new DubboConfigBindingBeanPostProcessor("dubbo.application", "dubbo-demo-application"); @@ -65,8 +74,15 @@ public class DubboConfigBindingBeanPostProcessorTest { ApplicationConfig applicationConfig = applicationContext.getBean(ApplicationConfig.class); + String[] aliases = applicationContext.getAliases("dubbo-demo-protocol"); + ProtocolConfig protocolConfigByName = applicationContext.getBean("dubbo-demo-protocol", ProtocolConfig.class); + ProtocolConfig protocolConfigById = applicationContext.getBean(protocolConfigByName.getId(), ProtocolConfig.class); + Assert.assertEquals("dubbo-demo-application", applicationConfig.getName()); Assert.assertEquals("mercyblitz", applicationConfig.getOwner()); Assert.assertEquals("Apache", applicationConfig.getOrganization()); + + Assert.assertArrayEquals(new String[]{"customConfigAlias"}, aliases); + Assert.assertEquals(protocolConfigByName, protocolConfigById); } } \ No newline at end of file diff --git a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/Constants.java b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/Constants.java deleted file mode 100644 index fcf1a51fc56c14baa827d3e524f5f73d6e923904..0000000000000000000000000000000000000000 --- a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/Constants.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.dubbo.configcenter; - -public interface Constants { - String CONFIG_CLUSTER_KEY = "config.cluster"; - String CONFIG_NAMESPACE_KEY = "config.namespace"; - String CONFIG_GROUP_KEY = "config.group"; - String CONFIG_CHECK_KEY = "config.check"; -} diff --git a/dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfiguration.java b/dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfiguration.java index f2ba3510d9a12d23031780e31365387c2b33a722..44334120460fd085248f8df6e4f319397e3cc463 100644 --- a/dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfiguration.java +++ b/dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfiguration.java @@ -44,10 +44,10 @@ import java.util.stream.Collectors; import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE; import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.CHECK_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY; import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN; -import static org.apache.dubbo.configcenter.Constants.CONFIG_CHECK_KEY; -import static org.apache.dubbo.configcenter.Constants.CONFIG_CLUSTER_KEY; -import static org.apache.dubbo.configcenter.Constants.CONFIG_NAMESPACE_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_NAMESPACE_KEY; /** * Apollo implementation, https://github.com/ctripcorp/apollo @@ -70,7 +70,7 @@ public class ApolloDynamicConfiguration implements DynamicConfiguration { // Instead of using Dubbo's configuration, I would suggest use the original configuration method Apollo provides. String configEnv = url.getParameter(APOLLO_ENV_KEY); String configAddr = getAddressWithProtocolPrefix(url); - String configCluster = url.getParameter(CONFIG_CLUSTER_KEY); + String configCluster = url.getParameter(CLUSTER_KEY); if (configEnv != null) { System.setProperty(APOLLO_ENV_KEY, configEnv); } @@ -84,7 +84,7 @@ public class ApolloDynamicConfiguration implements DynamicConfiguration { dubboConfig = ConfigService.getConfig(url.getParameter(CONFIG_NAMESPACE_KEY, DEFAULT_GROUP)); dubboConfigFile = ConfigService.getConfigFile(url.getParameter(CONFIG_NAMESPACE_KEY, DEFAULT_GROUP), ConfigFileFormat.Properties); // Decide to fail or to continue when failed to connect to remote server. - boolean check = url.getParameter(CONFIG_CHECK_KEY, true); + boolean check = url.getParameter(CHECK_KEY, true); if (dubboConfig.getSourceType() != ConfigSourceType.REMOTE) { if (check) { throw new IllegalStateException("Failed to connect to config center, the config center is Apollo, " + diff --git a/dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java b/dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java index f57f6393f62f09bb04fb3f5eafa5b999be2eee64..c91994ee8983cbd5142e461d5a2f69fdf5acd133 100644 --- a/dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java +++ b/dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java @@ -39,9 +39,9 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; import static java.util.concurrent.Executors.newCachedThreadPool; +import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_NAMESPACE_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR; import static org.apache.dubbo.configcenter.ConfigChangeType.ADDED; -import static org.apache.dubbo.configcenter.Constants.CONFIG_NAMESPACE_KEY; /** * config center implementation for consul diff --git a/dubbo-configcenter/dubbo-configcenter-etcd/src/main/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfiguration.java b/dubbo-configcenter/dubbo-configcenter-etcd/src/main/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfiguration.java index 1b101059388707570c24940585e8646b06a47791..b902668281162f5af7a5366c811a2f8fbf56334a 100644 --- a/dubbo-configcenter/dubbo-configcenter-etcd/src/main/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfiguration.java +++ b/dubbo-configcenter/dubbo-configcenter-etcd/src/main/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfiguration.java @@ -40,8 +40,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_NAMESPACE_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR; -import static org.apache.dubbo.configcenter.Constants.CONFIG_NAMESPACE_KEY; /** * The etcd implementation of {@link DynamicConfiguration} diff --git a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java index 096b71c0239f72e8475c8cd15c89b0ec35897957..f11bbe8190c6f1b4b70e1f5bd90a3d0f0cb1ca75 100644 --- a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java +++ b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java @@ -32,8 +32,8 @@ import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_NAMESPACE_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR; -import static org.apache.dubbo.configcenter.Constants.CONFIG_NAMESPACE_KEY; /** * diff --git a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationFactory.java b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationFactory.java index 4d78133dbaf79f4fa4c9b4afac971e55bb5cd5bf..90a49bec90db2f861ca1816fe751a37f396ee686 100644 --- a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationFactory.java +++ b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationFactory.java @@ -32,7 +32,6 @@ public class ZookeeperDynamicConfigurationFactory extends AbstractDynamicConfigu this.zookeeperTransporter = zookeeperTransporter; } - @Override protected DynamicConfiguration createDynamicConfiguration(URL url) { return new ZookeeperDynamicConfiguration(url, zookeeperTransporter); diff --git a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java index cb5ace512c05cb78b844a0af3e0656a2a24e1662..b9f68e9903a215b1132c0a9d4f6423163bb4549e 100755 --- a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java +++ b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java @@ -55,6 +55,9 @@ public class TypeDefinitionBuilder { td = DefaultTypeBuilder.build(clazz, typeCache); td.setTypeBuilderName(DefaultTypeBuilder.class.getName()); } + if (clazz.equals(String.class)) { + td.setProperties(null); + } return td; } diff --git a/dubbo-metadata-report/dubbo-metadata-report-etcd/src/test/java/org/apache/dubbo/metadata/store/etcd/EtcdMetadataReportTest.java b/dubbo-metadata-report/dubbo-metadata-report-etcd/src/test/java/org/apache/dubbo/metadata/store/etcd/EtcdMetadataReportTest.java index 2f45171b45138205f61f1b5e4f403c0420eb5ebb..fcb7b76743d99ce6521ce0efc38556db6fa88731 100644 --- a/dubbo-metadata-report/dubbo-metadata-report-etcd/src/test/java/org/apache/dubbo/metadata/store/etcd/EtcdMetadataReportTest.java +++ b/dubbo-metadata-report/dubbo-metadata-report-etcd/src/test/java/org/apache/dubbo/metadata/store/etcd/EtcdMetadataReportTest.java @@ -32,7 +32,6 @@ import io.etcd.jetcd.launcher.EtcdClusterFactory; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import java.net.URI; @@ -44,6 +43,7 @@ import java.util.concurrent.CompletableFuture; import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE; import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE; +import static org.apache.dubbo.metadata.support.Constants.SYNC_REPORT_KEY; /** * Unit test for etcd metadata report @@ -63,7 +63,7 @@ public class EtcdMetadataReportTest { etcdCluster.start(); etcdClientForTest = Client.builder().endpoints(etcdCluster.getClientEndpoints()).build(); List clientEndPoints = etcdCluster.getClientEndpoints(); - this.registryUrl = URL.valueOf("etcd://" + clientEndPoints.get(0).getHost() + ":" + clientEndPoints.get(0).getPort()); + this.registryUrl = URL.valueOf("etcd://" + clientEndPoints.get(0).getHost() + ":" + clientEndPoints.get(0).getPort()).addParameter(SYNC_REPORT_KEY, true); etcdMetadataReportFactory = new EtcdMetadataReportFactory(); this.etcdMetadataReport = (EtcdMetadataReport) etcdMetadataReportFactory.createMetadataReport(registryUrl); } @@ -74,7 +74,6 @@ public class EtcdMetadataReportTest { } @Test - @Disabled("Disabled because https://github.com/apache/dubbo/issues/4185") public void testStoreProvider() throws Exception { String version = "1.0.0"; String group = null; @@ -120,7 +119,6 @@ public class EtcdMetadataReportTest { ServiceDefinitionBuilder.buildFullDefinition(interfaceClass, url.getParameters()); etcdMetadataReport.storeProviderMetadata(providerMetadataIdentifier, fullServiceDefinition); - Thread.sleep(1000); return providerMetadataIdentifier; } @@ -131,7 +129,6 @@ public class EtcdMetadataReportTest { Map tmp = new HashMap<>(); tmp.put("paramConsumerTest", "etcdConsumer"); etcdMetadataReport.storeConsumerMetadata(consumerIdentifier, tmp); - Thread.sleep(1000); return consumerIdentifier; } } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java index 6329f15025de72cb622a0f7f16029096e94d9883..7335ed19f706a14ddbd55b1670715c5831d739e7 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java @@ -215,7 +215,7 @@ public class RegistryProtocol implements Protocol { ProviderInvokerWrapper providerInvokerWrapper = ProviderConsumerRegTable.registerProvider(originInvoker, registryUrl, registeredProviderUrl); //to judge if we need to delay publish - boolean register = registeredProviderUrl.getParameter("register", true); + boolean register = providerUrl.getParameter(REGISTER_KEY, true); if (register) { register(registryUrl, registeredProviderUrl); providerInvokerWrapper.setReg(true); diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeChannel.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeChannel.java index 2529ac7e4809734752ba40ec85a79ce8cb7b6785..e04f930367858eeb474dcc1314ad71bd3b063ed1 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeChannel.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeChannel.java @@ -131,6 +131,8 @@ final class HeaderExchangeChannel implements ExchangeChannel { @Override public void close() { try { + // graceful close + DefaultFuture.closeChannel(channel); channel.close(); } catch (Throwable e) { logger.warn(e.getMessage(), e); diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/ProtocolUtils.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/ProtocolUtils.java index 922ea490191484cb4ceaba82550e7ff5a8c33617..b5b9ed6fb5dd54ac9269c56c12c228d23dac9874 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/ProtocolUtils.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/ProtocolUtils.java @@ -21,11 +21,11 @@ import org.apache.dubbo.common.utils.StringUtils; import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY; import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY; -import static org.apache.dubbo.rpc.Constants.GENERIC_SERIALIZATION_NATIVE_JAVA; -import static org.apache.dubbo.rpc.Constants.GENERIC_SERIALIZATION_DEFAULT; +import static org.apache.dubbo.rpc.Constants.GENERIC_RAW_RETURN; import static org.apache.dubbo.rpc.Constants.GENERIC_SERIALIZATION_BEAN; +import static org.apache.dubbo.rpc.Constants.GENERIC_SERIALIZATION_DEFAULT; +import static org.apache.dubbo.rpc.Constants.GENERIC_SERIALIZATION_NATIVE_JAVA; import static org.apache.dubbo.rpc.Constants.GENERIC_SERIALIZATION_PROTOBUF; -import static org.apache.dubbo.rpc.Constants.GENERIC_RAW_RETURN; public class ProtocolUtils { @@ -64,6 +64,11 @@ public class ProtocolUtils { } + public static boolean isValidGenericValue(String generic) { + return isGeneric(generic) || Boolean.FALSE.toString().equalsIgnoreCase(generic); + + } + public static boolean isDefaultGenericSerialization(String generic) { return isGeneric(generic) && GENERIC_SERIALIZATION_DEFAULT.equalsIgnoreCase(generic); diff --git a/pom.xml b/pom.xml index 91862d84711926a7dd96454f72816a6d100a7c0c..92c20a32a74997f22717af919487f2aec82916b6 100644 --- a/pom.xml +++ b/pom.xml @@ -289,6 +289,7 @@ attach-javadoc jar + aggregate @@ -315,6 +316,11 @@ http://docs.oracle.com/javase/8/docs/api none + + org.apache.dubbo.demo,org.apache.dubbo.demo.* + + Apache Dubbo ${project.version} API + Apache Dubbo ${project.version} API