diff --git a/pom.xml b/pom.xml index 0b86ba92..104017d2 100644 --- a/pom.xml +++ b/pom.xml @@ -88,8 +88,7 @@ 1.7.25 - 2.7.3 - 2.7.3 + 2.7.4.1 4.0.1 @@ -132,7 +131,7 @@ - + org.springframework.boot spring-boot-dependencies @@ -228,10 +227,31 @@ import + + + org.apache.dubbo + dubbo-dependencies-bom + ${dubbo.version} + pom + import + + + org.springframework + spring-framework-bom + + + + org.apache.dubbo dubbo-spring-boot-starter - ${dubbo-spring-boot.version} + ${dubbo.version} + + + + org.apache.dubbo + dubbo-spring-boot-actuator + ${dubbo.version} @@ -241,15 +261,7 @@ org.springframework - spring - - - javax.servlet - servlet-api - - - log4j - log4j + spring-context @@ -420,5 +432,4 @@ - \ No newline at end of file diff --git a/spring-cloud-alibaba-dubbo/pom.xml b/spring-cloud-alibaba-dubbo/pom.xml index ee71456f..b56f7371 100644 --- a/spring-cloud-alibaba-dubbo/pom.xml +++ b/spring-cloud-alibaba-dubbo/pom.xml @@ -13,30 +13,6 @@ spring-cloud-alibaba-dubbo Spring Cloud Alibaba Dubbo - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - org.apache.dubbo - dubbo-dependencies-bom - ${dubbo.version} - pom - import - - - - - @@ -162,7 +138,6 @@ org.apache.dubbo dubbo-spring-boot-actuator - ${dubbo-spring-boot.version} true diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java index 18315fd6..de8fb254 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java @@ -118,7 +118,7 @@ public class DubboServiceDiscoveryAutoConfiguration { /** * NacosDiscoveryAutoConfiguration. */ - public static final String NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME = "com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration"; + public static final String NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME = "com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration"; private final DubboServiceMetadataRepository dubboServiceMetadataRepository; diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/condition/MissingSpringCloudRegistryConfigPropertyCondition.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/condition/MissingSpringCloudRegistryConfigPropertyCondition.java index 59890429..0ea71581 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/condition/MissingSpringCloudRegistryConfigPropertyCondition.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/condition/MissingSpringCloudRegistryConfigPropertyCondition.java @@ -29,7 +29,7 @@ import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.util.StringUtils; import static com.alibaba.cloud.dubbo.registry.SpringCloudRegistryFactory.PROTOCOL; -import static org.apache.dubbo.config.spring.util.PropertySourcesUtils.getSubProperties; +import static org.apache.dubbo.config.spring.util.PropertySourcesUtils.getPrefixedProperties; /** * Missing {@link SpringCloudRegistry} Property {@link Condition}. @@ -61,8 +61,8 @@ public class MissingSpringCloudRegistryConfigPropertyCondition "'spring-cloud' protocol was found from 'dubbo.registry.address'"); } - Map properties = getSubProperties(environment, - "dubbo.registries."); + Map properties = getPrefixedProperties( + environment.getPropertySources(), "dubbo.registries."); boolean found = properties.entrySet().stream().anyMatch(entry -> { String key = entry.getKey(); diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboNonWebApplicationEnvironmentPostProcessor.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboNonWebApplicationEnvironmentPostProcessor.java index 77b7c942..4de58946 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboNonWebApplicationEnvironmentPostProcessor.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboNonWebApplicationEnvironmentPostProcessor.java @@ -35,7 +35,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_PROTOCOL; -import static org.apache.dubbo.config.spring.util.PropertySourcesUtils.getSubProperties; +import static org.apache.dubbo.config.spring.util.PropertySourcesUtils.getPrefixedProperties; /** * Dubbo {@link WebApplicationType#NONE Non-Web Application} @@ -88,7 +88,7 @@ public class DubboNonWebApplicationEnvironmentPostProcessor WebApplicationType webApplicationType = application.getWebApplicationType(); if (!WebApplicationType.NONE.equals(webApplicationType)) { // Just works in - // Non-Web Application + // Non-Web Application if (logger.isDebugEnabled()) { logger.debug( "Current application is a Web Application, the process will be ignored."); @@ -149,8 +149,8 @@ public class DubboNonWebApplicationEnvironmentPostProcessor String restPort = null; - Map subProperties = getSubProperties(environment, - PROTOCOLS_PROPERTY_NAME_PREFIX); + Map subProperties = getPrefixedProperties( + environment.getPropertySources(), PROTOCOLS_PROPERTY_NAME_PREFIX); Properties properties = new Properties(); @@ -158,8 +158,8 @@ public class DubboNonWebApplicationEnvironmentPostProcessor for (String propertyName : properties.stringPropertyNames()) { if (propertyName.endsWith(PROTOCOL_NAME_PROPERTY_NAME_SUFFIX)) { // protocol - // name - // property + // name + // property String protocol = properties.getProperty(propertyName); if (isRestProtocol(protocol)) { String beanName = resolveBeanName(propertyName); diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml index 94d39bb8..8bc3c8ca 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml @@ -136,18 +136,6 @@ - - - - org.apache.dubbo - dubbo-bom - ${dubbo.version} - pom - import - - - - diff --git a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigHealthIndicator.java b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigHealthIndicator.java index 7becf481..482909d8 100644 --- a/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigHealthIndicator.java +++ b/spring-cloud-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigHealthIndicator.java @@ -20,9 +20,13 @@ import com.alibaba.nacos.api.config.ConfigService; import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.Health; +import org.springframework.boot.actuate.health.HealthIndicator; /** + * The {@link HealthIndicator} for Nacos Config + * * @author xiaojing + * @author Mercy */ public class NacosConfigHealthIndicator extends AbstractHealthIndicator { @@ -34,10 +38,21 @@ public class NacosConfigHealthIndicator extends AbstractHealthIndicator { @Override protected void doHealthCheck(Health.Builder builder) throws Exception { - builder.up(); - + // Just return "UP" or "DOWN" String status = configService.getServerStatus(); + // Set the status to Builder builder.status(status); + switch (status) { + case "UP": + builder.up(); + break; + case "DOWN": + builder.down(); + break; + default: + builder.unknown(); + break; + } } } diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java index c030336d..6ac2b159 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java @@ -19,6 +19,7 @@ package com.alibaba.cloud.nacos.discovery; import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -30,6 +31,7 @@ import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.TaskScheduler; /** * @author xiaojing @@ -52,10 +54,10 @@ public class NacosDiscoveryClientConfiguration { @Bean @ConditionalOnMissingBean - @ConditionalOnProperty(value = "spring.cloud.nacos.discovery.watch.enabled", - matchIfMissing = true) - public NacosWatch nacosWatch(NacosDiscoveryProperties nacosDiscoveryProperties) { - return new NacosWatch(nacosDiscoveryProperties); + @ConditionalOnProperty(value = "spring.cloud.nacos.discovery.watch.enabled", matchIfMissing = true) + public NacosWatch nacosWatch(NacosDiscoveryProperties nacosDiscoveryProperties, + ObjectProvider taskScheduler) { + return new NacosWatch(nacosDiscoveryProperties, taskScheduler); } } diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java index 36761d47..edfa637f 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java @@ -16,18 +16,15 @@ package com.alibaba.cloud.nacos.discovery; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.nacos.api.naming.listener.EventListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.cloud.client.discovery.event.HeartbeatEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; @@ -54,10 +51,6 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl private ScheduledFuture watchFuture; - private Set cacheServices = new HashSet<>(); - - private HashMap subscribeListeners = new HashMap<>(); - public NacosWatch(NacosDiscoveryProperties properties) { this(properties, getTaskScheduler()); } @@ -67,8 +60,21 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl this.taskScheduler = taskScheduler; } + /** + * The constructor with {@link NacosDiscoveryProperties} bean and the optional + * {@link TaskScheduler} bean + * @param properties {@link NacosDiscoveryProperties} bean + * @param taskScheduler the optional {@link TaskScheduler} bean + * @since 2.2.0 + */ + public NacosWatch(NacosDiscoveryProperties properties, + ObjectProvider taskScheduler) { + this(properties, taskScheduler.getIfAvailable(NacosWatch::getTaskScheduler)); + } + private static ThreadPoolTaskScheduler getTaskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); + taskScheduler.setBeanName("Nacso-Watch-Task-Scheduler"); taskScheduler.initialize(); return taskScheduler; } diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/actuate/health/NacosDiscoveryHealthIndicator.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/actuate/health/NacosDiscoveryHealthIndicator.java new file mode 100644 index 00000000..1854a42a --- /dev/null +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/actuate/health/NacosDiscoveryHealthIndicator.java @@ -0,0 +1,58 @@ +/* + * 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 com.alibaba.cloud.nacos.discovery.actuate.health; + +import com.alibaba.nacos.api.naming.NamingService; + +import org.springframework.boot.actuate.health.AbstractHealthIndicator; +import org.springframework.boot.actuate.health.Health; +import org.springframework.boot.actuate.health.HealthIndicator; + +/** + * The {@link HealthIndicator} for Nacos Discovery + * + * @author Mercy + * @since 2.2.0 + * @see HealthIndicator + */ +public class NacosDiscoveryHealthIndicator extends AbstractHealthIndicator { + + private final NamingService namingService; + + public NacosDiscoveryHealthIndicator(NamingService namingService) { + this.namingService = namingService; + } + + @Override + protected void doHealthCheck(Health.Builder builder) throws Exception { + // Just return "UP" or "DOWN" + String status = namingService.getServerStatus(); + // Set the status to Builder + builder.status(status); + switch (status) { + case "UP": + builder.up(); + break; + case "DOWN": + builder.down(); + break; + default: + builder.unknown(); + break; + } + } +} diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java index 0fdffd99..78635ae1 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java @@ -18,16 +18,22 @@ package com.alibaba.cloud.nacos.endpoint; import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.discovery.actuate.health.NacosDiscoveryHealthIndicator; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; +import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator; import org.springframework.boot.actuate.endpoint.annotation.Endpoint; +import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** + * The AutoConfiguration class for Nacos Discovery's Endpoints + * * @author xiaojing + * @author Mercy */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass(Endpoint.class) @@ -42,4 +48,11 @@ public class NacosDiscoveryEndpointAutoConfiguration { return new NacosDiscoveryEndpoint(nacosDiscoveryProperties); } + @Bean + @ConditionalOnEnabledHealthIndicator("nacos-discovery") + public HealthIndicator nacosDiscoveryHealthIndicator( + NacosDiscoveryProperties nacosDiscoveryProperties) { + return new NacosDiscoveryHealthIndicator( + nacosDiscoveryProperties.namingServiceInstance()); + } } diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java index af81f0ac..b0974a55 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java @@ -28,6 +28,8 @@ import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.client.serviceregistry.ServiceRegistry; import org.springframework.util.StringUtils; +import static org.springframework.util.ReflectionUtils.rethrowRuntimeException; + /** * @author xiaojing * @author Mercy @@ -66,6 +68,9 @@ public class NacosServiceRegistry implements ServiceRegistry { catch (Exception e) { log.error("nacos registry, {} register failed...{},", serviceId, registration.toString(), e); + // rethrow a RuntimeException if the registration is failed. + // issue : https://github.com/alibaba/spring-cloud-alibaba/issues/1132 + rethrowRuntimeException(e); } } diff --git a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfigurationTest.java b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfigurationTest.java index 92e93a1a..862799cd 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfigurationTest.java +++ b/spring-cloud-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfigurationTest.java @@ -22,6 +22,9 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.commons.util.UtilAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import static org.assertj.core.api.Assertions.assertThat; @@ -33,7 +36,12 @@ public class NacosDiscoveryClientConfigurationTest { private ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(UtilAutoConfiguration.class, NacosDiscoveryAutoConfiguration.class, - NacosDiscoveryClientConfiguration.class)); + NacosDiscoveryClientConfiguration.class, this.getClass())); + + @Bean + public TaskScheduler taskScheduler() { + return new ThreadPoolTaskScheduler(); + } @Test public void testDefaultInitialization() {