diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java index 84e2a11b5b..2a6b73ed0b 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java @@ -47,6 +47,8 @@ import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentSkipListMap; +import java.util.function.Consumer; +import java.util.function.Supplier; /** * PojoUtils. Travel object deeply, and convert complex type to simple type. @@ -65,7 +67,7 @@ public class PojoUtils { private static final Logger logger = LoggerFactory.getLogger(PojoUtils.class); private static final ConcurrentMap NAME_METHODS_CACHE = new ConcurrentHashMap(); private static final ConcurrentMap, ConcurrentMap> CLASS_FIELD_CACHE = new ConcurrentHashMap, ConcurrentMap>(); - private static final boolean GENERIC_WITH_CLZ = Boolean.parseBoolean(ConfigUtils.getProperty(CommonConstants.GENERIC_WITH_CLZ_KEY,"true")); + private static final boolean GENERIC_WITH_CLZ = Boolean.parseBoolean(ConfigUtils.getProperty(CommonConstants.GENERIC_WITH_CLZ_KEY, "true")); public static Object[] generalize(Object[] objs) { Object[] dests = new Object[objs.length]; @@ -527,7 +529,7 @@ public class PojoUtils { if (!ArrayUtils.isEmpty(interfaces)) { for (Type type : interfaces) { if (type instanceof ParameterizedType) { - ParameterizedType t = (ParameterizedType)type; + ParameterizedType t = (ParameterizedType) type; if ("java.util.Map".equals(t.getRawType().getTypeName())) { return t.getActualTypeArguments()[0]; } @@ -597,6 +599,7 @@ public class PojoUtils { /** * return init value + * * @param parameterType * @return */ @@ -660,4 +663,19 @@ public class PojoUtils { && !Map.class.isAssignableFrom(cls); } + /** + * Update the property if absent + * + * @param getterMethod the getter method + * @param setterMethod the setter method + * @param newValue the new value + * @param the value type + * @since 2.7.8 + */ + public static void updatePropertyIfAbsent(Supplier getterMethod, Consumer setterMethod, T newValue) { + if (newValue != null && getterMethod.get() == null) { + setterMethod.accept(newValue); + } + } + } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/RegistryConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/RegistryConfig.java index 7a8e304f91..3b65b400f5 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/config/RegistryConfig.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/config/RegistryConfig.java @@ -26,6 +26,7 @@ import java.util.Map; import static org.apache.dubbo.common.constants.CommonConstants.EXTRA_KEYS_KEY; import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY; import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY; +import static org.apache.dubbo.common.utils.PojoUtils.updatePropertyIfAbsent; import static org.apache.dubbo.config.Constants.REGISTRIES_SUFFIX; /** @@ -199,7 +200,7 @@ public class RegistryConfig extends AbstractConfig { public void setProtocol(String protocol) { this.protocol = protocol; - this.updateIdIfAbsent(protocol); +// this.updateIdIfAbsent(protocol); } @Parameter(excluded = true) @@ -212,13 +213,22 @@ public class RegistryConfig extends AbstractConfig { if (address != null) { try { URL url = URL.valueOf(address); - setUsername(url.getUsername()); - setPassword(url.getPassword()); + + // Refactor since 2.7.8 + updatePropertyIfAbsent(this::getUsername, this::setUsername, url.getUsername()); + updatePropertyIfAbsent(this::getPassword, this::setPassword, url.getPassword()); + updatePropertyIfAbsent(this::getProtocol, this::setProtocol, url.getProtocol()); + updatePropertyIfAbsent(this::getPort, this::setPort, url.getPort()); + +// setUsername(url.getUsername()); +// setPassword(url.getPassword()); // updateIdIfAbsent(url.getProtocol()); - updateProtocolIfAbsent(url.getProtocol()); - updatePortIfAbsent(url.getPort()); +// updateProtocolIfAbsent(url.getProtocol()); +// updatePortIfAbsent(url.getPort()); Map params = url.getParameters(); - params.remove(BACKUP_KEY); + if (CollectionUtils.isNotEmptyMap(params)) { + params.remove(BACKUP_KEY); + } updateParameters(params); } catch (Exception ignored) { } @@ -515,16 +525,4 @@ public class RegistryConfig extends AbstractConfig { // empty protocol will default to 'dubbo' return !StringUtils.isEmpty(address); } - - protected void updatePortIfAbsent(Integer value) { - if (value != null && value > 0 && port == null) { - this.port = value; - } - } - - protected void updateProtocolIfAbsent(String value) { - if (StringUtils.isNotEmpty(value) && StringUtils.isEmpty(protocol)) { - this.protocol = value; - } - } } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java index 6985980242..d07f43ccdb 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java @@ -19,6 +19,7 @@ package org.apache.dubbo.config.bootstrap; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.config.Environment; import org.apache.dubbo.common.config.configcenter.DynamicConfiguration; +import org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory; import org.apache.dubbo.common.config.configcenter.wrapper.CompositeDynamicConfiguration; import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.lang.ShutdownHookCallback; @@ -60,6 +61,7 @@ import org.apache.dubbo.event.GenericEventListener; import org.apache.dubbo.metadata.MetadataService; import org.apache.dubbo.metadata.MetadataServiceExporter; import org.apache.dubbo.metadata.WritableMetadataService; +import org.apache.dubbo.metadata.report.MetadataReportFactory; import org.apache.dubbo.metadata.report.MetadataReportInstance; import org.apache.dubbo.registry.client.DefaultServiceInstance; import org.apache.dubbo.registry.client.ServiceDiscovery; @@ -85,8 +87,10 @@ import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.stream.Collectors; +import static java.lang.String.format; import static java.util.Arrays.asList; import static java.util.concurrent.Executors.newSingleThreadExecutor; import static org.apache.dubbo.common.config.ConfigurationUtils.parseProperties; @@ -669,8 +673,8 @@ public class DubboBootstrap extends GenericEventListener { } private boolean isUsedRegistryAsConfigCenter(RegistryConfig registryConfig) { - // TODO: confirm ? registryConfig.getUseAsConfigCenter() == null || registryConfig.getUseAsConfigCenter() - return Boolean.TRUE.equals(registryConfig.getUseAsConfigCenter()); + return isUsedRegistryAsCenter(registryConfig, registryConfig::getUseAsConfigCenter, "config", + DynamicConfigurationFactory.class); } private ConfigCenterConfig registryAsConfigCenter(RegistryConfig registryConfig) { @@ -718,8 +722,58 @@ public class DubboBootstrap extends GenericEventListener { } private boolean isUsedRegistryAsMetadataCenter(RegistryConfig registryConfig) { - // TODO: confirm ? registryConfig.getUseAsMetadataCenter() == null || registryConfig.getUseAsMetadataCenter() - return Boolean.TRUE.equals(registryConfig.getUseAsMetadataCenter()); + return isUsedRegistryAsCenter(registryConfig, registryConfig::getUseAsMetadataCenter, "metadata", + MetadataReportFactory.class); + } + + /** + * Is used the specified registry as a center infrastructure + * + * @param registryConfig the {@link RegistryConfig} + * @param usedRegistryAsCenter the configured value on + * @param centerType the type name of center + * @param extensionClass an extension class of a center infrastructure + * @return + * @since 2.7.8 + */ + private boolean isUsedRegistryAsCenter(RegistryConfig registryConfig, Supplier usedRegistryAsCenter, + String centerType, + Class extensionClass) { + final boolean supported; + + Boolean configuredValue = usedRegistryAsCenter.get(); + if (configuredValue != null) { // If configured, take its value. + supported = configuredValue.booleanValue(); + } else { // Or check the extension existence + String protocol = registryConfig.getProtocol(); + supported = supportsExtension(extensionClass, protocol); + if (logger.isInfoEnabled()) { + logger.info(format("No value is configured in the registry, the %s extension[name : %s] %s as the %s center" + , extensionClass.getSimpleName(), protocol, supported ? "supports" : "does not support", centerType)); + } + } + + if (logger.isInfoEnabled()) { + logger.info(format("The registry[%s] will be %s as the %s center", registryConfig, + supported ? "used" : "not used", centerType)); + } + return supported; + } + + /** + * Supports the extension with the specified class and name + * + * @param extensionClass the {@link Class} of extension + * @param name the name of extension + * @return if supports, return true, or false + * @since 2.7.8 + */ + private boolean supportsExtension(Class extensionClass, String name) { + if (isNotEmpty(name)) { + ExtensionLoader extensionLoader = getExtensionLoader(extensionClass); + return extensionLoader.hasExtension(name); + } + return false; } private MetadataReportConfig registryAsMetadataCenter(RegistryConfig registryConfig) { diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/builders/RegistryBuilder.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/builders/RegistryBuilder.java index d717aaaf66..c12b4e95c6 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/builders/RegistryBuilder.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/builders/RegistryBuilder.java @@ -344,7 +344,6 @@ public class RegistryBuilder extends AbstractBuilder builder.address("nacos://127.0.0.1:8848") - .parameter(REGISTRY_TYPE_KEY, SERVICE_REGISTRY_TYPE) - .useAsConfigCenter(true) - .useAsMetadataCenter(true)) + .registry("nacos", builder -> builder.address("nacos://127.0.0.1:8848?username=nacos&password=nacos") + .parameter(REGISTRY_TYPE_KEY, SERVICE_REGISTRY_TYPE)) // Nacos in traditional registry type // .registry("nacos-traditional", builder -> builder.address("nacos://127.0.0.1:8848")) .protocol("dubbo", builder -> builder.port(20885).name("dubbo")) diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/ZookeeperDubboServiceProviderBootstrap.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/ZookeeperDubboServiceProviderBootstrap.java index e9b946fe47..4bb2393876 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/ZookeeperDubboServiceProviderBootstrap.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/ZookeeperDubboServiceProviderBootstrap.java @@ -32,9 +32,7 @@ public class ZookeeperDubboServiceProviderBootstrap { DubboBootstrap.getInstance() .application("zookeeper-dubbo-provider", app -> app.metadata(COMPOSITE_METADATA_STORAGE_TYPE)) .registry(builder -> builder.address("zookeeper://127.0.0.1:2181") - .parameter(REGISTRY_TYPE_KEY, SERVICE_REGISTRY_TYPE) - .useAsConfigCenter(true) - .useAsMetadataCenter(true)) + .parameter(REGISTRY_TYPE_KEY, SERVICE_REGISTRY_TYPE)) .protocol("dubbo", builder -> builder.port(-1).name("dubbo")) .protocol("rest", builder -> builder.port(8081).name("rest")) .service("echo", builder -> builder.interfaceClass(EchoService.class).ref(new EchoServiceImpl()).protocolIds("dubbo")) diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/config.properties b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/config.properties index 22d06ae882..1e9b13a4bd 100644 --- a/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/config.properties +++ b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/config.properties @@ -12,6 +12,8 @@ dubbo.module.name = dubbo-demo-module ## registry dubbo.registry.address = zookeeper://192.168.99.100:32770 +dubbo.registry.useAsConfigCenter = false +dubbo.registry.useAsMetadataCenter = false ## protocol dubbo.protocol.name = dubbo diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/issue-6252-test.properties b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/issue-6252-test.properties index 413806d52f..fd774f8c2f 100644 --- a/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/issue-6252-test.properties +++ b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/issue-6252-test.properties @@ -7,5 +7,9 @@ dubbo.consumer.check=false dubbo.registries.z214.address=zookeeper://192.168.99.214:2181 dubbo.registries.z214.timeout=60000 dubbo.registries.z214.subscribe=false +dubbo.registries.z214.useAsConfigCenter=false +dubbo.registries.z214.useAsMetadataCenter=false dubbo.registries.z205.address=zookeeper://192.168.99.205:2181 -dubbo.registries.z205.timeout=60000 \ No newline at end of file +dubbo.registries.z205.timeout=60000 +dubbo.registries.z205.useAsConfigCenter=false +dubbo.registries.z205.useAsMetadataCenter=false \ No newline at end of file diff --git a/dubbo-dependencies-bom/pom.xml b/dubbo-dependencies-bom/pom.xml index 3930394deb..72a6dc96df 100644 --- a/dubbo-dependencies-bom/pom.xml +++ b/dubbo-dependencies-bom/pom.xml @@ -130,7 +130,7 @@ 3.0.19.Final 8.5.31 0.4.1 - 1.1.1 + 1.3.1 1.22.1 1.7.25