This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch cloud-native in repository https://gitbox.apache.org/repos/asf/dubbo.git
commit 56c931eae3360f6f68adb7295279ed00fce2a7f6 Merge: 19c5bab 758b49f Author: ken.lj <[email protected]> AuthorDate: Sat Jul 27 15:17:58 2019 +0800 Merge remote-tracking branch 'origin/cloud-native' into cloud-native # Conflicts: # dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java # dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryConfig.java # dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java dubbo-bootstrap/pom.xml | 40 +- .../dubbo/bootstrap/ApplicationSettings.java | 127 ----- .../org/apache/dubbo/bootstrap/DubboBootstrap.java | 399 +++++++------ .../apache/dubbo/bootstrap/ProtocolSettings.java | 215 ------- .../apache/dubbo/bootstrap/ReferenceSettings.java | 334 ----------- .../apache/dubbo/bootstrap/RegistrySettings.java | 164 ------ .../apache/dubbo/bootstrap/ServiceSettings.java | 384 ------------- .../apache/dubbo/bootstrap/DubboBootstrapTest.java | 14 - .../bootstrap/DubboServiceConsumerBootstrap.java | 36 +- .../bootstrap/DubboServiceProviderBootstrap.java | 25 +- dubbo-common/pom.xml | 4 + .../config/configcenter/ConfigChangeEvent.java | 6 +- .../config/configcenter/ConfigurationListener.java | 4 +- .../config/configcenter/DynamicConfiguration.java | 104 +++- .../configcenter/DynamicConfigurationFactory.java | 20 +- .../file/FileSystemDynamicConfiguration.java | 628 +++++++++++++++++++++ .../FileSystemDynamicConfigurationFactory.java | 21 +- .../configcenter/nop/NopDynamicConfiguration.java | 1 + .../nop/NopDynamicConfigurationFactory.java | 1 + .../wrapper/CompositeDynamicConfiguration.java | 3 - .../apache/dubbo/common/utils/ReflectUtils.java | 30 +- ...config.configcenter.DynamicConfigurationFactory | 3 +- .../DynamicConfigurationFactoryTest.java | 25 +- .../file/FileSystemDynamicConfigurationTest.java | 169 ++++++ dubbo-common/src/test/resources/log4j.xml | 4 +- .../dubbo/config/AbstractInterfaceConfig.java | 23 +- .../org/apache/dubbo/config/RegistryConfig.java | 18 +- .../org/apache/dubbo/config/ServiceConfig.java | 17 +- .../dubbo/config/builders/AbstractBuilder.java | 2 +- .../apache/dubbo/config/context/ConfigManager.java | 433 +++++++------- .../metadata/ServiceInstancePortCustomizer.java | 1 - .../dubbo/config/context/ConfigManagerTest.java | 71 +++ .../ConfigurableMetadataServiceExporterTest.java | 4 +- .../resources/META-INF/spring/dubbo-provider.xml | 16 +- .../support/nacos/NacosDynamicConfiguration.java | 27 +- dubbo-dependencies-bom/pom.xml | 11 +- .../client/FileSystemServiceDiscovery.java | 114 ++++ .../dubbo/registry/etcd/EtcdServiceDiscovery.java | 138 ++++- .../registry/etcd/EtcdServiceDiscoveryFactory.java | 2 +- ...e.dubbo.registry.client.ServiceDiscoveryFactory | 1 + .../zookeeper/ZookeeperServiceDiscovery.java | 2 +- .../org/apache/dubbo/remoting/etcd/EtcdClient.java | 8 + .../dubbo/remoting/etcd/jetcd/JEtcdClient.java | 5 + .../remoting/etcd/jetcd/JEtcdClientWrapper.java | 20 + 44 files changed, 1902 insertions(+), 1772 deletions(-) diff --cc dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java index 5d69982,6a2237f..b558740 --- a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java +++ b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java @@@ -71,11 -68,14 +68,16 @@@ import java.util.concurrent.locks.Reent import java.util.function.Consumer; import java.util.stream.Collectors; + import static java.util.Arrays.asList; import static java.util.concurrent.Executors.newSingleThreadExecutor; import static org.apache.dubbo.common.config.ConfigurationUtils.parseProperties; + import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.getDynamicConfiguration; import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY; + import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty; + import static org.apache.dubbo.config.context.ConfigManager.getInstance; import static org.apache.dubbo.registry.support.AbstractRegistryFactory.getRegistries; +import static org.apache.dubbo.remoting.Constants.CLIENT_KEY; ++import static org.apache.dubbo.remoting.Constants.CLIENT_KEY; /** * The bootstrap class of Dubbo @@@ -326,27 -408,26 +410,29 @@@ public class DubboBootstrap * there's no config center specified explicitly. */ private void useRegistryAsConfigCenterIfNecessary() { - ConfigManager configManager = ConfigManager.getInstance(); - configManager.getDefaultRegistries().ifPresent(registryConfigs -> { - for (RegistryConfig registryConfig : registryConfigs) { - // we use the loading status of DynamicConfiguration to decide whether ConfigCenter has been initiated. - Environment.getInstance().getDynamicConfiguration().orElseGet(() -> { - Set<ConfigCenterConfig> configCenters = configManager.getConfigCenters(); - if (CollectionUtils.isEmpty(configCenters)) { - ConfigCenterConfig cc = new ConfigCenterConfig(); - cc.setParameters(registryConfig.getParameters() == null ? new HashMap<>() : registryConfig.getParameters()); - cc.getParameters().put(CLIENT_KEY,registryConfig.getClient()); - cc.setProtocol(registryConfig.getProtocol()); - cc.setAddress(registryConfig.getAddress()); - cc.setNamespace(registryConfig.getGroup()); - cc.setHighestPriority(false); - configManager.addConfigCenter(cc); - } - return null; - }); - } - startConfigCenter(); + // we use the loading status of DynamicConfiguration to decide whether ConfigCenter has been initiated. + if (Environment.getInstance().getDynamicConfiguration().isPresent()) { + return; + } + + if (CollectionUtils.isNotEmpty(configManager.getConfigCenters())) { + return; + } + + configManager.getRegistries().forEach(registryConfig -> { + String protocol = registryConfig.getProtocol(); + String id = "config-center-" + protocol + "-" + registryConfig.getPort(); + ConfigCenterConfig cc = new ConfigCenterConfig(); + cc.setId(id); - cc.setProtocol(protocol); ++ cc.setParameters(registryConfig.getParameters() == null ? new HashMap<>() : registryConfig.getParameters()); ++ cc.getParameters().put(CLIENT_KEY,registryConfig.getClient()); ++ cc.setProtocol(registryConfig.getProtocol()); + cc.setAddress(registryConfig.getAddress()); ++ cc.setNamespace(registryConfig.getGroup()); + cc.setHighestPriority(false); + configManager.addConfigCenter(cc); }); + startConfigCenter(); } private List<ServiceDiscovery> getServiceDiscoveries() { @@@ -533,13 -605,13 +610,13 @@@ return null; } DynamicConfiguration dynamicConfiguration = getDynamicConfiguration(configCenter.toUrl()); - String configContent = dynamicConfiguration.getConfigs(configCenter.getConfigFile(), configCenter.getGroup()); + String configContent = dynamicConfiguration.getProperties(configCenter.getConfigFile(), configCenter.getGroup()); - String appGroup = ConfigManager.getInstance().getApplication().orElse(new ApplicationConfig()).getName(); + String appGroup = configManager.getApplication().orElse(new ApplicationConfig()).getName(); String appConfigContent = null; - if (StringUtils.isNotEmpty(appGroup)) { + if (isNotEmpty(appGroup)) { - appConfigContent = dynamicConfiguration.getConfigs + appConfigContent = dynamicConfiguration.getProperties - (StringUtils.isNotEmpty(configCenter.getAppConfigFile()) ? configCenter.getAppConfigFile() : configCenter.getConfigFile(), + (isNotEmpty(configCenter.getAppConfigFile()) ? configCenter.getAppConfigFile() : configCenter.getConfigFile(), appGroup ); } diff --cc dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java index 51e7013,84b6ec3..a1dda52 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java @@@ -117,11 -128,26 +117,25 @@@ public interface DynamicConfiguration e } /** - * {@see #getConfig(String, String, long)} - * <p> * This method are mostly used to get a compound config file, such as a complete dubbo.properties file. + * Also {@see #getConfig(String, String, long)} */ - String getConfigs(String key, String group, long timeout) throws IllegalStateException; + String getProperties(String key, String group, long timeout) throws IllegalStateException; + + /** + * Publish Config mapped to the given key under the {@link #DEFAULT_GROUP default group} + * + * @param key the key to represent a configuration + * @param content the content of configuration + * @return <code>true</code> if success, or <code>false</code> + * @throws UnsupportedOperationException If the under layer does not support + * @since 2.7.4 + */ + default boolean publishConfig(String key, String content) throws UnsupportedOperationException { + return publishConfig(key, DEFAULT_GROUP, content); + } + /** * Publish Config mapped to the given key and the given group. * @@@ -170,12 -232,23 +220,23 @@@ * @throws IllegalStateException If timeout exceeds * @since 2.7.4 */ - default SortedMap<String, String> getConfigs(String group, long timeout) throws UnsupportedOperationException, + default Map<String, String> getConfigs(String group, long timeout) throws UnsupportedOperationException, IllegalStateException { - SortedMap<String, String> configs = new TreeMap<>(); - SortedSet<String> configKeys = getConfigKeys(group); + Map<String, String> configs = new LinkedHashMap<>(); + Set<String> configKeys = getConfigKeys(group); - configKeys.forEach(key -> configs.put(key, getConfig(key, group, timeout))); + configKeys.forEach(key -> configs.put(key, getString(key))); - return Collections.unmodifiableSortedMap(configs); + return Collections.unmodifiableMap(configs); + } + + /** + * Close the configuration + * + * @throws Exception + * @since 2.7.4 + */ + @Override + default void close() throws Exception { + throw new UnsupportedOperationException(); } /** @@@ -190,12 -263,16 +251,25 @@@ .getDynamicConfiguration(null)); } + /** + * Get the instance of {@link DynamicConfiguration} by the specified connection {@link URL} + * + * @param connectionURL + * @return non-null + * @since 2.7.4 + */ + static DynamicConfiguration getDynamicConfiguration(URL connectionURL) { + String protocol = connectionURL.getProtocol(); + DynamicConfigurationFactory factory = getDynamicConfigurationFactory(protocol); + return factory.getDynamicConfiguration(connectionURL); + } ++ + /** + * The format is '{interfaceName}:[version]:[group]' + * + * @return + */ + static String getRuleKey(URL url) { + return url.getColonSeparatedKey(); + } } diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryConfig.java index abcc062,a5196df..de0a884 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryConfig.java @@@ -179,14 -180,14 +180,15 @@@ public class RegistryConfig extends Abs public void setAddress(String address) { this.address = address; if (address != null) { - int i = address.indexOf("://"); - if (i > 0) { - this.updateIdIfAbsent(address.substring(0, i)); - this.updateProtocolIfAbsent(address.substring(0, i)); - int port = address.lastIndexOf(":"); - if (port > 0) { - this.updatePortIfAbsent(StringUtils.parseInteger(address.substring(port + 1))); - } + try { + URL url = URL.valueOf(address); ++ this.updateIdIfAbsent(url.getProtocol()); ++ this.updateProtocolIfAbsent(url.getProtocol()); ++ this.updatePortIfAbsent(url.getPort()); + setUsername(url.getUsername()); + setPassword(url.getPassword()); - setProtocol(url.getProtocol()); - setPort(url.getPort()); + setParameters(url.getParameters()); + } catch (Exception ignored) { } } } diff --cc dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java index 20253bd,6bcafcd..468c5cb --- a/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java +++ b/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java @@@ -46,9 -46,9 +46,7 @@@ import static com.alibaba.nacos.api.Pro import static com.alibaba.nacos.api.PropertyKeyConst.SECRET_KEY; import static com.alibaba.nacos.api.PropertyKeyConst.SERVER_ADDR; import static com.alibaba.nacos.client.naming.utils.UtilAndComs.NACOS_NAMING_LOG_NAME; --import static org.apache.dubbo.common.config.configcenter.Constants.CONFIG_NAMESPACE_KEY; import static org.apache.dubbo.common.constants.CommonConstants.GROUP_CHAR_SEPERATOR; --import static org.apache.dubbo.common.constants.CommonConstants.PROPERTIES_CHAR_SEPERATOR; import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY; /**
