You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2019/08/09 07:31:18 UTC
[dubbo] branch cloud-native updated: spring delegate to bootstrap.
This is an automated email from the ASF dual-hosted git repository.
liujun pushed a commit to branch cloud-native
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/cloud-native by this push:
new bdaacbc spring delegate to bootstrap.
bdaacbc is described below
commit bdaacbc17d8f189c4ebbb34129883e1d0552dfcf
Author: ken.lj <ke...@gmail.com>
AuthorDate: Fri Aug 9 15:31:07 2019 +0800
spring delegate to bootstrap.
---
.../org/apache/dubbo/bootstrap/DubboBootstrap.java | 83 ++++++++++++++++++--
.../dubbo/config/AbstractInterfaceConfig.java | 1 +
.../apache/dubbo/config/context/ConfigManager.java | 13 ++++
dubbo-config/dubbo-config-spring/pom.xml | 5 ++
.../dubbo/config/spring/ApplicationBean.java | 89 ++++++++++++++++++++++
.../apache/dubbo/config/spring/ReferenceBean.java | 3 +-
.../dubbo-demo-api/dubbo-demo-api-provider/pom.xml | 4 +
7 files changed, 192 insertions(+), 6 deletions(-)
diff --git a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java
index 005f11d..4189238 100644
--- a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java
+++ b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java
@@ -30,6 +30,9 @@ 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.MetricsConfig;
+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;
@@ -45,6 +48,7 @@ import org.apache.dubbo.config.builders.RegistryBuilder;
import org.apache.dubbo.config.builders.ServiceBuilder;
import org.apache.dubbo.config.context.ConfigManager;
import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter;
+import org.apache.dubbo.config.utils.ReferenceConfigCache;
import org.apache.dubbo.event.EventDispatcher;
import org.apache.dubbo.event.EventListener;
import org.apache.dubbo.metadata.WritableMetadataService;
@@ -117,6 +121,8 @@ public class DubboBootstrap {
private final ConfigManager configManager = getInstance();
+ private ReferenceConfigCache cache;
+
private volatile boolean initialized = false;
private volatile boolean started = false;
@@ -148,7 +154,11 @@ public class DubboBootstrap {
return this;
}
- public DubboBootstrap metadataReport(List<MetadataReportConfig> metadataReportConfigs) {
+ public DubboBootstrap metadataReports(List<MetadataReportConfig> metadataReportConfigs) {
+ if (CollectionUtils.isEmpty(metadataReportConfigs)) {
+ return this;
+ }
+
configManager.addMetadataReports(metadataReportConfigs);
return this;
}
@@ -235,7 +245,10 @@ public class DubboBootstrap {
* @param registryConfigs the multiple instances of {@link RegistryConfig}
* @return current {@link DubboBootstrap} instance
*/
- public DubboBootstrap registries(Iterable<RegistryConfig> registryConfigs) {
+ public DubboBootstrap registries(List<RegistryConfig> registryConfigs) {
+ if (CollectionUtils.isEmpty(registryConfigs)) {
+ return this;
+ }
registryConfigs.forEach(this::registry);
return this;
}
@@ -257,6 +270,9 @@ public class DubboBootstrap {
}
public DubboBootstrap protocols(List<ProtocolConfig> protocolConfigs) {
+ if (CollectionUtils.isEmpty(protocolConfigs)) {
+ return this;
+ }
configManager.addProtocols(protocolConfigs);
return this;
}
@@ -277,6 +293,14 @@ public class DubboBootstrap {
return this;
}
+ public DubboBootstrap services(List<ServiceConfig> serviceConfigs) {
+ if (CollectionUtils.isEmpty(serviceConfigs)) {
+ return this;
+ }
+ serviceConfigs.forEach(configManager::addService);
+ return this;
+ }
+
// {@link Reference} correlative methods
public <S> DubboBootstrap reference(Consumer<ReferenceBuilder<S>> consumerBuilder) {
return reference(DEFAULT_REFERENCE_ID, consumerBuilder);
@@ -293,6 +317,15 @@ public class DubboBootstrap {
return this;
}
+ public DubboBootstrap references(List<ReferenceConfig> referenceConfigs) {
+ if (CollectionUtils.isEmpty(referenceConfigs)) {
+ return this;
+ }
+
+ referenceConfigs.forEach(configManager::addReference);
+ return this;
+ }
+
// {@link ProviderConfig} correlative methods
public DubboBootstrap provider(Consumer<ProviderBuilder> builderConsumer) {
return provider(DEFAULT_PROVIDER_ID, builderConsumer);
@@ -309,6 +342,10 @@ public class DubboBootstrap {
}
public DubboBootstrap providers(List<ProviderConfig> providerConfigs) {
+ if (CollectionUtils.isEmpty(providerConfigs)) {
+ return this;
+ }
+
providerConfigs.forEach(configManager::addProvider);
return this;
}
@@ -329,20 +366,47 @@ public class DubboBootstrap {
}
public DubboBootstrap consumers(List<ConsumerConfig> consumerConfigs) {
+ if (CollectionUtils.isEmpty(consumerConfigs)) {
+ return this;
+ }
+
consumerConfigs.forEach(configManager::addConsumer);
return this;
}
// {@link ConfigCenterConfig} correlative methods
public DubboBootstrap configCenter(ConfigCenterConfig configCenterConfig) {
- return configCenter(asList(configCenterConfig));
+ return configCenters(asList(configCenterConfig));
}
- public DubboBootstrap configCenter(List<ConfigCenterConfig> configCenterConfigs) {
+ public DubboBootstrap configCenters(List<ConfigCenterConfig> configCenterConfigs) {
+ if (CollectionUtils.isEmpty(configCenterConfigs)) {
+ return this;
+ }
configManager.addConfigCenters(configCenterConfigs);
return this;
}
+ public DubboBootstrap monitor(MonitorConfig monitor) {
+ configManager.setMonitor(monitor);
+ return this;
+ }
+
+ public DubboBootstrap metrics(MetricsConfig metrics) {
+ configManager.setMetrics(metrics);
+ return this;
+ }
+
+ public DubboBootstrap module(ModuleConfig module) {
+ configManager.setModule(module);
+ return this;
+ }
+
+ public DubboBootstrap cache(ReferenceConfigCache cache) {
+ this.cache = cache;
+ return this;
+ }
+
/**
* Initialize
*/
@@ -471,6 +535,8 @@ public class DubboBootstrap {
registerServiceInstance(applicationConfig);
}
+ referServices();
+
started = true;
if (logger.isInfoEnabled()) {
@@ -660,6 +726,13 @@ public class DubboBootstrap {
serviceConfig.export();
}
+ private void referServices() {
+ if (cache == null) {
+ cache = ReferenceConfigCache.getCache();
+ }
+ configManager.getReferenceConfigs().forEach(cache::get);
+ }
+
public boolean isOnlyRegisterProvider() {
return onlyRegisterProvider;
}
@@ -693,7 +766,7 @@ public class DubboBootstrap {
}
/**
- * If use rest protocol if there's one, otherwise, choose the first one available.
+ * Use rest protocol if there's one, otherwise, choose the first one available.
*
* @return
*/
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
index 5819a50..b4f83b9 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
@@ -634,6 +634,7 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
private void createApplicationIfAbsent() {
if (this.application != null) {
+ this.application.refresh();
return;
}
ConfigManager configManager = ConfigManager.getInstance();
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/ConfigManager.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
index 07895ec..56abecc 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
@@ -24,6 +24,7 @@ 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.MetricsConfig;
import org.apache.dubbo.config.ModuleConfig;
import org.apache.dubbo.config.MonitorConfig;
import org.apache.dubbo.config.ProtocolConfig;
@@ -96,6 +97,7 @@ public class ConfigManager {
private volatile ModuleConfig module;
private volatile ApplicationConfig application;
private volatile MonitorConfig monitor;
+ private volatile MetricsConfig metrics;
private final Map<String, ProtocolConfig> protocols = new ConcurrentHashMap<>();
private final Map<String, RegistryConfig> registries = new ConcurrentHashMap<>();
@@ -154,6 +156,17 @@ public class ConfigManager {
return ofNullable(module);
}
+ public void setMetrics(MetricsConfig metrics) {
+ if (metrics != null) {
+ checkDuplicate(this.metrics, metrics);
+ this.metrics = metrics;
+ }
+ }
+
+ public Optional<MetricsConfig> getMetrics() {
+ return ofNullable(metrics);
+ }
+
// ConfigCenterConfig correlative methods
public void addConfigCenter(ConfigCenterConfig configCenter) {
diff --git a/dubbo-config/dubbo-config-spring/pom.xml b/dubbo-config/dubbo-config-spring/pom.xml
index 9d94fa9..216c18c 100644
--- a/dubbo-config/dubbo-config-spring/pom.xml
+++ b/dubbo-config/dubbo-config-spring/pom.xml
@@ -36,6 +36,11 @@
<version>${project.parent.version}</version>
</dependency>
<dependency>
+ <groupId>org.apache.dubbo</groupId>
+ <artifactId>dubbo-bootstrap</artifactId>
+ <version>${project.parent.version}</version>
+ </dependency>
+ <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ApplicationBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ApplicationBean.java
new file mode 100644
index 0000000..c1d0882
--- /dev/null
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ApplicationBean.java
@@ -0,0 +1,89 @@
+/*
+ * 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.config.spring;
+
+
+import org.apache.dubbo.bootstrap.DubboBootstrap;
+import org.apache.dubbo.common.utils.CollectionUtils;
+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.MetricsConfig;
+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 org.apache.dubbo.config.spring.util.BeanFactoryUtils;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+
+import java.util.List;
+
+public class ApplicationBean extends ApplicationConfig implements ApplicationListener<ApplicationEvent>, ApplicationContextAware {
+
+ private ApplicationContext applicationContext;
+
+ @Override
+ public void onApplicationEvent(ApplicationEvent event) {
+ if (event instanceof ContextRefreshedEvent) {
+ List<RegistryConfig> registries = getBeans(RegistryConfig.class);
+ List<ProtocolConfig> protocols = getBeans(ProtocolConfig.class);
+ List<ConfigCenterConfig> configs = getBeans(ConfigCenterConfig.class);
+ List<MetadataReportConfig> metadatas = getBeans(MetadataReportConfig.class);
+ List<MonitorConfig> monitors = getBeans(MonitorConfig.class);
+ List<ProviderConfig> providers = getBeans(ProviderConfig.class);
+ List<ConsumerConfig> consumers = getBeans(ConsumerConfig.class);
+ List<ModuleConfig> modules = getBeans(ModuleConfig.class);
+ List<MetricsConfig> metrics = getBeans(MetricsConfig.class);
+ List<ServiceConfig> services = getBeans(ServiceConfig.class);
+ List<ReferenceConfig> references = getBeans(ReferenceConfig.class);
+
+ DubboBootstrap bootstrap = new DubboBootstrap();
+ bootstrap.application(this)
+ .monitor(CollectionUtils.isNotEmpty(monitors) ? monitors.get(0) : null)
+ .module(CollectionUtils.isNotEmpty(modules) ? modules.get(0) : null)
+ .metrics(CollectionUtils.isNotEmpty(metrics) ? metrics.get(0) : null)
+ .registries(registries)
+ .protocols(protocols)
+ .configCenters(configs)
+ .metadataReports(metadatas)
+ .providers(providers)
+ .consumers(consumers)
+ .services(services)
+ .references(references)
+ .start();
+ }
+ }
+
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ this.applicationContext = applicationContext;
+ }
+
+ private <T> List<T> getBeans(Class<T> clazz) {
+ return BeanFactoryUtils.getBeans(applicationContext, new String[]{""}, clazz);
+ }
+}
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java
index 4a07e83..586cb22 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.annotation.Reference;
import org.apache.dubbo.config.spring.extension.SpringExtensionFactory;
import org.apache.dubbo.config.support.Parameter;
+import org.apache.dubbo.config.utils.ReferenceConfigCache;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.beans.factory.DisposableBean;
@@ -53,7 +54,7 @@ public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean,
@Override
public Object getObject() {
- return get();
+ return ReferenceConfigCache.getCache().get(this);
}
@Override
diff --git a/dubbo-demo/dubbo-demo-api/dubbo-demo-api-provider/pom.xml b/dubbo-demo/dubbo-demo-api/dubbo-demo-api-provider/pom.xml
index 29e2bc7..8584191 100644
--- a/dubbo-demo/dubbo-demo-api/dubbo-demo-api-provider/pom.xml
+++ b/dubbo-demo/dubbo-demo-api/dubbo-demo-api-provider/pom.xml
@@ -52,6 +52,10 @@
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
+ <artifactId>dubbo-registry-zookeeper</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-rpc-dubbo</artifactId>
</dependency>
<dependency>