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>