From 5f15355f98800222db259b50173b79ad602cb542 Mon Sep 17 00:00:00 2001 From: bruce <841326226@qq.com> Date: Mon, 16 Sep 2019 10:53:55 +0800 Subject: [PATCH 01/17] fix default setting --- .../AnnotationInjectedBeanPostProcessor.java | 52 ++++++++++++++----- .../DubboConfigBindingBeanPostProcessor.java | 27 ++-------- 2 files changed, 43 insertions(+), 36 deletions(-) diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AnnotationInjectedBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AnnotationInjectedBeanPostProcessor.java index e320e06bc35..fcad0fecb64 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AnnotationInjectedBeanPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AnnotationInjectedBeanPostProcessor.java @@ -243,7 +243,7 @@ private AnnotationInjectedBeanPostProcessor.AnnotatedInjectionMetadata buildAnno } - private InjectionMetadata findInjectionMetadata(String beanName, Class clazz, PropertyValues pvs) { + public InjectionMetadata findInjectionMetadata(String beanName, Class clazz, PropertyValues pvs) { // Fall back to class name as cache key, for backwards compatibility with custom callers. String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName()); // Quick check on the concurrent map first, with minimal locking. @@ -334,8 +334,8 @@ protected ConfigurableListableBeanFactory getBeanFactory() { * * @return non-null {@link Collection} */ - protected Collection getInjectedObjects() { - return this.injectedObjectsCache.values(); + protected Map getInjectedObjects() { + return this.injectedObjectsCache; } /** @@ -422,7 +422,7 @@ protected Map getInjectedFieldObjects for (AnnotationInjectedBeanPostProcessor.AnnotatedFieldElement fieldElement : fieldElements) { - injectedElementBeanMap.put(fieldElement, fieldElement.bean); + injectedElementBeanMap.put(fieldElement, fieldElement.injectedBean); } @@ -448,7 +448,7 @@ protected Map getInjectedMethodObject for (AnnotationInjectedBeanPostProcessor.AnnotatedMethodElement methodElement : methodElements) { - injectedElementBeanMap.put(methodElement, methodElement.object); + injectedElementBeanMap.put(methodElement, methodElement.injectedBean); } @@ -461,7 +461,7 @@ protected Map getInjectedMethodObject /** * {@link Annotation Annotated} {@link InjectionMetadata} implementation */ - private class AnnotatedInjectionMetadata extends InjectionMetadata { + public class AnnotatedInjectionMetadata extends InjectionMetadata { private final Collection fieldElements; @@ -486,13 +486,13 @@ public Collection ge /** * {@link Annotation Annotated} {@link Method} {@link InjectionMetadata.InjectedElement} */ - private class AnnotatedMethodElement extends InjectionMetadata.InjectedElement { + public class AnnotatedMethodElement extends InjectionMetadata.InjectedElement { private final Method method; private final AnnotationAttributes attributes; - private volatile Object object; + private volatile Object injectedBean; protected AnnotatedMethodElement(Method method, PropertyDescriptor pd, AnnotationAttributes attributes) { super(method, pd); @@ -505,14 +505,29 @@ protected void inject(Object bean, String beanName, PropertyValues pvs) throws T Class injectedType = pd.getPropertyType(); - Object injectedObject = getInjectedObject(attributes, bean, beanName, injectedType, this); + injectedBean = getInjectedObject(attributes, bean, beanName, injectedType, this); ReflectionUtils.makeAccessible(method); - method.invoke(bean, injectedObject); + method.invoke(bean, injectedBean); } + public Method getMethod() { + return method; + } + + public AnnotationAttributes getAttributes() { + return attributes; + } + + public Object getInjectedBean() { + return injectedBean; + } + + public PropertyDescriptor getPd() { + return this.pd; + } } /** @@ -524,7 +539,7 @@ public class AnnotatedFieldElement extends InjectionMetadata.InjectedElement { private final AnnotationAttributes attributes; - private volatile Object bean; + private volatile Object injectedBean; protected AnnotatedFieldElement(Field field, AnnotationAttributes attributes) { super(field, null); @@ -537,13 +552,24 @@ protected void inject(Object bean, String beanName, PropertyValues pvs) throws T Class injectedType = field.getType(); - Object injectedObject = getInjectedObject(attributes, bean, beanName, injectedType, this); + injectedBean = getInjectedObject(attributes, bean, beanName, injectedType, this); ReflectionUtils.makeAccessible(field); - field.set(bean, injectedObject); + field.set(bean, injectedBean); + + } + + public Field getField() { + return field; + } + public AnnotationAttributes getAttributes() { + return attributes; } + public Object getInjectedBean() { + return injectedBean; + } } } 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 64327b72b70..bc943a210e6 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 @@ -67,10 +67,6 @@ public class DubboConfigBindingBeanPostProcessor implements BeanPostProcessor, A private ApplicationContext applicationContext; - private boolean ignoreUnknownFields = true; - - private boolean ignoreInvalidFields = true; - private List configBeanCustomizers = Collections.emptyList(); /** @@ -119,22 +115,6 @@ private void customize(String beanName, AbstractConfig dubboConfig) { } - public boolean isIgnoreUnknownFields() { - return ignoreUnknownFields; - } - - public void setIgnoreUnknownFields(boolean ignoreUnknownFields) { - this.ignoreUnknownFields = ignoreUnknownFields; - } - - public boolean isIgnoreInvalidFields() { - return ignoreInvalidFields; - } - - public void setIgnoreInvalidFields(boolean ignoreInvalidFields) { - this.ignoreInvalidFields = ignoreInvalidFields; - } - public DubboConfigBinder getDubboConfigBinder() { return dubboConfigBinder; } @@ -176,9 +156,6 @@ private void initDubboConfigBinder() { } } - dubboConfigBinder.setIgnoreUnknownFields(ignoreUnknownFields); - dubboConfigBinder.setIgnoreInvalidFields(ignoreInvalidFields); - } private void initConfigBeanCustomizers() { @@ -200,6 +177,10 @@ private void initConfigBeanCustomizers() { protected DubboConfigBinder createDubboConfigBinder(Environment environment) { DefaultDubboConfigBinder defaultDubboConfigBinder = new DefaultDubboConfigBinder(); defaultDubboConfigBinder.setEnvironment(environment); + + defaultDubboConfigBinder.setIgnoreUnknownFields(true); + defaultDubboConfigBinder.setIgnoreInvalidFields(true); + return defaultDubboConfigBinder; } From 9fd6782fc9e1b6815d2fc118e772164fb0295589 Mon Sep 17 00:00:00 2001 From: yavin Date: Mon, 16 Sep 2019 14:27:39 +0800 Subject: [PATCH 02/17] fix register config not take effect because of url simplified (#4397) --- .../org/apache/dubbo/registry/integration/RegistryProtocol.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6329f15025d..7335ed19f70 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 Exporter export(final Invoker originInvoker) throws RpcExceptio 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); From f8cfff9976c712952b431162f0e775106633aa20 Mon Sep 17 00:00:00 2001 From: myPrecious Date: Mon, 16 Sep 2019 16:30:58 +0800 Subject: [PATCH 03/17] [Dubbo-4984]Fix: type definition for String class (#5032) * type definition for String class * code format --- .../dubbo/metadata/definition/TypeDefinitionBuilder.java | 3 +++ 1 file changed, 3 insertions(+) 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 cb5ace512c0..b9f68e9903a 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 static TypeDefinition build(Type type, Class clazz, Map, Type td = DefaultTypeBuilder.build(clazz, typeCache); td.setTypeBuilderName(DefaultTypeBuilder.class.getName()); } + if (clazz.equals(String.class)) { + td.setProperties(null); + } return td; } From 0378fee74252584cf631e99dc4e067cb08553077 Mon Sep 17 00:00:00 2001 From: cvictory Date: Tue, 17 Sep 2019 09:56:09 +0800 Subject: [PATCH 04/17] tag router supports anyhost (#4431) Fixes #4393 --- .../org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java | 5 +++++ 1 file changed, 5 insertions(+) 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 c96f6a225cc..d8b35bcd765 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.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 @@ private boolean checkAddressMatch(List addresses, String host, int port) 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) { From dc359ef579333320143f79b733db9443fa3cdc1a Mon Sep 17 00:00:00 2001 From: Zhiwei Zhao Date: Tue, 17 Sep 2019 09:58:30 +0800 Subject: [PATCH 05/17] fix 4694: consumer return quickly, when the provider interrupts abnormally (#4698) --- .../remoting/exchange/support/header/HeaderExchangeChannel.java | 2 ++ 1 file changed, 2 insertions(+) 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 2529ac7e480..e04f9303678 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 @@ public boolean isClosed() { @Override public void close() { try { + // graceful close + DefaultFuture.closeChannel(channel); channel.close(); } catch (Throwable e) { logger.warn(e.getMessage(), e); From ef058ee2b8f39958d1441d76a2bdb982201b5e1f Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Tue, 17 Sep 2019 17:07:11 +0800 Subject: [PATCH 06/17] throw exception whenever SPI extensions are in abnormal status when loading (#5072) --- .../dubbo/common/extension/ExtensionLoader.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) 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 59c45144ac4..d95165377f5 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 T getAdaptiveExtension() { 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 @@ private IllegalStateException findException(String name) { @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); From c5f6b498810c7ba4519190ee9c3e1130090f2f3a Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Wed, 18 Sep 2019 17:14:41 +0800 Subject: [PATCH 07/17] try to fix travis javax.ex dependency issue --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b346423fd89..624ca6c41c3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ sudo: false # faster builds jdk: - openjdk11 - - openjdk8 + - oraclejdk8 cache: directories: From 83d097f857cfe50ee205b7fd47b986266ccd4cd7 Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Wed, 18 Sep 2019 17:51:45 +0800 Subject: [PATCH 08/17] try to fix travis javax.ex dependency issue --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 624ca6c41c3..52b86da7d5e 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!" From 8dfb0787db14c79f9b0e136ed3c0f075b0a3a2b7 Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Wed, 18 Sep 2019 17:56:50 +0800 Subject: [PATCH 09/17] try to fix travis javax.ex dependency issue --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 52b86da7d5e..a4bac41ef37 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ sudo: false # faster builds jdk: - openjdk11 - - oraclejdk8 + - openjdk8 cache: directories: From d00788b7151c57044beaa08727a017509c504013 Mon Sep 17 00:00:00 2001 From: Junjian Peng Date: Wed, 18 Sep 2019 18:59:07 +0800 Subject: [PATCH 10/17] [Dubbo-4882] Add support for overriding Map properties in AbstractConfig.refresh (#4899) --- .../dubbo/common/utils/StringUtils.java | 27 +++++ .../dubbo/common/utils/ConfigUtilsTest.java | 10 ++ .../dubbo/common/utils/StringUtilsTest.java | 23 ++++ .../src/test/resources/parameters.properties | 1 + .../apache/dubbo/config/AbstractConfig.java | 104 ++++++++++++------ .../dubbo/config/AbstractConfigTest.java | 35 ++++++ 6 files changed, 166 insertions(+), 34 deletions(-) create mode 100644 dubbo-common/src/test/resources/parameters.properties 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 28aca4a2e07..15bc93befc7 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 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 static boolean isAllUpperCase(String str) { 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 b8c7a737938..21b941722d7 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 void testLoadPropertiesMultiFileNotRootPath() throws Exception { 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 76a91c266c4..43303f93a52 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 void testToOSStyleKey() { 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 00000000000..103a61af733 --- /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-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 7f21f0aca3b..40c2f759881 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 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 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 @@ protected static void appendParameters(Map parameters, Object co } 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 @@ private static String calculateAttributeFromGetter(String getter) { 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 Map getMetaData() { } 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 void setPrefix(String prefix) { 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 void refresh() { 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/test/java/org/apache/dubbo/config/AbstractConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java index c481e32badc..4bac34f307e 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 void testRefreshById() { } } + @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 { From 94fd72e50cfba2868ebbeb3a800b1c282377e60e Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Wed, 18 Sep 2019 19:59:30 +0800 Subject: [PATCH 11/17] fix set generic method error (#5079) --- .../dubbo/config/AbstractReferenceConfig.java | 14 +++++++--- .../apache/dubbo/config/ServiceConfig.java | 26 +++++++++---------- .../AbstractReferenceBuilderTest.java | 6 +++-- .../dubbo/rpc/support/ProtocolUtils.java | 11 +++++--- 4 files changed, 36 insertions(+), 21 deletions(-) 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 906759dc2df..083ea6f0e52 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 String getGeneric() { } 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/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java index 07945adc163..300cdb8d88e 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.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 void setGeneric(String generic) { 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/builders/AbstractReferenceBuilderTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/builders/AbstractReferenceBuilderTest.java index 2a5f697684d..2936f009e02 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.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 @@ void generic() { @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-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 922ea490191..b5b9ed6fb5d 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 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 static boolean isGeneric(String generic) { } + 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); From f20cc7f117794e3cf72ffa651148060273ac86e2 Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Wed, 18 Sep 2019 20:00:03 +0800 Subject: [PATCH 12/17] delete 'config.' prefix for url generated from ConfigCenterConfig (#5078) --- .../common/constants/CommonConstants.java | 5 ++++ .../com/alibaba/dubbo/common/Constants.java | 1 - .../dubbo/config/ConfigCenterConfig.java | 16 +++---------- .../org/apache/dubbo/config/Constants.java | 5 ---- .../dubbo/config/ConfigCenterConfigTest.java | 6 ++--- .../apache/dubbo/configcenter/Constants.java | 24 ------------------- .../apollo/ApolloDynamicConfiguration.java | 10 ++++---- .../consul/ConsulDynamicConfiguration.java | 2 +- .../etcd/EtcdDynamicConfiguration.java | 2 +- .../ZookeeperDynamicConfiguration.java | 2 +- .../ZookeeperDynamicConfigurationFactory.java | 1 - 11 files changed, 19 insertions(+), 55 deletions(-) delete mode 100644 dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/Constants.java 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 15720acf938..a058ccadf58 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-compatible/src/main/java/com/alibaba/dubbo/common/Constants.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/Constants.java index 7b489a3e2c7..6373c048b29 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/ConfigCenterConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java index 28d3c5a561f..1198826a90e 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.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 void setAddress(String address) { this.address = address; } - @Parameter(key = CONFIG_CLUSTER_KEY) public String getCluster() { return cluster; } @@ -142,7 +136,6 @@ public void setCluster(String cluster) { this.cluster = cluster; } - @Parameter(key = CONFIG_NAMESPACE_KEY) public String getNamespace() { return namespace; } @@ -151,7 +144,6 @@ public void setNamespace(String namespace) { this.namespace = namespace; } - @Parameter(key = CONFIG_GROUP_KEY) public String getGroup() { return group; } @@ -160,7 +152,6 @@ public void setGroup(String group) { this.group = group; } - @Parameter(key = CONFIG_CHECK_KEY) public Boolean isCheck() { return check; } @@ -194,7 +185,6 @@ public void setPassword(String password) { 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 97b0b936f8f..610763e2cf4 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/test/java/org/apache/dubbo/config/ConfigCenterConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigCenterConfigTest.java index cf10ed50b85..6221d6e22d9 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 void testToUrl() { 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-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 fcf1a51fc56..00000000000 --- 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 f2ba3510d9a..44334120460 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 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 f57f6393f62..c91994ee898 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.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 1b101059388..b9026682811 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.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 096b71c0239..f11bbe8190c 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.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 4d78133dbaf..90a49bec90d 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 void setZookeeperTransporter(ZookeeperTransporter zookeeperTransporter) { this.zookeeperTransporter = zookeeperTransporter; } - @Override protected DynamicConfiguration createDynamicConfiguration(URL url) { return new ZookeeperDynamicConfiguration(url, zookeeperTransporter); From c1e49dba68f5fd3fbc6c9553a2ce33d441eb468d Mon Sep 17 00:00:00 2001 From: bailei Date: Thu, 19 Sep 2019 13:20:02 +0800 Subject: [PATCH 13/17] [Dubbo-4331] Improve api doc (#5070) --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index 91862d84711..92c20a32a74 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 From 7a6d98526c2d5d6552f310f2f9775f5ab1c3ab86 Mon Sep 17 00:00:00 2001 From: bruce <841326226@qq.com> Date: Mon, 23 Sep 2019 14:43:14 +0800 Subject: [PATCH 14/17] resolve conflicts --- .../DubboConfigBindingBeanPostProcessor.java | 32 +++++++++++++++++-- ...bboConfigBindingBeanPostProcessorTest.java | 16 ++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) 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 bc943a210e6..1582291fe20 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.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 @@ * @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 List configBeanCustomizers = Collections.emptyList(); /** @@ -125,6 +133,15 @@ public void setDubboConfigBinder(DubboConfigBinder dubboConfigBinder) { @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; } @@ -184,4 +201,15 @@ protected DubboConfigBinder createDubboConfigBinder(Environment environment) { 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 + } +} \ No newline at end of file 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 62a9a26643e..301c1d9d025 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 ApplicationConfig applicationConfig() { 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 void test() { 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 From 1b9ce4d308610409061be60d3a843519c5436dfb Mon Sep 17 00:00:00 2001 From: Yuhao Bi Date: Fri, 20 Sep 2019 10:36:02 +0800 Subject: [PATCH 15/17] Stabilize EtcdMetadataReportTest (#5088) --- .../dubbo/metadata/store/etcd/EtcdMetadataReportTest.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) 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 2f45171b451..fcb7b76743d 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 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 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 void setUp() { 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 void tearDown() throws Exception { } @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 @@ private MetadataIdentifier storeProvider(EtcdMetadataReport etcdMetadataReport, ServiceDefinitionBuilder.buildFullDefinition(interfaceClass, url.getParameters()); etcdMetadataReport.storeProviderMetadata(providerMetadataIdentifier, fullServiceDefinition); - Thread.sleep(1000); return providerMetadataIdentifier; } @@ -131,7 +129,6 @@ private MetadataIdentifier storeConsumer(EtcdMetadataReport etcdMetadataReport, Map tmp = new HashMap<>(); tmp.put("paramConsumerTest", "etcdConsumer"); etcdMetadataReport.storeConsumerMetadata(consumerIdentifier, tmp); - Thread.sleep(1000); return consumerIdentifier; } } From c78acd9960dd91e7b602b1052a4874ad66e32d57 Mon Sep 17 00:00:00 2001 From: xiaoheng1 <2018154970@qq.com> Date: Sun, 22 Sep 2019 23:27:58 +0800 Subject: [PATCH 16/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20CollectionUtils?= =?UTF-8?q?=E7=B1=BBtoStringMap=E6=96=B9=E6=B3=95=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=20pairs=20=E5=8F=82=E6=95=B0=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E4=B8=BA=E7=A9=BA.=20(#5102)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修复 CollectionUtils类toStringMap方法没有检查 pairs 参数是否为空. Fixed #5100 * 使用 ArrayUtils#isEmpty 方法检查 pairs 参数是否为空. Fixed #5100 --- .../java/org/apache/dubbo/common/utils/CollectionUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/CollectionUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/CollectionUtils.java index 40baecdd2db..4e924b3c26f 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/CollectionUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/CollectionUtils.java @@ -173,6 +173,10 @@ private static boolean objectEquals(Object obj1, Object obj2) { public static Map toStringMap(String... pairs) { Map parameters = new HashMap<>(); + if(ArrayUtils.isEmpty(pairs)){ + return parameters; + } + if (pairs.length > 0) { if (pairs.length % 2 != 0) { throw new IllegalArgumentException("pairs must be even."); From acc43a023ca069d5aa748d8a8cafa02c3f307f6a Mon Sep 17 00:00:00 2001 From: bruce <841326226@qq.com> Date: Tue, 8 Oct 2019 15:42:22 +0800 Subject: [PATCH 17/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dnacos=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E8=AE=BE=E7=BD=AEweight=3D1.0,=E5=AF=BC=E8=87=B4=E6=9D=83?= =?UTF-8?q?=E9=87=8D=E8=8E=B7=E5=8F=96bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/dubbo/registry/nacos/NacosRegistry.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java index 894ea52560a..f3acab73caa 100644 --- a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java +++ b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java @@ -49,6 +49,7 @@ import com.alibaba.nacos.api.naming.listener.NamingEvent; import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.api.naming.pojo.ListView; +import org.apache.dubbo.rpc.cluster.Constants; import static java.util.Collections.singleton; import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE; @@ -460,6 +461,7 @@ private Instance createInstance(URL url) { Instance instance = new Instance(); instance.setIp(ip); instance.setPort(port); + instance.setWeight(newURL.getParameter(Constants.WEIGHT_KEY, Constants.DEFAULT_WEIGHT)); instance.setMetadata(new HashMap<>(newURL.getParameters())); return instance; }