From bdaacbc17d8f189c4ebbb34129883e1d0552dfcf Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Fri, 9 Aug 2019 15:31:07 +0800 Subject: [PATCH] spring delegate to bootstrap. --- .../dubbo/bootstrap/DubboBootstrap.java | 83 +++++++++++++++-- .../dubbo/config/AbstractInterfaceConfig.java | 1 + .../dubbo/config/context/ConfigManager.java | 13 +++ dubbo-config/dubbo-config-spring/pom.xml | 5 ++ .../dubbo/config/spring/ApplicationBean.java | 89 +++++++++++++++++++ .../dubbo/config/spring/ReferenceBean.java | 3 +- .../dubbo-demo-api-provider/pom.xml | 4 + 7 files changed, 192 insertions(+), 6 deletions(-) create mode 100644 dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ApplicationBean.java 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 005f11d7b8..418923879e 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 metadataReportConfigs) { + public DubboBootstrap metadataReports(List 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 registryConfigs) { + public DubboBootstrap registries(List registryConfigs) { + if (CollectionUtils.isEmpty(registryConfigs)) { + return this; + } registryConfigs.forEach(this::registry); return this; } @@ -257,6 +270,9 @@ public class DubboBootstrap { } public DubboBootstrap protocols(List 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 serviceConfigs) { + if (CollectionUtils.isEmpty(serviceConfigs)) { + return this; + } + serviceConfigs.forEach(configManager::addService); + return this; + } + // {@link Reference} correlative methods public DubboBootstrap reference(Consumer> consumerBuilder) { return reference(DEFAULT_REFERENCE_ID, consumerBuilder); @@ -293,6 +317,15 @@ public class DubboBootstrap { return this; } + public DubboBootstrap references(List referenceConfigs) { + if (CollectionUtils.isEmpty(referenceConfigs)) { + return this; + } + + referenceConfigs.forEach(configManager::addReference); + return this; + } + // {@link ProviderConfig} correlative methods public DubboBootstrap provider(Consumer builderConsumer) { return provider(DEFAULT_PROVIDER_ID, builderConsumer); @@ -309,6 +342,10 @@ public class DubboBootstrap { } public DubboBootstrap providers(List providerConfigs) { + if (CollectionUtils.isEmpty(providerConfigs)) { + return this; + } + providerConfigs.forEach(configManager::addProvider); return this; } @@ -329,20 +366,47 @@ public class DubboBootstrap { } public DubboBootstrap consumers(List 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 configCenterConfigs) { + public DubboBootstrap configCenters(List 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 5819a50023..b4f83b9e7b 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 07895ecf97..56abecc83a 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 protocols = new ConcurrentHashMap<>(); private final Map 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 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 9d94fa9189..216c18c7dc 100644 --- a/dubbo-config/dubbo-config-spring/pom.xml +++ b/dubbo-config/dubbo-config-spring/pom.xml @@ -35,6 +35,11 @@ dubbo-config-api ${project.parent.version} + + org.apache.dubbo + dubbo-bootstrap + ${project.parent.version} + org.springframework spring-beans 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 0000000000..c1d0882dfc --- /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, ApplicationContextAware { + + private ApplicationContext applicationContext; + + @Override + public void onApplicationEvent(ApplicationEvent event) { + if (event instanceof ContextRefreshedEvent) { + List registries = getBeans(RegistryConfig.class); + List protocols = getBeans(ProtocolConfig.class); + List configs = getBeans(ConfigCenterConfig.class); + List metadatas = getBeans(MetadataReportConfig.class); + List monitors = getBeans(MonitorConfig.class); + List providers = getBeans(ProviderConfig.class); + List consumers = getBeans(ConsumerConfig.class); + List modules = getBeans(ModuleConfig.class); + List metrics = getBeans(MetricsConfig.class); + List services = getBeans(ServiceConfig.class); + List 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 List getBeans(Class 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 4a07e83557..586cb22f6b 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 extends ReferenceConfig 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 29e2bc7e90..8584191149 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 @@ -50,6 +50,10 @@ org.apache.dubbo dubbo-registry-multicast + + org.apache.dubbo + dubbo-registry-zookeeper + org.apache.dubbo dubbo-rpc-dubbo