unify metadata and configcenter implementations (#4360)

* Polish apache/incubator-dubbo/#4096 : To add new module for Dubbo Event

* Polish apache/incubator-dubbo#3942 : Dubbo Cloud Native: To Add Service registration and discovery abstract

* Polish apache/incubator-dubbo#3946 : Dubbo Cloud Native : To Add Dubbo metadata service

* Polish apache/incubator-dubbo#4093 : To add exported and unexported events for ServiceConfig

* Polish apache/incubator-dubbo#3984 : Add Service registration and discovery implementation for Zookeeper

* Polish apache/incubator-dubbo#4104 : To add initialized and destroyed events for ReferenceConfig

* Polish apache/incubator-dubbo#3946 : Refactor Dubbo metadata service

* Polish apache/incubator-dubbo#3946 : To Add MetadataServiceExporter into dubbo-config-api

* Update ${project.parent.version}

* Polish apache/incubator-dubbo#3946 : Refactor Dubbo metadata service

* Polish apache/incubator-dubbo/#4096 : Remove the duplicated word

* Polish apache/incubator-dubbo#4119 : DynamicConfiguration adds the publish and multiple get configuration methods

* Polish apache/incubator-dubbo#4120 : To add DynamicConfiguration implementation for Zookeeper

* Polish apache/incubator-dubbo#4121 : Add the mapping from service metadata to service name

* Polish apache/incubator-dubbo/#3790 : Dependencies with no license

* Polish apache/incubator-dubbo#4071 : @Reference can't match the local @Service beans

* Update version to be 2.7.3

* Polish apache/incubator-dubbo#3946 : Add thread-safe and performance optimization

* Polish apache/incubator-dubbo#3946 : Add thread-safe and performance optimization

* Polish apache/incubator-dubbo#3946 : Add thread-safe and performance optimization

* Update 2.7.3

* Polish apache/incubator-dubbo#4104 : To add more events for dubbo-config-api

* Polish apache/incubator-dubbo#3942 : Dubbo Cloud Native: To Add Service registration and discovery abstract

* Polish apache/incubator-dubbo#3984 : Add Service registration and discovery implementation for Zookeeper

* Add Bootstrap

* Polish GA

* Polish apache/incubator-dubbo#4050 : Dubbo Cloud Native : Add a mechanism to upgrade Dubbo services smoothly

* Polish apache/incubator-dubbo#4093 : To add DubboServiceDestroyedEvent

* Polish apache/incubator-dubbo#4050 : Dubbo Cloud Native : Reactor

* Polish apache/incubator-dubbo#3946 : Remove SPI

* Polish apache/incubator-dubbo#4265 : [Feature] Dubbo Cloud Native - Add Bootstrap

* Polish apache/incubator-dubbo#4265 : [Feature] Dubbo Cloud Native - Add Bootstrap

* Polish apache/dubbo#4265 : Add test dependencies

* Polish /apache/dubbo#3942 : Refactor implementation

* Polish apache/incubator-dubbo#3984 : Refactor

* Add Nacos implementation

* Polish apache/incubator-dubbo#3984 : Add Nacos implementation

* Polish apache/incubator-dubbo#4268 : Dubbo Event - To support Generic event type handle

* Polish apache/incubator-dubbo#4268 : Update JavaDoc

* Polish apache/incubator-dubbo#4268 : Add GenericEventListener implementation

* add cache for MetadataServiceProxy

* support multiple metadata and configcenter

* unify metadata implementation

* add missed files

* remove duplicated files

* add new SPIs and modules to dubbo-all pom.
This commit is contained in:
ken.lj 2019-06-26 17:09:21 +08:00 committed by Mercy Ma
parent 5fb8dc07a8
commit 5008e0f2ac
218 changed files with 1861 additions and 1383 deletions

View File

@ -408,13 +408,6 @@
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter-api</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter-zookeeper</artifactId>
@ -466,7 +459,7 @@
<!-- metadata -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-metadata-report-api</artifactId>
<artifactId>dubbo-metadata-api</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
<optional>true</optional>
@ -516,14 +509,6 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-metadata</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<!-- Transitive dependencies -->
<dependency>
<groupId>org.springframework</groupId>
@ -640,15 +625,13 @@
<include>org.apache.dubbo:dubbo-serialization-protostuff</include>
<include>org.apache.dubbo:dubbo-serialization-gson</include>
<include>org.apache.dubbo:dubbo-serialization-googlePb</include>
<include>org.apache.dubbo:dubbo-configcenter-api</include>
<include>org.apache.dubbo:dubbo-configcenter-definition</include>
<include>org.apache.dubbo:dubbo-configcenter-apollo</include>
<include>org.apache.dubbo:dubbo-configcenter-zookeeper</include>
<include>org.apache.dubbo:dubbo-configcenter-consul</include>
<include>org.apache.dubbo:dubbo-configcenter-etcd</include>
<include>org.apache.dubbo:dubbo-configcenter-nacos</include>
<include>org.apache.dubbo:dubbo-metadata-report-api</include>
<include>org.apache.dubbo:dubbo-metadata-definition</include>
<include>org.apache.dubbo:dubbo-metadata-api</include>
<include>org.apache.dubbo:dubbo-metadata-report-redis</include>
<include>org.apache.dubbo:dubbo-metadata-report-zookeeper</include>
<include>org.apache.dubbo:dubbo-metadata-report-consul</include>
@ -656,10 +639,7 @@
<include>org.apache.dubbo:dubbo-metadata-report-nacos</include>
<include>org.apache.dubbo:dubbo-serialization-native-hession</include>
<include>org.apache.dubbo:dubbo-rpc-native-thrift</include>
<!-- 2.7.3 new modules -->
<include>org.apache.dubbo:dubbo-event</include>
<include>org.apache.dubbo:dubbo-metadata</include>
</includes>
</artifactSet>
<transformers>
@ -778,11 +758,11 @@
</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/dubbo/internal/org.apache.dubbo.configcenter.DynamicConfigurationFactory
<resource>META-INF/dubbo/internal/org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory
</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/dubbo/internal/org.apache.dubbo.metadata.store.MetadataReportFactory
<resource>META-INF/dubbo/internal/org.apache.dubbo.metadata.report.MetadataReportFactory
</resource>
</transformer>
<!-- @since 2.7.3 -->
@ -795,7 +775,19 @@
</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/dubbo/internal/org.apache.dubbo.metadata.LocalMetadataService
<resource>META-INF/dubbo/internal/org.apache.dubbo.metadata.WritableMetadataService
</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping
</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.MetadataServiceProxyFactory
</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscoveryFactory
</resource>
</transformer>
</transformers>

View File

@ -362,11 +362,22 @@
<artifactId>dubbo-compatible</artifactId>
<version>${project.version}</version>
</dependency>
<!-- metadata -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-metadata-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-metadata-report-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-metadata-definition</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-metadata-report-zookeeper</artifactId>
@ -392,11 +403,8 @@
<artifactId>dubbo-metadata-report-nacos</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- config-center -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter-zookeeper</artifactId>
@ -422,11 +430,6 @@
<artifactId>dubbo-configcenter-nacos</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-metadata-definition</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

View File

@ -34,6 +34,13 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-metadata-report-zookeeper</artifactId>
<version>${project.parent.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter-zookeeper</artifactId>
@ -83,12 +90,6 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -17,19 +17,32 @@
package org.apache.dubbo.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.constants.CommonConstants;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.config.AbstractConfig;
import org.apache.dubbo.config.AbstractInterfaceConfig;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ConfigCenterConfig;
import org.apache.dubbo.config.ConsumerConfig;
import org.apache.dubbo.config.DubboShutdownHook;
import org.apache.dubbo.config.MetadataReportConfig;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.ProviderConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;
import org.apache.dubbo.config.builders.AbstractBuilder;
import org.apache.dubbo.config.builders.ApplicationBuilder;
import org.apache.dubbo.config.builders.ConsumerBuilder;
import org.apache.dubbo.config.builders.ProtocolBuilder;
import org.apache.dubbo.config.builders.ProviderBuilder;
import org.apache.dubbo.config.builders.ReferenceBuilder;
import org.apache.dubbo.config.builders.RegistryBuilder;
import org.apache.dubbo.config.builders.ServiceBuilder;
@ -37,16 +50,19 @@ import org.apache.dubbo.config.context.ConfigManager;
import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter;
import org.apache.dubbo.event.EventDispatcher;
import org.apache.dubbo.event.EventListener;
import org.apache.dubbo.metadata.MetadataServiceExporter;
import org.apache.dubbo.metadata.WritableMetadataService;
import org.apache.dubbo.metadata.store.RemoteWritableMetadataService;
import org.apache.dubbo.registry.client.DefaultServiceInstance;
import org.apache.dubbo.registry.client.ServiceDiscovery;
import org.apache.dubbo.registry.client.ServiceInstance;
import org.apache.dubbo.registry.support.ServiceOrientedRegistry;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Condition;
@ -55,12 +71,9 @@ import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import static java.util.Collections.emptyMap;
import static java.util.concurrent.Executors.newSingleThreadExecutor;
import static org.apache.dubbo.common.config.ConfigurationUtils.parseProperties;
import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
import static org.apache.dubbo.common.utils.StringUtils.isBlank;
import static org.apache.dubbo.common.utils.StringUtils.split;
import static org.apache.dubbo.common.utils.StringUtils.trim;
import static org.apache.dubbo.registry.support.AbstractRegistryFactory.getRegistries;
/**
@ -82,8 +95,6 @@ public class DubboBootstrap {
private final Logger logger = LoggerFactory.getLogger(getClass());
private final MetadataServiceExporter metadataServiceExporter = new ConfigurableMetadataServiceExporter();
private final AtomicBoolean awaited = new AtomicBoolean(false);
private final Lock lock = new ReentrantLock();
@ -112,6 +123,10 @@ public class DubboBootstrap {
private ApplicationBuilder applicationBuilder;
private ConsumerBuilder consumerBuilder;
private ProviderBuilder providerBuilder;
private Map<String, RegistryBuilder> registryBuilders = new HashMap<>();
private Map<String, ProtocolBuilder> protocolBuilders = new HashMap<>();
@ -120,57 +135,8 @@ public class DubboBootstrap {
private Map<String, ReferenceBuilder<?>> referenceBuilders = new HashMap<>();
/**
* The global {@link ApplicationConfig}
*/
private ApplicationConfig applicationConfig;
/**
* the global {@link RegistryConfig registries}
*/
private Map<String, RegistryConfig> registryConfigs = emptyMap();
/**
* the global {@link RegistryConfig registries}
*/
private Map<String, ProtocolConfig> protocolConfigs = emptyMap();
/**
* the global {@link ServiceConfig services}
*/
private Map<String, ServiceConfig<?>> serviceConfigs = emptyMap();
/**
* the global {@link ReferenceConfig references}
*/
private Map<String, ReferenceConfig<?>> referenceConfigs = new HashMap<>();
public ApplicationSettings application(String name) {
return new ApplicationSettings(initApplicationBuilder(name), this);
}
public RegistrySettings registry() {
return registry(DEFAULT_REGISTRY_ID);
}
public RegistrySettings registry(String id) {
return new RegistrySettings(initRegistryBuilder(id), this);
}
public ProtocolSettings protocol() {
return protocol(DEFAULT_PROTOCOL_ID);
}
public ProtocolSettings protocol(String id) {
return new ProtocolSettings(initProtocolBuilder(id), this);
}
public <S> ServiceSettings<S> service(String id) {
return new ServiceSettings(initServiceBuilder(id), this);
}
public <S> ReferenceSettings<S> reference(String id) {
return new ReferenceSettings<>(initReferenceBuilder(id), this);
public DubboBootstrap() {
DubboShutdownHook.getDubboShutdownHook().register();
}
/**
@ -184,6 +150,73 @@ public class DubboBootstrap {
return this;
}
/* accept Config instance */
public DubboBootstrap application(ApplicationConfig applicationConfig) {
ConfigManager.getInstance().setApplication(applicationConfig);
return this;
}
public DubboBootstrap configCenter(ConfigCenterConfig configCenterConfig) {
ConfigManager.getInstance().addConfigCenter(configCenterConfig);
return this;
}
public DubboBootstrap configCenter(List<ConfigCenterConfig> configCenterConfigs) {
ConfigManager.getInstance().addConfigCenter(configCenterConfigs);
return this;
}
public DubboBootstrap metadataReport(MetadataReportConfig metadataReportConfig) {
ConfigManager.getInstance().addMetadataReport(metadataReportConfig);
return this;
}
public DubboBootstrap metadataReport(List<MetadataReportConfig> metadataReportConfigs) {
ConfigManager.getInstance().addMetadataReport(metadataReportConfigs);
return this;
}
public DubboBootstrap registry(RegistryConfig registryConfig) {
ConfigManager.getInstance().addRegistry(registryConfig, true);
return this;
}
public DubboBootstrap registry(List<RegistryConfig> registryConfigs) {
ConfigManager.getInstance().addRegistries(registryConfigs, true);
return this;
}
public DubboBootstrap protocol(ProtocolConfig protocolConfig) {
ConfigManager.getInstance().addProtocol(protocolConfig, true);
return this;
}
public DubboBootstrap protocols(List<ProtocolConfig> protocolConfigs) {
ConfigManager.getInstance().addProtocols(protocolConfigs, true);
return this;
}
public DubboBootstrap consumer(ConsumerConfig consumerConfig) {
ConfigManager.getInstance().addConsumer(consumerConfig);
return this;
}
public DubboBootstrap provider(ProviderConfig providerConfig) {
ConfigManager.getInstance().addProvider(providerConfig);
return this;
}
public DubboBootstrap service(ServiceConfig<?> serviceConfig) {
ConfigManager.getInstance().addService(serviceConfig);
return this;
}
public DubboBootstrap reference(ReferenceConfig<?> referenceConfig) {
ConfigManager.getInstance().addReference(referenceConfig);
return this;
}
/* accept builder functional interface */
public DubboBootstrap application(String name, Consumer<ApplicationBuilder> builder) {
initApplicationBuilder(name);
builder.accept(applicationBuilder);
@ -219,18 +252,31 @@ public class DubboBootstrap {
return;
}
initApplicationConfig();
buildApplicationConfig();
initRegistryConfigs();
buildRegistryConfigs();
initProtocolConfigs();
buildProtocolConfigs();
initServiceConfigs();
buildServiceConfigs();
initReferenceConfigs();
buildReferenceConfigs();
clearBuilders();
startConfigCenter();
startMetadataReport();
loadRemoteConfigs();
useRegistryAsConfigCenterIfNecessary();
// checkApplication();
// checkProvider();
// chcckConsumer();
// checkRegistry();
// checkProtocol();
// checkMonitor();
initialized = true;
if (logger.isInfoEnabled()) {
@ -238,26 +284,67 @@ public class DubboBootstrap {
}
}
/**
* Get the {@link ServiceConfig} by specified id
*
* @param id The {@link ServiceConfig#getId() id} of {@link ServiceConfig}
* @param <S> the type of service interface
* @return <code>null</code> if not found
*/
public <S> ServiceConfig<S> serviceConfig(String id) {
return (ServiceConfig<S>) serviceConfigs.get(id);
private void loadRemoteConfigs() {
ConfigManager configManager = ConfigManager.getInstance();
// registry ids to registry configs
List<RegistryConfig> tmpRegistries = new ArrayList<>();
Set<String> registryIds = configManager.getRegistryIds();
registryIds.forEach(id -> {
if (tmpRegistries.stream().noneMatch(reg -> reg.getId().equals(id))) {
tmpRegistries.add(configManager.getRegistry(id).orElseGet(() -> {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setId(id);
registryConfig.refresh();
return registryConfig;
}));
}
});
configManager.addRegistries(tmpRegistries, true);
// protocol ids to protocol configs
List<ProtocolConfig> tmpProtocols = new ArrayList<>();
Set<String> protocolIds = configManager.getProtocolIds();
protocolIds.forEach(id -> {
if (tmpProtocols.stream().noneMatch(prot -> prot.getId().equals(id))) {
tmpProtocols.add(configManager.getProtocol(id).orElseGet(() -> {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setId(id);
protocolConfig.refresh();
return protocolConfig;
}));
}
});
configManager.addProtocols(tmpProtocols, true);
}
/**
* Get the {@link ReferenceConfig} by specified id
*
* @param id The {@link ReferenceConfig#getId() id} of {@link ReferenceConfig}
* @param <S> the type of service interface
* @return <code>null</code> if not found
* For compatibility purpose, use registry as the default config center when the registry protocol is zookeeper and
* there's no config center specified explicitly.
*/
public <S> ReferenceConfig<S> referenceConfig(String id) {
return (ReferenceConfig<S>) referenceConfigs.get(id);
private void useRegistryAsConfigCenterIfNecessary() {
ConfigManager configManager = ConfigManager.getInstance();
configManager.getDefaultRegistries().ifPresent(registryConfigs -> {
for (RegistryConfig registryConfig : registryConfigs) {
if (registryConfig != null && registryConfig.isZookeeperProtocol()) {
// 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.setProtocol(registryConfig.getProtocol());
cc.setAddress(registryConfig.getAddress());
cc.setHighestPriority(false);
configManager.addConfigCenter(cc);
}
return null;
});
}
}
startConfigCenter();
});
}
private List<ServiceDiscovery> getServiceDiscoveries() {
@ -282,11 +369,17 @@ public class DubboBootstrap {
exportServices();
// Not only provider register and some services are exported
if (!onlyRegisterProvider && !serviceConfigs.isEmpty()) {
if (!onlyRegisterProvider && !ConfigManager.getInstance().getServiceConfigs().isEmpty()) {
/**
* export {@link MetadataService}
*/
List<URL> exportedURLs = exportMetadataService(applicationConfig, registryConfigs, protocolConfigs);
ConfigManager configManager = ConfigManager.getInstance();
// TODO, only export to default registry?
List<URL> exportedURLs = exportMetadataService (
configManager.getApplication().orElseThrow(() -> new IllegalStateException("ApplicationConfig cannot be null")),
configManager.getDefaultRegistries().orElseThrow(() -> new IllegalStateException("No default RegistryConfig")),
configManager.getDefaultProtocols().orElseThrow(() -> new IllegalStateException("No default ProtocolConfig"))
);
/**
* Register the local {@link ServiceInstance}
@ -357,6 +450,7 @@ public class DubboBootstrap {
return started;
}
/* serve for builder apis, begin */
private ApplicationBuilder initApplicationBuilder(String name) {
applicationBuilder = new ApplicationBuilder().name(name);
return applicationBuilder;
@ -394,21 +488,76 @@ public class DubboBootstrap {
return referenceBuilders.computeIfAbsent(id, this::createReferenceBuilder);
}
private void initApplicationConfig() {
this.applicationConfig = buildApplicationConfig();
/* serve for builder apis, end */
private void startMetadataReport() {
ApplicationConfig applicationConfig = ConfigManager.getInstance().getApplication().orElseThrow(() -> new IllegalStateException("There's no ApplicationConfig specified."));
// FIXME, multiple metadata config support.
Set<MetadataReportConfig> metadataReportConfigs = ConfigManager.getInstance().getMetadataConfigs();
if (CollectionUtils.isEmpty(metadataReportConfigs)) {
if (CommonConstants.METADATA_REMOTE.equals(applicationConfig.getMetadata())) {
throw new IllegalStateException("No MetadataConfig found, you must specify the remote Metadata Center address when set 'metadata=remote'.");
}
return;
}
MetadataReportConfig metadataReportConfig = metadataReportConfigs.iterator().next();
if (!metadataReportConfig.isValid()) {
return;
}
RemoteWritableMetadataService remoteMetadataService =
(RemoteWritableMetadataService) WritableMetadataService.getExtension(applicationConfig.getMetadata());
remoteMetadataService.initMetadataReport(metadataReportConfig.toUrl());
}
private void initRegistryConfigs() {
this.registryConfigs = buildRegistryConfigs();
private void startConfigCenter() {
Set<ConfigCenterConfig> configCenters = ConfigManager.getInstance().getConfigCenters();
if (CollectionUtils.isNotEmpty(configCenters)) {
CompositeDynamicConfiguration compositeDynamicConfiguration = new CompositeDynamicConfiguration();
for (ConfigCenterConfig configCenter : configCenters) {
configCenter.refresh();
compositeDynamicConfiguration.addConfiguration(prepareEnvironment(configCenter));
}
Environment.getInstance().setDynamicConfiguration(compositeDynamicConfiguration);
}
ConfigManager.getInstance().refreshAll();
}
private void initProtocolConfigs() {
this.protocolConfigs = buildProtocolConfigs();
private DynamicConfiguration prepareEnvironment(ConfigCenterConfig configCenter) {
if (configCenter.isValid()) {
if (!configCenter.checkOrUpdateInited()) {
return null;
}
DynamicConfiguration dynamicConfiguration = getDynamicConfiguration(configCenter.toUrl());
String configContent = dynamicConfiguration.getConfigs(configCenter.getConfigFile(), configCenter.getGroup());
String appGroup = ConfigManager.getInstance().getApplication().orElse(new ApplicationConfig()).getName();
String appConfigContent = null;
if (StringUtils.isNotEmpty(appGroup)) {
appConfigContent = dynamicConfiguration.getConfigs
(StringUtils.isNotEmpty(configCenter.getAppConfigFile()) ? configCenter.getAppConfigFile() : configCenter.getConfigFile(),
appGroup
);
}
try {
Environment.getInstance().setConfigCenterFirst(configCenter.isHighestPriority());
Environment.getInstance().updateExternalConfigurationMap(parseProperties(configContent));
Environment.getInstance().updateAppExternalConfigurationMap(parseProperties(appConfigContent));
} catch (IOException e) {
throw new IllegalStateException("Failed to parse configurations from Config Center.", e);
}
return dynamicConfiguration;
}
return null;
}
private void initReferenceConfigs() {
this.referenceConfigs = buildReferenceConfigs();
this.referenceConfigs.values().forEach(this::initReferenceConfig);
private DynamicConfiguration getDynamicConfiguration(URL url) {
DynamicConfigurationFactory factory = ExtensionLoader
.getExtensionLoader(DynamicConfigurationFactory.class)
.getExtension(url.getProtocol());
return factory.getDynamicConfiguration(url);
}
/**
@ -422,103 +571,49 @@ public class DubboBootstrap {
return this;
}
private void initServiceConfigs() {
this.serviceConfigs = buildServiceConfigs();
this.serviceConfigs.values().forEach(this::initServiceConfig);
}
private List<URL> exportMetadataService(ApplicationConfig applicationConfig,
Map<String, RegistryConfig> globalRegistryConfigs,
Map<String, ProtocolConfig> globalProtocolConfigs) {
List<RegistryConfig> globalRegistryConfigs,
List<ProtocolConfig> globalProtocolConfigs) {
ConfigurableMetadataServiceExporter exporter = new ConfigurableMetadataServiceExporter();
exporter.setApplicationConfig(applicationConfig);
exporter.setRegistries(globalRegistryConfigs.values());
exporter.setProtocols(globalProtocolConfigs.values());
exporter.setRegistries(globalRegistryConfigs);
exporter.setProtocols(globalProtocolConfigs);
return exporter.export();
}
private ApplicationConfig buildApplicationConfig() {
return applicationBuilder.build();
private void buildApplicationConfig() {
ApplicationConfig applicationConfig = null;
if (applicationBuilder != null) {
applicationConfig = applicationBuilder.build();
}
ConfigManager.getInstance().setApplication(applicationConfig);
}
private Map<String, ProtocolConfig> buildProtocolConfigs() {
return buildConfigs(protocolBuilders);
private void buildProtocolConfigs() {
List<ProtocolConfig> protocolConfigs = buildConfigs(protocolBuilders);
ConfigManager.getInstance().addProtocols(protocolConfigs, true);
}
private Map<String, RegistryConfig> buildRegistryConfigs() {
return buildConfigs(registryBuilders);
private void buildRegistryConfigs() {
List<RegistryConfig> registryConfigs = buildConfigs(registryBuilders);
ConfigManager.getInstance().addRegistries(registryConfigs, true);
}
private Map<String, ServiceConfig<?>> buildServiceConfigs() {
return buildConfigs(serviceBuilders);
private void buildServiceConfigs() {
List<ServiceConfig<?>> serviceConfigs = buildConfigs(serviceBuilders);
serviceConfigs.forEach(ConfigManager.getInstance()::addService);
}
private Map<String, ReferenceConfig<?>> buildReferenceConfigs() {
return buildConfigs(referenceBuilders);
private void buildReferenceConfigs() {
List<ReferenceConfig<?>> referenceConfigs = buildConfigs(referenceBuilders);
referenceConfigs.forEach(ConfigManager.getInstance()::addReference);
}
private void exportServices() {
serviceConfigs.values().forEach(this::exportServiceConfig);
ConfigManager.getInstance().getServiceConfigs().forEach(this::exportServiceConfig);
}
private void initServiceConfig(ServiceConfig<?> serviceConfig) {
initConfig(serviceConfig);
initProtocols(serviceConfig);
}
private void initReferenceConfig(ReferenceConfig<?> referenceConfig) {
initConfig(referenceConfig);
}
private void initConfig(AbstractInterfaceConfig config) {
initApplication(config);
initRegistries(config);
}
private void initApplication(AbstractInterfaceConfig config) {
if (config.getApplication() == null) {
config.setApplication(applicationConfig);
}
}
private void initRegistries(AbstractInterfaceConfig config) {
List<RegistryConfig> registries = config.getRegistries();
if (CollectionUtils.isEmpty(registries)) { // If no registry present
registries = new LinkedList<>();
String registerIds = config.getRegistryIds();
if (!isBlank(registerIds)) {
for (String id : split(registerIds, ',')) {
RegistryConfig registryConfig = registryConfigs.get(trim(id));
registries.add(registryConfig);
}
}
if (registries.isEmpty()) { // If empty, add all global registries
registries.addAll(registryConfigs.values());
}
config.setRegistries(registries);
}
}
private void initProtocols(ServiceConfig<?> serviceConfig) {
List<ProtocolConfig> protocols = serviceConfig.getProtocols();
if (CollectionUtils.isEmpty(protocols)) { // If no protocols present
protocols = new LinkedList<>();
String protocolIds = serviceConfig.getProtocolIds();
if (!isBlank(protocolIds)) {
for (String id : split(protocolIds, ',')) {
ProtocolConfig protocol = protocolConfigs.get(trim(id));
protocols.add(protocol);
}
}
if (protocols.isEmpty()) { // If empty, add all global protocols
protocols.addAll(protocolConfigs.values());
}
serviceConfig.setProtocols(protocols);
}
}
private void exportServiceConfig(ServiceConfig<?> serviceConfig) {
public void exportServiceConfig(ServiceConfig<?> serviceConfig) {
serviceConfig.export();
}
@ -563,14 +658,14 @@ public class DubboBootstrap {
}
private void destroyProtocolConfigs() {
protocolConfigs.values().forEach(ProtocolConfig::destroy);
ConfigManager.getInstance().getProtocols().values().forEach(ProtocolConfig::destroy);
if (logger.isDebugEnabled()) {
logger.debug(NAME + "'s all ProtocolConfigs have been destroyed.");
}
}
private void destroyReferenceConfigs() {
referenceConfigs.values().forEach(ReferenceConfig::destroy);
ConfigManager.getInstance().getReferenceConfigs().forEach(ReferenceConfig::destroy);
if (logger.isDebugEnabled()) {
logger.debug(NAME + "'s all ReferenceConfigs have been destroyed.");
}
@ -586,11 +681,7 @@ public class DubboBootstrap {
}
private void clearConfigs() {
this.applicationConfig = null;
this.registryConfigs.clear();
this.protocolConfigs.clear();
this.serviceConfigs.clear();
this.referenceConfigs.clear();
ConfigManager.getInstance().clear();
if (logger.isDebugEnabled()) {
logger.debug(NAME + "'s configs have been clear.");
}
@ -634,10 +725,10 @@ public class DubboBootstrap {
}
}
private static <C extends AbstractConfig, B extends AbstractBuilder> Map<String, C> buildConfigs(Map<String, B> map) {
Map<String, C> configs = new HashMap<>();
private static <C extends AbstractConfig, B extends AbstractBuilder> List<C> buildConfigs(Map<String, B> map) {
List<C> configs = new ArrayList<>();
map.entrySet().forEach(entry -> {
configs.put(entry.getKey(), (C) entry.getValue().build());
configs.add((C) entry.getValue().build());
});
return configs;
}

View File

@ -16,11 +16,11 @@
*/
package org.apache.dubbo.bootstrap;
import org.apache.dubbo.common.utils.NetUtils;
import org.apache.dubbo.config.builders.ApplicationBuilder;
import org.apache.dubbo.config.builders.ProtocolBuilder;
import org.apache.dubbo.config.builders.RegistryBuilder;
import org.apache.dubbo.config.builders.ServiceBuilder;
import org.apache.curator.test.TestingServer;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import java.io.IOException;
@ -32,65 +32,17 @@ import java.io.IOException;
*/
public class DubboBootstrapTest {
private static int zkServerPort = NetUtils.getAvailablePort();
private static TestingServer zkServer;
@BeforeAll
public static void init() throws Exception {
zkServer = new TestingServer(zkServerPort, true);
}
@AfterAll
public static void destroy() throws IOException {
zkServer.stop();
zkServer.close();
}
@Test
public void testProviderInFluentAPI() {
public void test() throws IOException {
new DubboBootstrap()
.application("dubbo-provider-demo")
.next()
.registry()
.address("zookeeper://127.0.0.1:" + zkServerPort + "?registry-type=service")
.next()
.protocol()
.name("dubbo")
.port(-1)
.next()
.service("test")
.interfaceClass(EchoService.class)
.ref(new EchoServiceImpl())
.group("DEFAULT")
.version("1.0.0")
.next()
.application(ApplicationBuilder.newBuilder().name("dubbo-provider-demo").build())
.registry(RegistryBuilder.newBuilder().address("zookeeper://127.0.0.1:2181?registry-type=service&metadata=remote").build())
.protocol(ProtocolBuilder.newBuilder().port(-1).name("dubbo").build())
.service(ServiceBuilder.newBuilder().id("test").interfaceClass(EchoService.class).ref(new EchoServiceImpl()).build())
.start()
.stop();
.await();
}
@Test
public void testProviderInLambda() {
new DubboBootstrap()
.application("dubbo-provider-demo", builder -> {
})
.registry("default", builder ->
builder.address("zookeeper://127.0.0.1:" + zkServerPort + "?registry-type=service")
)
.protocol("defalt", builder ->
builder.name("dubbo")
.port(-1)
)
.service("test", builder ->
builder.interfaceClass(EchoService.class)
.ref(new EchoServiceImpl())
.group("DEFAULT")
.version("1.0.0")
)
.start()
.stop();
System.in.read();
}
}

View File

@ -16,10 +16,9 @@
*/
package org.apache.dubbo.bootstrap;
import org.apache.dubbo.config.ReferenceConfig;
import static org.apache.dubbo.bootstrap.EchoService.GROUP;
import static org.apache.dubbo.bootstrap.EchoService.VERSION;
import org.apache.dubbo.config.builders.ApplicationBuilder;
import org.apache.dubbo.config.builders.ReferenceBuilder;
import org.apache.dubbo.config.builders.RegistryBuilder;
/**
* Dubbo Provider Bootstrap
@ -31,28 +30,22 @@ public class DubboServiceConsumerBootstrap {
public static void main(String[] args) throws Exception {
DubboBootstrap bootstrap = new DubboBootstrap()
.application("dubbo-consumer-demo")
.next()
.registry()
.address("nacos://127.0.0.1:8848?registry-type=service&subscribed-services=dubbo-provider-demo")
.next()
.reference("ref")
.interfaceClass(EchoService.class)
.group(GROUP)
.version(VERSION)
.next()
.application(ApplicationBuilder.newBuilder().name("dubbo-consumer-demo").build())
.registry(RegistryBuilder.newBuilder().address("zookeeper://127.0.0.1:2181?registry-type=service&subscribed-services=dubbo-provider-demo&metadata=remote").build())
.reference(ReferenceBuilder.newBuilder().id("ref").interfaceClass(EchoService.class).build())
.onlyRegisterProvider(true)
.start()
.await();
ReferenceConfig<EchoService> referenceConfig = bootstrap.referenceConfig("ref");
EchoService echoService = referenceConfig.get();
for (int i = 0; i < 500; i++) {
Thread.sleep(2000L);
System.out.println(echoService.echo("Hello,World"));
}
// TODO,
// ReferenceConfig<EchoService> referenceConfig = ReferenceConfigCache.getCache().get(EchoService.class.getName(), EchoService.class);
//
// EchoService echoService = referenceConfig.get();
//
// for (int i = 0; i < 500; i++) {
// Thread.sleep(2000L);
// System.out.println(echoService.echo("Hello,World"));
// }
}
}

View File

@ -16,10 +16,13 @@
*/
package org.apache.dubbo.bootstrap;
import java.io.IOException;
import org.apache.dubbo.config.builders.ApplicationBuilder;
import org.apache.dubbo.config.builders.MetadataReportBuilder;
import org.apache.dubbo.config.builders.ProtocolBuilder;
import org.apache.dubbo.config.builders.RegistryBuilder;
import org.apache.dubbo.config.builders.ServiceBuilder;
import static org.apache.dubbo.bootstrap.EchoService.GROUP;
import static org.apache.dubbo.bootstrap.EchoService.VERSION;
import java.io.IOException;
/**
* Dubbo Provider Bootstrap
@ -31,21 +34,12 @@ public class DubboServiceProviderBootstrap {
public static void main(String[] args) throws IOException {
new DubboBootstrap()
.application("dubbo-provider-demo")
.next()
.registry()
.address("nacos://127.0.0.1:8848?registry-type=service")
.next()
.protocol()
.name("dubbo")
.port(-1)
.next()
.service("test")
.interfaceClass(EchoService.class)
.ref(new EchoServiceImpl())
.group(GROUP)
.version(VERSION)
.next()
.application(ApplicationBuilder.newBuilder().name("dubbo-provider-demo").metadata("remote").build())
.metadataReport(MetadataReportBuilder.newBuilder().address("zookeeper://127.0.0.1:2181").build())
// .application(ApplicationBuilder.newBuilder().name("dubbo-provider-demo").build())
.registry(RegistryBuilder.newBuilder().address("zookeeper://127.0.0.1:2181?registry-type=service").build())
.protocol(ProtocolBuilder.newBuilder().port(-1).name("dubbo").build())
.service(ServiceBuilder.newBuilder().id("test").interfaceClass(EchoService.class).ref(new EchoServiceImpl()).build())
.start()
.await();
}

View File

@ -34,11 +34,6 @@
<artifactId>dubbo-rpc-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>

View File

@ -46,4 +46,6 @@ public interface Directory<T> extends Node {
*/
List<Invoker<T>> list(Invocation invocation) throws RpcException;
List<Invoker<T>> getAllInvokers();
}

View File

@ -61,6 +61,11 @@ public class StaticDirectory<T> extends AbstractDirectory<T> {
return invokers.get(0).getInterface();
}
@Override
public List<Invoker<T>> getAllInvokers() {
return invokers;
}
@Override
public boolean isAvailable() {
if (isDestroyed()) {

View File

@ -17,7 +17,7 @@
package org.apache.dubbo.rpc.cluster.router;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.rpc.cluster.Router;
public abstract class AbstractRouter implements Router {

View File

@ -17,8 +17,8 @@
package org.apache.dubbo.rpc.cluster.router.condition.config;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.configcenter.DynamicConfiguration;
/**
* Application level router, "application.condition-router"

View File

@ -17,8 +17,8 @@
package org.apache.dubbo.rpc.cluster.router.condition.config;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.rpc.cluster.Router;
import org.apache.dubbo.rpc.cluster.RouterFactory;

View File

@ -17,14 +17,14 @@
package org.apache.dubbo.rpc.cluster.router.condition.config;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.ConfigChangeEvent;
import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.configcenter.ConfigChangeEvent;
import org.apache.dubbo.configcenter.ConfigChangeType;
import org.apache.dubbo.configcenter.ConfigurationListener;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.RpcException;

View File

@ -17,7 +17,7 @@
package org.apache.dubbo.rpc.cluster.router.condition.config;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
/**
* Service level router, "server-unique-name.condition-router"

View File

@ -17,8 +17,8 @@
package org.apache.dubbo.rpc.cluster.router.condition.config;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.rpc.cluster.CacheableRouterFactory;
import org.apache.dubbo.rpc.cluster.Router;

View File

@ -17,16 +17,16 @@
package org.apache.dubbo.rpc.cluster.router.tag;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.ConfigChangeEvent;
import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.NetUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.configcenter.ConfigChangeEvent;
import org.apache.dubbo.configcenter.ConfigChangeType;
import org.apache.dubbo.configcenter.ConfigurationListener;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.RpcException;
@ -40,8 +40,8 @@ import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import static org.apache.dubbo.rpc.cluster.Constants.TAG_KEY;
import static org.apache.dubbo.rpc.Constants.FORCE_USE_TAG;
import static org.apache.dubbo.rpc.cluster.Constants.TAG_KEY;
/**
* TagRouter, "application.tag-router"

View File

@ -17,8 +17,8 @@
package org.apache.dubbo.rpc.cluster.router.tag;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.rpc.cluster.CacheableRouterFactory;
import org.apache.dubbo.rpc.cluster.Router;

View File

@ -94,6 +94,10 @@ public abstract class AbstractClusterInvoker<T> implements Invoker<T> {
return directory.isAvailable();
}
public Directory<T> getDirectory() {
return directory;
}
@Override
public void destroy() {
if (destroyed.compareAndSet(false, true)) {

View File

@ -155,7 +155,7 @@ public abstract class Proxy {
for (Method method : ics[i].getMethods()) {
String desc = ReflectUtils.getDesc(method);
if (worked.contains(desc)) {
if (worked.contains(desc) || Modifier.isStatic(method.getModifiers())) {
continue;
}
worked.add(desc);

View File

@ -14,27 +14,26 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.configcenter;
package org.apache.dubbo.common.config.configcenter;
import org.apache.dubbo.common.URL;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;
/**
*
*/
public abstract class AbstractDynamicConfigurationFactory implements DynamicConfigurationFactory {
private volatile DynamicConfiguration dynamicConfiguration;
private volatile Map<String, DynamicConfiguration> dynamicConfigurations = new ConcurrentHashMap<>();
@Override
public DynamicConfiguration getDynamicConfiguration(URL url) {
if (dynamicConfiguration == null) {
synchronized (this) {
if (dynamicConfiguration == null) {
dynamicConfiguration = createDynamicConfiguration(url);
}
}
}
return dynamicConfiguration;
String key = url == null ? DEFAULT_KEY : url.getAddress();
return dynamicConfigurations.computeIfAbsent(key, k -> createDynamicConfiguration(url));
}
protected abstract DynamicConfiguration createDynamicConfiguration(URL url);

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.configcenter;
package org.apache.dubbo.common.config.configcenter;
/**
* Config change event, immutable.

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.configcenter;
package org.apache.dubbo.common.config.configcenter;
/**
* Config change event type

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.configcenter;
package org.apache.dubbo.common.config.configcenter;
/**
* Config listener, will get notified when the config it listens on changes.

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.configcenter;
package org.apache.dubbo.common.config.configcenter;
public interface Constants {
String CONFIG_CLUSTER_KEY = "config.cluster";

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.configcenter;
package org.apache.dubbo.common.config.configcenter;
import org.apache.dubbo.common.config.Configuration;
import org.apache.dubbo.common.config.Environment;

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.configcenter;
package org.apache.dubbo.common.config.configcenter;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.SPI;

View File

@ -14,11 +14,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.configcenter.support.nop;
package org.apache.dubbo.common.config.configcenter.nop;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.configcenter.ConfigurationListener;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import java.util.SortedSet;
import static java.util.Collections.emptySortedSet;
import java.util.SortedSet;

View File

@ -14,11 +14,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.configcenter.support.nop;
package org.apache.dubbo.common.config.configcenter.nop;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.configcenter.AbstractDynamicConfigurationFactory;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
/**
*

View File

@ -0,0 +1,98 @@
/*
* 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.common.config.configcenter.wrapper;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import java.util.HashSet;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.function.Consumer;
import java.util.function.Function;
/**
* support multiple config center, simply iterating each underlying config center.
*/
public class CompositeDynamicConfiguration implements DynamicConfiguration {
public static final String NAME = "COMPOSITE";
private Set<DynamicConfiguration> configurations = new HashSet<>();
public void addConfiguration(DynamicConfiguration configuration) {
this.configurations.add(configuration);
}
@Override
public void addListener(String key, String group, ConfigurationListener listener) {
iterateListenerOperation(configuration -> configuration.addListener(key, group, listener));
}
@Override
public void removeListener(String key, String group, ConfigurationListener listener) {
iterateListenerOperation(configuration -> configuration.removeListener(key, group, listener));
}
@Override
public String getConfig(String key, String group, long timeout) throws IllegalStateException {
return (String) iterateConfigOperation(configuration -> configuration.getConfig(key, group, timeout));
}
@Override
public String getConfigs(String key, String group, long timeout) throws IllegalStateException {
return (String) iterateConfigOperation(configuration -> configuration.getConfigs(key, group, timeout));
}
@Override
public Object getInternalProperty(String key) {
return iterateConfigOperation(configuration -> configuration.getInternalProperty(key));
}
@Override
public boolean publishConfig(String key, String group, String content) throws UnsupportedOperationException {
return (boolean) iterateConfigOperation(configuration -> configuration.publishConfig(key, group, content));
}
@Override
public SortedSet<String> getConfigKeys(String group) throws UnsupportedOperationException {
return (SortedSet<String>) iterateConfigOperation(configuration -> configuration.getConfigKeys(group));
}
@Override
public SortedMap<String, String> getConfigs(String group) throws UnsupportedOperationException {
return (SortedMap<String, String>) iterateConfigOperation(configuration -> configuration.getConfigs(group));
}
private void iterateListenerOperation(Consumer<DynamicConfiguration> consumer) {
for (DynamicConfiguration configuration : configurations) {
consumer.accept(configuration);
}
}
private Object iterateConfigOperation(Function<DynamicConfiguration, Object> func) {
Object value = null;
for (DynamicConfiguration configuration : configurations) {
value = func.apply(configuration);
if (value != null) {
break;
}
}
return value;
}
}

View File

@ -151,6 +151,14 @@ public interface CommonConstants {
String REVISION_KEY = "revision";
String METADATA_REVISION = "metadata.revision";
String METADATA_KEY = "metadata";
String METADATA_DEFAULT = "local";
String METADATA_REMOTE = "remote";
/**
* package version in the manifest
*/

View File

@ -498,4 +498,25 @@ public class UrlUtils {
return "*".equals(pattern) || pattern.equals(value);
}
}
/**
* @param serviceKey, {group}/{interfaceName}:{version}
* @return [group, interfaceName, version]
*/
public static String[] parseServiceKey(String serviceKey) {
String[] arr = new String[3];
int i = serviceKey.indexOf("/");
if (i > 0) {
arr[0] = serviceKey.substring(0, i);
serviceKey = serviceKey.substring(i + 1);
}
int j = serviceKey.indexOf(":");
if (j > 0) {
arr[2] = serviceKey.substring(j + 1);
serviceKey = serviceKey.substring(0, j);
}
arr[1] = serviceKey;
return arr;
}
}

View File

@ -0,0 +1 @@
nop=org.apache.dubbo.common.config.configcenter.nop.NopDynamicConfigurationFactory

View File

@ -36,7 +36,7 @@ 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.common.config.configcenter.Constants,
org.apache.dubbo.metadata.support.Constants,
org.apache.dubbo.rpc.protocol.rest.Constants,
org.apache.dubbo.registry.Constants {

View File

@ -66,12 +66,6 @@
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-metadata</artifactId>
<version>${project.parent.version}</version>
</dependency>
<!-- FIXME, we shouldn't rely on these modules, even in test scope -->
<dependency>
<groupId>org.apache.dubbo</groupId>

View File

@ -114,9 +114,6 @@ public abstract class AbstractConfig implements Serializable {
LEGACY_PROPERTIES.put("dubbo.consumer.retries", "dubbo.service.max.retry.providers");
LEGACY_PROPERTIES.put("dubbo.consumer.check", "dubbo.service.allow.no.provider");
LEGACY_PROPERTIES.put("dubbo.service.url", "dubbo.service.address");
// this is only for compatibility
DubboShutdownHook.getDubboShutdownHook().register();
}
/**

View File

@ -19,8 +19,6 @@ package org.apache.dubbo.config;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.URLBuilder;
import org.apache.dubbo.common.Version;
import org.apache.dubbo.common.config.Environment;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.utils.Assert;
import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.ConfigUtils;
@ -30,9 +28,6 @@ import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.common.utils.UrlUtils;
import org.apache.dubbo.config.context.ConfigManager;
import org.apache.dubbo.config.support.Parameter;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.configcenter.DynamicConfigurationFactory;
import org.apache.dubbo.metadata.integration.MetadataReportService;
import org.apache.dubbo.monitor.MonitorFactory;
import org.apache.dubbo.monitor.MonitorService;
import org.apache.dubbo.registry.RegistryService;
@ -43,19 +38,14 @@ import org.apache.dubbo.rpc.cluster.Cluster;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.support.MockInvoker;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.apache.dubbo.common.config.ConfigurationUtils.parseProperties;
import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;
import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;
import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_PROTOCOL;
import static org.apache.dubbo.common.constants.CommonConstants.FILE_KEY;
@ -73,7 +63,6 @@ import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoad
import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;
import static org.apache.dubbo.config.Constants.LAYER_KEY;
import static org.apache.dubbo.config.Constants.LISTENER_KEY;
import static org.apache.dubbo.config.Constants.REGISTRIES_SUFFIX;
import static org.apache.dubbo.monitor.Constants.LOGSTAT_PROTOCOL;
import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;
import static org.apache.dubbo.registry.Constants.REGISTER_KEY;
@ -203,8 +192,6 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
"The registry config is: " + registryConfig);
}
}
useRegistryForConfigIfNecessary();
}
@SuppressWarnings("deprecation")
@ -267,55 +254,6 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
}
}
void startConfigCenter() {
if (configCenter == null) {
ConfigManager.getInstance().getConfigCenter().ifPresent(cc -> this.configCenter = cc);
}
if (this.configCenter != null) {
// TODO there may have duplicate refresh
this.configCenter.refresh();
prepareEnvironment();
}
ConfigManager.getInstance().refreshAll();
}
private void prepareEnvironment() {
if (configCenter.isValid()) {
if (!configCenter.checkOrUpdateInited()) {
return;
}
DynamicConfiguration dynamicConfiguration = getDynamicConfiguration(configCenter.toUrl());
String configContent = dynamicConfiguration.getConfigs(configCenter.getConfigFile(), configCenter.getGroup());
String appGroup = application != null ? application.getName() : null;
String appConfigContent = null;
if (StringUtils.isNotEmpty(appGroup)) {
appConfigContent = dynamicConfiguration.getConfigs
(StringUtils.isNotEmpty(configCenter.getAppConfigFile()) ? configCenter.getAppConfigFile() : configCenter.getConfigFile(),
appGroup
);
}
try {
Environment.getInstance().setConfigCenterFirst(configCenter.isHighestPriority());
Environment.getInstance().updateExternalConfigurationMap(parseProperties(configContent));
Environment.getInstance().updateAppExternalConfigurationMap(parseProperties(appConfigContent));
} catch (IOException e) {
throw new IllegalStateException("Failed to parse configurations from Config Center.", e);
}
}
}
private DynamicConfiguration getDynamicConfiguration(URL url) {
DynamicConfigurationFactory factories = ExtensionLoader
.getExtensionLoader(DynamicConfigurationFactory.class)
.getExtension(url.getProtocol());
DynamicConfiguration configuration = factories.getDynamicConfiguration(url);
Environment.getInstance().setDynamicConfiguration(configuration);
return configuration;
}
/**
*
* Load the registry and conversion it to {@link URL}, the priority order is: system property > dubbo registry config
@ -415,24 +353,6 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
}
}
private URL loadMetadataReporterURL() {
String address = metadataReportConfig.getAddress();
if (StringUtils.isEmpty(address)) {
return null;
}
Map<String, String> map = new HashMap<String, String>();
appendParameters(map, metadataReportConfig);
return UrlUtils.parseURL(address, map);
}
protected MetadataReportService getMetadataReportService() {
if (metadataReportConfig == null || !metadataReportConfig.isValid()) {
return null;
}
return MetadataReportService.instance(this::loadMetadataReporterURL);
}
/**
* Check whether the remote service interface and the methods meet with Dubbo's requirements.it mainly check, if the
* methods configured in the configuration file are included in the interface of remote service
@ -544,16 +464,6 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
}
private void convertRegistryIdsToRegistries() {
if (StringUtils.isEmpty(registryIds) && CollectionUtils.isEmpty(registries)) {
Set<String> configedRegistries = new HashSet<>();
configedRegistries.addAll(getSubProperties(Environment.getInstance().getExternalConfigurationMap(),
REGISTRIES_SUFFIX));
configedRegistries.addAll(getSubProperties(Environment.getInstance().getAppExternalConfigurationMap(),
REGISTRIES_SUFFIX));
registryIds = String.join(COMMA_SEPARATOR, configedRegistries);
}
if (StringUtils.isEmpty(registryIds)) {
if (CollectionUtils.isEmpty(registries)) {
setRegistries(
@ -571,12 +481,7 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
List<RegistryConfig> tmpRegistries = CollectionUtils.isNotEmpty(registries) ? registries : new ArrayList<>();
Arrays.stream(ids).forEach(id -> {
if (tmpRegistries.stream().noneMatch(reg -> reg.getId().equals(id))) {
tmpRegistries.add(ConfigManager.getInstance().getRegistry(id).orElseGet(() -> {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setId(id);
registryConfig.refresh();
return registryConfig;
}));
ConfigManager.getInstance().getRegistry(id).ifPresent(tmpRegistries::add);
}
});
@ -609,26 +514,6 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
}
}
/**
* For compatibility purpose, use registry as the default config center if the registry protocol is zookeeper and
* there's no config center specified explicitly.
*/
private void useRegistryForConfigIfNecessary() {
registries.stream().filter(RegistryConfig::isZookeeperProtocol).findFirst().ifPresent(rc -> {
// we use the loading status of DynamicConfiguration to decide whether ConfigCenter has been initiated.
Environment.getInstance().getDynamicConfiguration().orElseGet(() -> {
ConfigManager configManager = ConfigManager.getInstance();
ConfigCenterConfig cc = configManager.getConfigCenter().orElse(new ConfigCenterConfig());
cc.setProtocol(rc.getProtocol());
cc.setAddress(rc.getAddress());
cc.setHighestPriority(false);
setConfigCenter(cc);
startConfigCenter();
return null;
});
});
}
/**
* @return local
* @deprecated Replace to <code>getStub()</code>
@ -783,7 +668,7 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
@SuppressWarnings({"unchecked"})
public void setRegistries(List<? extends RegistryConfig> registries) {
ConfigManager.getInstance().addRegistries((List<RegistryConfig>) registries);
ConfigManager.getInstance().addRegistries((List<RegistryConfig>) registries, false);
this.registries = (List<RegistryConfig>) registries;
}
@ -823,7 +708,7 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
}
public void setConfigCenter(ConfigCenterConfig configCenter) {
ConfigManager.getInstance().setConfigCenter(configCenter);
ConfigManager.getInstance().addConfigCenter(configCenter);
this.configCenter = configCenter;
}

View File

@ -27,8 +27,8 @@ import java.util.List;
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.SERVICE_FILTER_KEY;
import static org.apache.dubbo.rpc.Constants.EXPORTER_LISTENER_KEY;
import static org.apache.dubbo.rpc.Constants.SERVICE_FILTER_KEY;
import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;
/**
@ -206,7 +206,7 @@ public abstract class AbstractServiceConfig extends AbstractInterfaceConfig {
@SuppressWarnings({"unchecked"})
public void setProtocols(List<? extends ProtocolConfig> protocols) {
ConfigManager.getInstance().addProtocols((List<ProtocolConfig>) protocols);
ConfigManager.getInstance().addProtocols((List<ProtocolConfig>) protocols, false);
this.protocols = (List<ProtocolConfig>) protocols;
}

View File

@ -137,6 +137,11 @@ public class ApplicationConfig extends AbstractConfig {
*/
private String shutwait;
/**
* Metadata type, local or remote, if choose remote, you need to further specify metadata center.
*/
private String metadata;
public ApplicationConfig() {
}
@ -374,4 +379,11 @@ public class ApplicationConfig extends AbstractConfig {
return !StringUtils.isEmpty(name);
}
public String getMetadata() {
return metadata;
}
public void setMetadata(String metadata) {
this.metadata = metadata;
}
}

View File

@ -26,17 +26,17 @@ import org.apache.dubbo.config.support.Parameter;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import static org.apache.dubbo.common.config.configcenter.Constants.CONFIG_CHECK_KEY;
import static org.apache.dubbo.common.config.configcenter.Constants.CONFIG_CLUSTER_KEY;
import static org.apache.dubbo.common.config.configcenter.Constants.CONFIG_GROUP_KEY;
import static org.apache.dubbo.common.config.configcenter.Constants.CONFIG_NAMESPACE_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;
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.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;
import static org.apache.dubbo.config.Constants.ZOOKEEPER_PROTOCOL;
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;
/**
* ConfigCenterConfig

View File

@ -16,9 +16,12 @@
*/
package org.apache.dubbo.config;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.common.utils.UrlUtils;
import org.apache.dubbo.config.support.Parameter;
import java.util.HashMap;
import java.util.Map;
import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;
@ -83,6 +86,16 @@ public class MetadataReportConfig extends AbstractConfig {
setAddress(address);
}
public URL toUrl() {
String address = this.getAddress();
if (StringUtils.isEmpty(address)) {
return null;
}
Map<String, String> map = new HashMap<String, String>();
appendParameters(map, this);
return UrlUtils.parseURL(address, map);
}
@Parameter(excluded = true)
public String getAddress() {
return address;

View File

@ -32,7 +32,7 @@ import org.apache.dubbo.config.event.ReferenceConfigInitializedEvent;
import org.apache.dubbo.config.support.Parameter;
import org.apache.dubbo.event.Event;
import org.apache.dubbo.event.EventDispatcher;
import org.apache.dubbo.metadata.integration.MetadataReportService;
import org.apache.dubbo.metadata.WritableMetadataService;
import org.apache.dubbo.remoting.Constants;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Protocol;
@ -66,6 +66,8 @@ import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;
import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;
import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.LOCALHOST_VALUE;
import static org.apache.dubbo.common.constants.CommonConstants.METADATA_DEFAULT;
import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;
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.REVISION_KEY;
@ -228,7 +230,6 @@ public class ReferenceConfig<T> extends AbstractReferenceConfig {
throw new IllegalStateException("<dubbo:reference interface=\"\" /> interface not allow null!");
}
completeCompoundConfigs();
startConfigCenter();
// get consumer's global configuration
checkDefault();
this.refresh();
@ -340,10 +341,11 @@ public class ReferenceConfig<T> extends AbstractReferenceConfig {
}
map.put(REGISTER_IP_KEY, hostToRegistry);
ref = createProxy(map);
String serviceKey = URL.buildKey(interfaceName, group, version);
ApplicationModel.initConsumerModel(serviceKey, buildConsumerModel(serviceKey, attributes));
ref = createProxy(map);
ApplicationModel.getConsumerModel(serviceKey).setProxyObject(ref);
initialized = true;
// dispatch a ReferenceConfigInitializedEvent since 2.7.3
@ -441,10 +443,11 @@ public class ReferenceConfig<T> extends AbstractReferenceConfig {
* @since 2.7.0
* ServiceData Store
*/
MetadataReportService metadataReportService = null;
if ((metadataReportService = getMetadataReportService()) != null) {
String metadata = map.get(METADATA_KEY);
WritableMetadataService metadataService = WritableMetadataService.getExtension(metadata == null ? METADATA_DEFAULT : metadata);
if (metadataService != null) {
URL consumerURL = new URL(CONSUMER_PROTOCOL, map.remove(REGISTER_IP_KEY), 0, map.get(INTERFACE_KEY), map);
metadataReportService.publishConsumer(consumerURL);
metadataService.publishServiceDefinition(consumerURL);
}
// create service proxy
return (T) PROXY_FACTORY.getProxy(invoker);

View File

@ -21,7 +21,6 @@ import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.URLBuilder;
import org.apache.dubbo.common.Version;
import org.apache.dubbo.common.bytecode.Wrapper;
import org.apache.dubbo.common.config.Environment;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.utils.ClassUtils;
import org.apache.dubbo.common.utils.CollectionUtils;
@ -36,7 +35,7 @@ import org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker;
import org.apache.dubbo.config.support.Parameter;
import org.apache.dubbo.event.Event;
import org.apache.dubbo.event.EventDispatcher;
import org.apache.dubbo.metadata.integration.MetadataReportService;
import org.apache.dubbo.metadata.WritableMetadataService;
import org.apache.dubbo.remoting.Constants;
import org.apache.dubbo.rpc.Exporter;
import org.apache.dubbo.rpc.Invoker;
@ -72,6 +71,8 @@ import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATT
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.METADATA_DEFAULT;
import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;
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;
@ -87,7 +88,6 @@ 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.MULTICAST;
import static org.apache.dubbo.config.Constants.PROTOCOLS_SUFFIX;
import static org.apache.dubbo.config.Constants.SCOPE_NONE;
import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;
import static org.apache.dubbo.rpc.Constants.LOCAL_PROTOCOL;
@ -301,10 +301,8 @@ public class ServiceConfig<T> extends AbstractServiceConfig {
}
public void checkAndUpdateSubConfigs() {
// Use default configs defined explicitly on global configs
// Use default configs defined explicitly on global scope
completeCompoundConfigs();
// Config Center should always being started first.
startConfigCenter();
checkDefault();
checkProtocol();
checkApplication();
@ -635,9 +633,9 @@ public class ServiceConfig<T> extends AbstractServiceConfig {
* @since 2.7.0
* ServiceData Store
*/
MetadataReportService metadataReportService = null;
if ((metadataReportService = getMetadataReportService()) != null) {
metadataReportService.publishProvider(url);
WritableMetadataService metadataService = WritableMetadataService.getExtension(url.getParameter(METADATA_KEY, METADATA_DEFAULT));
if (metadataService != null) {
metadataService.publishServiceDefinition(url);
}
}
}
@ -882,16 +880,6 @@ public class ServiceConfig<T> extends AbstractServiceConfig {
}
private void convertProtocolIdsToProtocols() {
if (StringUtils.isEmpty(protocolIds) && CollectionUtils.isEmpty(protocols)) {
List<String> configedProtocols = new ArrayList<>();
configedProtocols.addAll(getSubProperties(Environment.getInstance()
.getExternalConfigurationMap(), PROTOCOLS_SUFFIX));
configedProtocols.addAll(getSubProperties(Environment.getInstance()
.getAppExternalConfigurationMap(), PROTOCOLS_SUFFIX));
protocolIds = String.join(",", configedProtocols);
}
if (StringUtils.isEmpty(protocolIds)) {
if (CollectionUtils.isEmpty(protocols)) {
setProtocols(
@ -909,12 +897,7 @@ public class ServiceConfig<T> extends AbstractServiceConfig {
List<ProtocolConfig> tmpProtocols = CollectionUtils.isNotEmpty(protocols) ? protocols : new ArrayList<>();
Arrays.stream(arr).forEach(id -> {
if (tmpProtocols.stream().noneMatch(prot -> prot.getId().equals(id))) {
tmpProtocols.add(ConfigManager.getInstance().getProtocol(id).orElseGet(() -> {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setId(id);
protocolConfig.refresh();
return protocolConfig;
}));
ConfigManager.getInstance().getProtocol(id).ifPresent(tmpProtocols::add);
}
});
if (tmpProtocols.size() > arr.length) {

View File

@ -33,6 +33,7 @@ import static org.apache.dubbo.config.Constants.PRODUCTION_ENVIRONMENT;
*/
public class ApplicationBuilder extends AbstractBuilder<ApplicationConfig, ApplicationBuilder> {
private String name;
private String metadata;
private String version;
private String owner;
private String organization;
@ -51,11 +52,20 @@ public class ApplicationBuilder extends AbstractBuilder<ApplicationConfig, Appli
private Map<String, String> parameters;
private String shutwait;
public static ApplicationBuilder newBuilder() {
return new ApplicationBuilder();
}
public ApplicationBuilder name(String name) {
this.name = name;
return getThis();
}
public ApplicationBuilder metadata(String metadata) {
this.metadata = metadata;
return getThis();
}
public ApplicationBuilder version(String version) {
this.version = version;
return getThis();
@ -167,6 +177,7 @@ public class ApplicationBuilder extends AbstractBuilder<ApplicationConfig, Appli
super.build(config);
config.setName(name);
config.setMetadata(metadata);
config.setVersion(this.version);
config.setOwner(this.owner);
config.setOrganization(this.organization);

View File

@ -60,6 +60,10 @@ public class MetadataReportBuilder extends AbstractBuilder<MetadataReportConfig,
*/
private Boolean syncReport;
public static MetadataReportBuilder newBuilder() {
return new MetadataReportBuilder();
}
public MetadataReportBuilder address(String address) {
this.address = address;
return getThis();

View File

@ -185,6 +185,10 @@ public class ProtocolBuilder extends AbstractBuilder<ProtocolConfig, ProtocolBui
*/
private Boolean isDefault;
public static ProtocolBuilder newBuilder() {
return new ProtocolBuilder();
}
public ProtocolBuilder id(String id) {
return super.id(id);
}

View File

@ -64,6 +64,10 @@ public class ReferenceBuilder<T> extends AbstractReferenceBuilder<ReferenceConfi
*/
private String protocol;
public static ReferenceBuilder newBuilder() {
return new ReferenceBuilder();
}
public ReferenceBuilder<T> id(String id) {
return super.id(id);
}

View File

@ -134,6 +134,10 @@ public class RegistryBuilder extends AbstractBuilder<RegistryConfig, RegistryBui
*/
private String extraKeys;
public static RegistryBuilder newBuilder() {
return new RegistryBuilder();
}
public RegistryBuilder id(String id) {
return super.id(id);
}

View File

@ -68,6 +68,10 @@ public class ServiceBuilder<U> extends AbstractServiceBuilder<ServiceConfig, Ser
*/
private String generic;
public static ServiceBuilder newBuilder() {
return new ServiceBuilder();
}
public ServiceBuilder id(String id) {
return super.id(id);
}

View File

@ -16,26 +16,36 @@
*/
package org.apache.dubbo.config.context;
import org.apache.dubbo.common.config.Environment;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.config.AbstractConfig;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ConfigCenterConfig;
import org.apache.dubbo.config.ConsumerConfig;
import org.apache.dubbo.config.MetadataReportConfig;
import org.apache.dubbo.config.ModuleConfig;
import org.apache.dubbo.config.MonitorConfig;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.ProviderConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;
import static org.apache.dubbo.config.Constants.PROTOCOLS_SUFFIX;
import static org.apache.dubbo.config.Constants.REGISTRIES_SUFFIX;
/**
* TODO
@ -78,13 +88,23 @@ public class ConfigManager {
private ApplicationConfig application;
private MonitorConfig monitor;
private ModuleConfig module;
private ConfigCenterConfig configCenter;
private Map<String, ProtocolConfig> protocols = new ConcurrentHashMap<>();
private Map<String, RegistryConfig> registries = new ConcurrentHashMap<>();
private Map<String, ProviderConfig> providers = new ConcurrentHashMap<>();
private Map<String, ConsumerConfig> consumers = new ConcurrentHashMap<>();
private List<ProtocolConfig> defaultProtocols = new ArrayList<>();
private List<RegistryConfig> defaultRegistries = new ArrayList<>();
private Set<ConfigCenterConfig> configCenters = new HashSet<>();
private Set<MetadataReportConfig> metadataConfigs = new HashSet<>();
private Set<String> registryIds = new HashSet<>();
private Set<String> protocolIds = new HashSet<>();
private List<ServiceConfig<?>> serviceConfigs = new ArrayList<>();
private List<ReferenceConfig<?>> referenceConfigs = new ArrayList<>();
public static ConfigManager getInstance() {
return CONFIG_MANAGER;
}
@ -126,14 +146,35 @@ public class ConfigManager {
}
}
public Optional<ConfigCenterConfig> getConfigCenter() {
return Optional.ofNullable(configCenter);
public Set<ConfigCenterConfig> getConfigCenters() {
return configCenters;
}
public void setConfigCenter(ConfigCenterConfig configCenter) {
if (configCenter != null) {
checkDuplicate(this.configCenter, configCenter);
this.configCenter = configCenter;
public void addConfigCenter(ConfigCenterConfig configCenter) {
if (configCenter != null && !configCenters.contains(configCenter)) {
this.configCenters.add(configCenter);
}
}
public void addConfigCenter(List<ConfigCenterConfig> configCenters) {
if (CollectionUtils.isNotEmpty(configCenters)) {
this.configCenters.addAll(configCenters);
}
}
public Set<MetadataReportConfig> getMetadataConfigs() {
return metadataConfigs;
}
public void addMetadataReport(MetadataReportConfig metadataReportConfig) {
if (metadataReportConfig != null && !metadataConfigs.contains(metadataReportConfig)) {
this.metadataConfigs.add(metadataReportConfig);
}
}
public void addMetadataReport(List<MetadataReportConfig> metadataReportConfigs) {
if (CollectionUtils.isNotEmpty(metadataReportConfigs)) {
this.metadataConfigs.addAll(metadataReportConfigs);
}
}
@ -200,31 +241,28 @@ public class ConfigManager {
}
public Optional<List<ProtocolConfig>> getDefaultProtocols() {
List<ProtocolConfig> defaults = new ArrayList<>();
protocols.forEach((k, v) -> {
if (DEFAULT_KEY.equalsIgnoreCase(k)) {
defaults.add(v);
} else if (v.isDefault() == null || v.isDefault()) {
defaults.add(v);
}
});
return Optional.of(defaults);
return Optional.of(defaultProtocols);
}
public void addProtocols(List<ProtocolConfig> protocolConfigs) {
public void addProtocols(List<ProtocolConfig> protocolConfigs, boolean canBeDefault) {
if (protocolConfigs != null) {
protocolConfigs.forEach(this::addProtocol);
protocolConfigs.forEach(pc -> this.addProtocol(pc, canBeDefault));
}
}
public void addProtocol(ProtocolConfig protocolConfig) {
public void addProtocol(ProtocolConfig protocolConfig, boolean canBeDefault) {
if (protocolConfig == null) {
return;
}
// if isDefault is not false and a ProtocolConfig is not specified being false.
if (canBeDefault && (protocolConfig.isDefault() == null || protocolConfig.isDefault())) {
this.defaultProtocols.add(protocolConfig);
}
String key = StringUtils.isNotEmpty(protocolConfig.getId())
? protocolConfig.getId()
: (protocolConfig.isDefault() == null || protocolConfig.isDefault()) ? DEFAULT_KEY : null;
: DEFAULT_KEY;
if (StringUtils.isEmpty(key)) {
throw new IllegalStateException("A ProtocolConfig should either has an id or it's the default one, " + protocolConfig);
@ -243,31 +281,26 @@ public class ConfigManager {
}
public Optional<List<RegistryConfig>> getDefaultRegistries() {
List<RegistryConfig> defaults = new ArrayList<>();
registries.forEach((k, v) -> {
if (DEFAULT_KEY.equalsIgnoreCase(k)) {
defaults.add(v);
} else if (v.isDefault() == null || v.isDefault()) {
defaults.add(v);
}
});
return Optional.of(defaults);
return Optional.of(defaultRegistries);
}
public void addRegistries(List<RegistryConfig> registryConfigs) {
public void addRegistries(List<RegistryConfig> registryConfigs, boolean canBeDefault) {
if (registryConfigs != null) {
registryConfigs.forEach(this::addRegistry);
registryConfigs.forEach(rc -> this.addRegistry(rc, canBeDefault));
}
}
public void addRegistry(RegistryConfig registryConfig) {
public void addRegistry(RegistryConfig registryConfig, boolean canBeDefault) {
if (registryConfig == null) {
return;
}
if (canBeDefault && (registryConfig.isDefault() == null || registryConfig.isDefault())) {
this.defaultRegistries.add(registryConfig);
}
String key = StringUtils.isNotEmpty(registryConfig.getId())
? registryConfig.getId()
: (registryConfig.isDefault() == null || registryConfig.isDefault()) ? DEFAULT_KEY : null;
: DEFAULT_KEY;
if (StringUtils.isEmpty(key)) {
throw new IllegalStateException("A RegistryConfig should either has an id or it's the default one, " + registryConfig);
@ -281,6 +314,51 @@ public class ConfigManager {
}
}
public void addProtocolIds(List<String> protocolIds) {
this.protocolIds.addAll(protocolIds);
}
public void addRegistryIds(List<String> registryIds) {
this.registryIds.addAll(registryIds);
}
public void addService(ServiceConfig<?> serviceConfig) {
this.serviceConfigs.add(serviceConfig);
}
public void addReference(ReferenceConfig<?> referenceConfig) {
this.referenceConfigs.add(referenceConfig);
}
public Set<String> getRegistryIds() {
Set<String> configedRegistries = new HashSet<>();
configedRegistries.addAll(getSubProperties(Environment.getInstance().getExternalConfigurationMap(),
REGISTRIES_SUFFIX));
configedRegistries.addAll(getSubProperties(Environment.getInstance().getAppExternalConfigurationMap(),
REGISTRIES_SUFFIX));
configedRegistries.addAll(registryIds);
return configedRegistries;
}
public Set<String> getProtocolIds() {
Set<String> configedProtocols = new HashSet<>();
configedProtocols.addAll(getSubProperties(Environment.getInstance()
.getExternalConfigurationMap(), PROTOCOLS_SUFFIX));
configedProtocols.addAll(getSubProperties(Environment.getInstance()
.getAppExternalConfigurationMap(), PROTOCOLS_SUFFIX));
configedProtocols.addAll(protocolIds);
return configedProtocols;
}
protected static Set<String> getSubProperties(Map<String, String> properties, String prefix) {
return properties.keySet().stream().filter(k -> k.contains(prefix)).map(k -> {
k = k.substring(prefix.length());
return k.substring(0, k.indexOf("."));
}).collect(Collectors.toSet());
}
public Map<String, ProtocolConfig> getProtocols() {
return protocols;
}
@ -297,6 +375,14 @@ public class ConfigManager {
return consumers;
}
public List<ServiceConfig<?>> getServiceConfigs() {
return serviceConfigs;
}
public List<ReferenceConfig<?>> getReferenceConfigs() {
return referenceConfigs;
}
public void refreshAll() {
// refresh all configs here,
getApplication().ifPresent(ApplicationConfig::refresh);
@ -319,13 +405,16 @@ public class ConfigManager {
// For test purpose
public void clear() {
this.application = null;
this.configCenter = null;
this.monitor = null;
this.module = null;
this.registries.clear();
this.protocols.clear();
this.providers.clear();
this.consumers.clear();
this.configCenters.clear();
this.metadataConfigs.clear();
this.registryIds.clear();
this.protocolIds.clear();
}
}

View File

@ -25,9 +25,9 @@ import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;
import org.apache.dubbo.config.context.ConfigManager;
import org.apache.dubbo.metadata.LocalMetadataService;
import org.apache.dubbo.metadata.MetadataService;
import org.apache.dubbo.metadata.MetadataServiceExporter;
import org.apache.dubbo.metadata.WritableMetadataService;
import java.util.Collection;
import java.util.LinkedList;
@ -79,7 +79,7 @@ public class ConfigurableMetadataServiceExporter implements MetadataServiceExpor
if (!isExported()) {
LocalMetadataService metadataService = LocalMetadataService.getDefaultExtension();
WritableMetadataService metadataService = WritableMetadataService.getDefaultExtension();
ServiceConfig<MetadataService> serviceConfig = new ServiceConfig<>();
serviceConfig.setApplication(applicationConfig);

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.rpc.protocol.dubbo.telnet;
package org.apache.dubbo.config.telnet;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.common.utils.StringUtils;

View File

@ -0,0 +1 @@
shutdown=org.apache.dubbo.rpc.protocol.dubbo.telnet.ShutdownTelnetHandler

View File

@ -49,9 +49,9 @@ public class ConfigurableMetadataServiceExporterTest {
configManager.setApplication(applicationConfig);
// Add ProtocolConfig
configManager.addProtocol(protocolConfig());
configManager.addProtocol(protocolConfig(), true);
// Add RegistryConfig
configManager.addRegistry(registryConfig());
configManager.addRegistry(registryConfig(), true);
}
private static ProtocolConfig protocolConfig() {

View File

@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.dubbo.rpc.service;
package org.apache.dubbo.config.service;
/**
* DemoException

View File

@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.dubbo.rpc.service;
package org.apache.dubbo.config.service;
import java.util.List;

View File

@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.dubbo.rpc.service;
package org.apache.dubbo.config.service;
import java.util.List;

View File

@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.dubbo.rpc.service;
package org.apache.dubbo.config.service;
import org.apache.dubbo.common.beanutil.JavaBeanAccessor;
import org.apache.dubbo.common.beanutil.JavaBeanDescriptor;
@ -29,6 +29,8 @@ import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;
import org.apache.dubbo.rpc.service.GenericException;
import org.apache.dubbo.rpc.service.GenericService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Disabled;
@ -42,8 +44,8 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import static org.apache.dubbo.rpc.Constants.GENERIC_SERIALIZATION_NATIVE_JAVA;
import static org.apache.dubbo.rpc.Constants.GENERIC_SERIALIZATION_BEAN;
import static org.apache.dubbo.rpc.Constants.GENERIC_SERIALIZATION_NATIVE_JAVA;
/**
* GenericServiceTest

View File

@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.dubbo.rpc.service;
package org.apache.dubbo.config.service;
import java.io.Serializable;

View File

@ -14,11 +14,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.rpc.protocol.dubbo.telnet;
package org.apache.dubbo.config.telnet;
import org.apache.dubbo.remoting.Channel;
import org.apache.dubbo.remoting.RemotingException;
import org.apache.dubbo.remoting.telnet.TelnetHandler;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;

View File

@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.dubbo.rpc.validation;
package org.apache.dubbo.config.validation;
import javax.validation.constraints.Future;
import javax.validation.constraints.Max;

View File

@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.dubbo.rpc.validation;
package org.apache.dubbo.config.validation;
import org.apache.dubbo.validation.MethodValidated;

View File

@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.dubbo.rpc.validation;
package org.apache.dubbo.config.validation;
/**
* ValidationServiceImpl

View File

@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.dubbo.rpc.validation;
package org.apache.dubbo.config.validation;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ProtocolConfig;

View File

@ -397,6 +397,11 @@
<xsd:documentation><![CDATA[ Is default. ]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="metadata" type="xsd:string">
<xsd:annotation>
<xsd:documentation><![CDATA[ The metadta type: local or remote. ]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>

View File

@ -392,6 +392,11 @@
<xsd:documentation><![CDATA[ Is default. ]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="metadata" type="xsd:string">
<xsd:annotation>
<xsd:documentation><![CDATA[ The metadta type: local or remote. ]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
<xsd:complexType name="moduleType">

View File

@ -1,39 +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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter</artifactId>
<version>${revision}</version>
</parent>
<artifactId>dubbo-configcenter-api</artifactId>
<packaging>jar</packaging>
<name>${project.artifactId}</name>
<description>The api definition of the service config-center module</description>
<properties>
<skip_maven_deploy>false</skip_maven_deploy>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
</project>

View File

@ -1 +0,0 @@
nop=org.apache.dubbo.configcenter.support.nop.NopDynamicConfigurationFactory

View File

@ -1,47 +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.mock;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.configcenter.DynamicConfigurationFactory;
import org.apache.dubbo.configcenter.support.nop.NopDynamicConfigurationFactory;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
/**
*
*/
public class AbstractDynamicConfigurationTest {
public DynamicConfigurationFactory configurationFactory = ExtensionLoader.getExtensionLoader(DynamicConfigurationFactory.class).getExtension("mock");
public URL url = URL.valueOf("nop://127.0.0.1:10880/DynamicConfiguration");
@Test
public void testInit() {
DynamicConfiguration configuration1 = configurationFactory.getDynamicConfiguration(url);
DynamicConfiguration configuration2 = configurationFactory.getDynamicConfiguration(url);
Assertions.assertEquals(configuration1, configuration2);
}
@Test
public void testDefaultExtension() {
DynamicConfigurationFactory factory = ExtensionLoader.getExtensionLoader(DynamicConfigurationFactory.class).getDefaultExtension();
Assertions.assertTrue(factory instanceof NopDynamicConfigurationFactory);
}
}

View File

@ -1,54 +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.mock;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.configcenter.ConfigurationListener;
import org.apache.dubbo.configcenter.DynamicConfiguration;
/**
*
*/
public class MockDynamicConfiguration implements DynamicConfiguration {
public MockDynamicConfiguration(URL url) {
}
@Override
public Object getInternalProperty(String key) {
return null;
}
@Override
public void addListener(String key, String group, ConfigurationListener listener) {
}
@Override
public void removeListener(String key, String group, ConfigurationListener listener) {
}
@Override
public String getConfig(String key, String group, long timeout) throws IllegalStateException {
return null;
}
@Override
public String getConfigs(String key, String group, long timeout) throws IllegalStateException {
return null;
}
}

View File

@ -1 +0,0 @@
mock=org.apache.dubbo.configcenter.mock.MockDynamicConfigurationFactory

View File

@ -32,7 +32,7 @@
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter-api</artifactId>
<artifactId>dubbo-common</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>

View File

@ -17,13 +17,13 @@
package org.apache.dubbo.configcenter.support.apollo;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.ConfigChangeEvent;
import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.configcenter.ConfigChangeEvent;
import org.apache.dubbo.configcenter.ConfigChangeType;
import org.apache.dubbo.configcenter.ConfigurationListener;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigChangeListener;
@ -42,12 +42,12 @@ import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.stream.Collectors;
import static org.apache.dubbo.common.config.configcenter.Constants.CONFIG_CHECK_KEY;
import static org.apache.dubbo.common.config.configcenter.Constants.CONFIG_CLUSTER_KEY;
import static org.apache.dubbo.common.config.configcenter.Constants.CONFIG_NAMESPACE_KEY;
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.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;
/**
* Apollo implementation, https://github.com/ctripcorp/apollo

View File

@ -17,8 +17,8 @@
package org.apache.dubbo.configcenter.support.apollo;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.configcenter.AbstractDynamicConfigurationFactory;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
/**
*

View File

@ -29,7 +29,7 @@
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter-api</artifactId>
<artifactId>dubbo-common</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>

View File

@ -18,14 +18,14 @@
package org.apache.dubbo.configcenter.consul;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.ConfigChangeEvent;
import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.NamedThreadFactory;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.configcenter.ConfigChangeEvent;
import org.apache.dubbo.configcenter.ConfigChangeType;
import org.apache.dubbo.configcenter.ConfigurationListener;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import com.ecwid.consul.v1.ConsulClient;
import com.ecwid.consul.v1.QueryParams;
@ -39,9 +39,9 @@ import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutorService;
import static java.util.concurrent.Executors.newCachedThreadPool;
import static org.apache.dubbo.common.config.configcenter.ConfigChangeType.ADDED;
import static org.apache.dubbo.common.config.configcenter.Constants.CONFIG_NAMESPACE_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;
import static org.apache.dubbo.configcenter.Constants.CONFIG_NAMESPACE_KEY;
import static org.apache.dubbo.configcenter.ConfigChangeType.ADDED;
/**
* config center implementation for consul

View File

@ -18,8 +18,8 @@
package org.apache.dubbo.configcenter.consul;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.configcenter.AbstractDynamicConfigurationFactory;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
/**
* Config center factory for consul

View File

@ -32,11 +32,6 @@
<description>The etcd implementation of the config-center api</description>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>io.etcd</groupId>
<artifactId>jetcd-launcher</artifactId>
@ -47,6 +42,12 @@
<artifactId>testcontainers</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-remoting-etcd3</artifactId>

View File

@ -18,11 +18,11 @@
package org.apache.dubbo.configcenter.support.etcd;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.ConfigChangeEvent;
import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.configcenter.ConfigChangeEvent;
import org.apache.dubbo.configcenter.ConfigChangeType;
import org.apache.dubbo.configcenter.ConfigurationListener;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.remoting.etcd.StateListener;
import org.apache.dubbo.remoting.etcd.jetcd.JEtcdClient;
@ -40,8 +40,8 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.dubbo.common.config.configcenter.Constants.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}

View File

@ -18,8 +18,8 @@
package org.apache.dubbo.configcenter.support.etcd;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.configcenter.AbstractDynamicConfigurationFactory;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
/**
* The etcd implementation of {@link AbstractDynamicConfigurationFactory}

View File

@ -18,8 +18,8 @@
package org.apache.dubbo.configcenter.support.etcd;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.configcenter.ConfigChangeEvent;
import org.apache.dubbo.configcenter.ConfigurationListener;
import org.apache.dubbo.common.config.configcenter.ConfigChangeEvent;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import io.etcd.jetcd.ByteSequence;
import io.etcd.jetcd.Client;

View File

@ -34,7 +34,7 @@
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter-api</artifactId>
<artifactId>dubbo-common</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>

View File

@ -18,13 +18,13 @@
package org.apache.dubbo.configcenter.support.nacos;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.ConfigChangeEvent;
import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.configcenter.ConfigChangeEvent;
import org.apache.dubbo.configcenter.ConfigChangeType;
import org.apache.dubbo.configcenter.ConfigurationListener;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
@ -46,9 +46,9 @@ import static com.alibaba.nacos.api.PropertyKeyConst.NAMESPACE;
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.configcenter.Constants.CONFIG_NAMESPACE_KEY;
import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY;
/**

View File

@ -18,9 +18,9 @@
package org.apache.dubbo.configcenter.support.nacos;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.configcenter.AbstractDynamicConfigurationFactory;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import com.alibaba.nacos.api.PropertyKeyConst;

View File

@ -18,8 +18,8 @@
package org.apache.dubbo.configcenter.support.nacos;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.configcenter.ConfigChangeEvent;
import org.apache.dubbo.configcenter.ConfigurationListener;
import org.apache.dubbo.common.config.configcenter.ConfigChangeEvent;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;

View File

@ -29,7 +29,7 @@
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter-api</artifactId>
<artifactId>dubbo-common</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>

View File

@ -16,11 +16,11 @@
*/
package org.apache.dubbo.configcenter.support.zookeeper;
import org.apache.dubbo.common.config.configcenter.ConfigChangeEvent;
import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.configcenter.ConfigChangeEvent;
import org.apache.dubbo.configcenter.ConfigChangeType;
import org.apache.dubbo.configcenter.ConfigurationListener;
import org.apache.dubbo.remoting.zookeeper.DataListener;
import org.apache.dubbo.remoting.zookeeper.EventType;

View File

@ -17,10 +17,10 @@
package org.apache.dubbo.configcenter.support.zookeeper;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.utils.NamedThreadFactory;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.configcenter.ConfigurationListener;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.remoting.zookeeper.ZookeeperClient;
import org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter;
@ -36,8 +36,8 @@ import java.util.concurrent.Executors;
import static java.util.Collections.emptySortedSet;
import static java.util.Collections.unmodifiableSortedSet;
import static org.apache.dubbo.common.config.configcenter.Constants.CONFIG_NAMESPACE_KEY;
import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;
import static org.apache.dubbo.configcenter.Constants.CONFIG_NAMESPACE_KEY;
/**
*

View File

@ -17,8 +17,8 @@
package org.apache.dubbo.configcenter.support.zookeeper;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.configcenter.AbstractDynamicConfigurationFactory;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter;
/**

View File

@ -17,12 +17,12 @@
package org.apache.dubbo.configcenter.support.zookeeper;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.ConfigChangeEvent;
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
import org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.utils.NetUtils;
import org.apache.dubbo.configcenter.ConfigChangeEvent;
import org.apache.dubbo.configcenter.ConfigurationListener;
import org.apache.dubbo.configcenter.DynamicConfiguration;
import org.apache.dubbo.configcenter.DynamicConfigurationFactory;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;

View File

@ -30,7 +30,6 @@
</properties>
<modules>
<module>dubbo-configcenter-api</module>
<module>dubbo-configcenter-zookeeper</module>
<module>dubbo-configcenter-apollo</module>
<module>dubbo-configcenter-consul</module>

View File

@ -34,10 +34,5 @@
<artifactId>dubbo-container-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
</project>

View File

@ -33,6 +33,11 @@
</properties>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-config-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-demo-interface</artifactId>

View File

@ -35,6 +35,11 @@
</properties>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-config-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-demo-interface</artifactId>

View File

@ -1,38 +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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dubbo-metadata-report</artifactId>
<groupId>org.apache.dubbo</groupId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-metadata-definition</artifactId>
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
</project>

Some files were not shown because too many files have changed in this diff Show More