From b3c26c509e617ad700c2f46305db91c95b2d26de Mon Sep 17 00:00:00 2001 From: mercyblitz <mercyblitz@gmail.com> Date: Tue, 26 Feb 2019 14:50:26 +0800 Subject: [PATCH 1/5] Polish : /spring-cloud-incubator/spring-cloud-alibaba#386 : supports Spring Cloud Netflix Eureka and Spring Cloud Zookeeper --- spring-cloud-alibaba-dubbo/pom.xml | 104 ++++---- ...BalancedRestTemplateAutoConfiguration.java | 5 +- .../DubboMetadataAutoConfiguration.java | 6 + .../DubboOpenFeignAutoConfiguration.java | 6 +- .../DubboServiceBeanMetadataResolver.java | 2 +- .../openfeign/TargeterBeanPostProcessor.java | 15 +- .../registry/AbstractRegistrationFactory.java | 49 ++++ .../registry/DefaultRegistrationFactory.java | 35 +++ ...ation.java => DelegatingRegistration.java} | 4 +- .../dubbo/registry/RegistrationFactory.java | 42 ++++ .../dubbo/registry/SpringCloudRegistry.java | 167 +++++++++---- .../registry/SpringCloudRegistryFactory.java | 7 +- .../ZookeeperRegistrationFactory.java | 54 +++++ .../eureka/EurekaRegistrationFactory.java | 62 +++++ .../main/resources/META-INF/spring.factories | 7 +- .../bootstrap/DubboSpringCloudBootstrap.java | 222 ------------------ .../src/test/resources/application.yaml | 2 +- .../src/test/resources/bootstrap.yaml | 19 +- .../DubboSpringCloudProviderBootstrap.java | 37 +++ .../dubbo/service/StandardRestService.java | 8 +- .../alibaba/dubbo/service/RestService.java | 3 +- .../cloud/alibaba/dubbo/service/User.java | 6 +- 22 files changed, 509 insertions(+), 353 deletions(-) create mode 100644 spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/AbstractRegistrationFactory.java create mode 100644 spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DefaultRegistrationFactory.java rename spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/{DubboRegistration.java => DelegatingRegistration.java} (94%) create mode 100644 spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/RegistrationFactory.java create mode 100644 spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/apache/zookeeper/ZookeeperRegistrationFactory.java create mode 100644 spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/netflix/eureka/EurekaRegistrationFactory.java delete mode 100644 spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudBootstrap.java create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java rename {spring-cloud-alibaba-dubbo/src/test => spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main}/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java (94%) rename {spring-cloud-alibaba-dubbo/src/test => spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main}/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java (98%) rename {spring-cloud-alibaba-dubbo/src/test => spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main}/java/org/springframework/cloud/alibaba/dubbo/service/User.java (94%) diff --git a/spring-cloud-alibaba-dubbo/pom.xml b/spring-cloud-alibaba-dubbo/pom.xml index 61ccc4718..5dbf37ac2 100644 --- a/spring-cloud-alibaba-dubbo/pom.xml +++ b/spring-cloud-alibaba-dubbo/pom.xml @@ -17,6 +17,8 @@ <dubbo.version>2.6.5</dubbo.version> <dubbo-spring-boot.version>0.2.1.RELEASE</dubbo-spring-boot.version> <dubbo-registry-nacos.version>0.0.2</dubbo-registry-nacos.version> + <spring-cloud-zookeeper.version>2.1.0.RELEASE</spring-cloud-zookeeper.version> + <curator.version>4.0.1</curator.version> </properties> <dependencyManagement> @@ -53,6 +55,54 @@ <optional>true</optional> </dependency> + <!-- Eureka Service Discovery --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> + <optional>true</optional> + </dependency> + + <!-- Zookeeper Service Discovery --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> + <version>${spring-cloud-zookeeper.version}</version> + <optional>true</optional> + <exclusions> + <exclusion> + <groupId>org.apache.zookeeper</groupId> + <artifactId>zookeeper</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>org.apache.zookeeper</groupId> + <artifactId>zookeeper</artifactId> + <version>3.4.12</version> + <optional>true</optional> + <exclusions> + <exclusion> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>org.apache.curator</groupId> + <artifactId>curator-framework</artifactId> + <version>${curator.version}</version> + <optional>true</optional> + </dependency> + + <!-- Nacos Service Discovery --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> + <optional>true</optional> + </dependency> + <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-actuator-autoconfigure</artifactId> @@ -90,11 +140,6 @@ <optional>true</optional> </dependency> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-alibaba-nacos-config</artifactId> - </dependency> - <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> @@ -118,37 +163,6 @@ <artifactId>netty-all</artifactId> </dependency> - <!-- REST support dependencies --> - <dependency> - <groupId>org.jboss.resteasy</groupId> - <artifactId>resteasy-jaxrs</artifactId> - </dependency> - - <dependency> - <groupId>org.jboss.resteasy</groupId> - <artifactId>resteasy-client</artifactId> - </dependency> - - <dependency> - <groupId>org.jboss.resteasy</groupId> - <artifactId>resteasy-netty4</artifactId> - </dependency> - - <dependency> - <groupId>javax.validation</groupId> - <artifactId>validation-api</artifactId> - </dependency> - - <dependency> - <groupId>org.jboss.resteasy</groupId> - <artifactId>resteasy-jackson-provider</artifactId> - </dependency> - - <dependency> - <groupId>org.jboss.resteasy</groupId> - <artifactId>resteasy-jaxb-provider</artifactId> - </dependency> - <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> @@ -162,11 +176,6 @@ <version>9.7.0</version> </dependency> - <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-lang3</artifactId> - </dependency> - <!-- Testing --> <dependency> <groupId>junit</groupId> @@ -192,19 +201,6 @@ <scope>test</scope> </dependency> - <!-- Nacos Service Discovery --> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> - <scope>test</scope> - </dependency> - - <!-- Eureka Service Discovery --> - <!--<dependency>--> - <!--<groupId>org.springframework.cloud</groupId>--> - <!--<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>--> - <!--<scope>test</scope>--> - <!--</dependency>--> </dependencies> </project> \ No newline at end of file diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboLoadBalancedRestTemplateAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboLoadBalancedRestTemplateAutoConfiguration.java index 15eb6cf33..e97acfca3 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboLoadBalancedRestTemplateAutoConfiguration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboLoadBalancedRestTemplateAutoConfiguration.java @@ -33,7 +33,6 @@ import org.springframework.cloud.alibaba.dubbo.metadata.repository.DubboServiceM import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceExecutionContextFactory; import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceFactory; import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration; import org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor; import org.springframework.cloud.client.loadbalancer.RestTemplateCustomizer; import org.springframework.context.annotation.Configuration; @@ -55,8 +54,8 @@ import java.util.Map; * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> */ @Configuration -@ConditionalOnClass(RestTemplate.class) -@AutoConfigureAfter(LoadBalancerAutoConfiguration.class) +@ConditionalOnClass(name = {"org.springframework.web.client.RestTemplate"}) +@AutoConfigureAfter(name = {"org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration"}) public class DubboLoadBalancedRestTemplateAutoConfiguration implements BeanClassLoaderAware { private static final Class<DubboTransported> DUBBO_TRANSPORTED_CLASS = DubboTransported.class; diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java index 89a50578a..e53a2ae4f 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java @@ -66,6 +66,12 @@ public class DubboMetadataAutoConfiguration { protocolConfig = iterator.hasNext() ? iterator.next() : null; } + if (protocolConfig == null) { + protocolConfig = new ProtocolConfig(); + protocolConfig.setName(DEFAULT_PROTOCOL); + protocolConfig.setPort(20880); + } + return protocolConfig; } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java index 55d2f0a94..89df5ec77 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java @@ -17,7 +17,6 @@ package org.springframework.cloud.alibaba.dubbo.autoconfigure; import feign.Contract; -import feign.Feign; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -28,7 +27,6 @@ import org.springframework.cloud.alibaba.dubbo.metadata.resolver.MetadataResolve import org.springframework.cloud.alibaba.dubbo.openfeign.TargeterBeanPostProcessor; import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceExecutionContextFactory; import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceFactory; -import org.springframework.cloud.openfeign.FeignAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; @@ -39,8 +37,8 @@ import org.springframework.core.env.Environment; * * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> */ -@ConditionalOnClass(value = Feign.class) -@AutoConfigureAfter(FeignAutoConfiguration.class) +@ConditionalOnClass(name = {"feign.Feign"}) +@AutoConfigureAfter(name = {"org.springframework.cloud.openfeign.FeignAutoConfiguration"}) @Configuration public class DubboOpenFeignAutoConfiguration { diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/metadata/resolver/DubboServiceBeanMetadataResolver.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/metadata/resolver/DubboServiceBeanMetadataResolver.java index e3704dae9..4a966b150 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/metadata/resolver/DubboServiceBeanMetadataResolver.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/metadata/resolver/DubboServiceBeanMetadataResolver.java @@ -84,7 +84,7 @@ public class DubboServiceBeanMetadataResolver implements BeanClassLoaderAware, S Stream.of(CONTRACT_CLASS_NAMES) .filter(this::isClassPresent) // filter the existed classes .map(this::loadContractClass) // load Contract Class - .map(this::createContract) // create instance by the specified class + .map(this::createContract) // createServiceInstance instance by the specified class .forEach(contracts::add); // add the Contract instance into contracts this.contracts = Collections.unmodifiableCollection(contracts); diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/openfeign/TargeterBeanPostProcessor.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/openfeign/TargeterBeanPostProcessor.java index d055709e5..a4a3c77f0 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/openfeign/TargeterBeanPostProcessor.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/openfeign/TargeterBeanPostProcessor.java @@ -26,6 +26,7 @@ import org.springframework.core.env.Environment; import static java.lang.reflect.Proxy.newProxyInstance; import static org.springframework.util.ClassUtils.getUserClass; +import static org.springframework.util.ClassUtils.isPresent; import static org.springframework.util.ClassUtils.resolveClassName; /** @@ -64,12 +65,14 @@ public class TargeterBeanPostProcessor implements BeanPostProcessor, BeanClassLo @Override public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException { - Class<?> beanClass = getUserClass(bean.getClass()); - Class<?> targetClass = resolveClassName(TARGETER_CLASS_NAME, classLoader); - if (targetClass.isAssignableFrom(beanClass)) { - return newProxyInstance(classLoader, new Class[]{targetClass}, - new TargeterInvocationHandler(bean, environment, dubboServiceMetadataRepository, - dubboGenericServiceFactory,contextFactory)); + if (isPresent(TARGETER_CLASS_NAME, classLoader)) { + Class<?> beanClass = getUserClass(bean.getClass()); + Class<?> targetClass = resolveClassName(TARGETER_CLASS_NAME, classLoader); + if (targetClass.isAssignableFrom(beanClass)) { + return newProxyInstance(classLoader, new Class[]{targetClass}, + new TargeterInvocationHandler(bean, environment, dubboServiceMetadataRepository, + dubboGenericServiceFactory, contextFactory)); + } } return bean; } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/AbstractRegistrationFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/AbstractRegistrationFactory.java new file mode 100644 index 000000000..41d06eb02 --- /dev/null +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/AbstractRegistrationFactory.java @@ -0,0 +1,49 @@ +/* + * 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.springframework.cloud.alibaba.dubbo.registry; + +import com.alibaba.dubbo.common.Constants; +import com.alibaba.dubbo.common.URL; +import com.alibaba.dubbo.common.utils.NetUtils; + +import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.serviceregistry.Registration; + +import java.util.LinkedHashMap; + +/** + * Abstract {@link RegistrationFactory} implementation + * <p> + * + * @param <T> The subclass of {@link Registration} + * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> + */ +public abstract class AbstractRegistrationFactory<T extends Registration> implements RegistrationFactory<T> { + + protected ServiceInstance createServiceInstance(String serviceName, URL url) { + // Append default category if absent + String category = url.getParameter(Constants.CATEGORY_KEY, Constants.DEFAULT_CATEGORY); + URL newURL = url.addParameter(Constants.CATEGORY_KEY, category); + newURL = newURL.addParameter(Constants.PROTOCOL_KEY, url.getProtocol()); + String ip = NetUtils.getLocalHost(); + int port = newURL.getParameter(Constants.BIND_PORT_KEY, url.getPort()); + DefaultServiceInstance serviceInstance = new DefaultServiceInstance(url.toIdentityString(), serviceName, ip, port, false); + serviceInstance.getMetadata().putAll(new LinkedHashMap<>(newURL.getParameters())); + return serviceInstance; + } +} diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DefaultRegistrationFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DefaultRegistrationFactory.java new file mode 100644 index 000000000..ac3e35f32 --- /dev/null +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DefaultRegistrationFactory.java @@ -0,0 +1,35 @@ +/* + * 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.springframework.cloud.alibaba.dubbo.registry; + +import com.alibaba.dubbo.common.URL; + +import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.context.ApplicationContext; + +/** + * Default {@link RegistrationFactory} + * + * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> + */ +public class DefaultRegistrationFactory extends AbstractRegistrationFactory<Registration> { + + @Override + public Registration create(String serviceName, URL url, ApplicationContext applicationContext) { + return new DelegatingRegistration(createServiceInstance(serviceName, url)); + } +} diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DubboRegistration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DelegatingRegistration.java similarity index 94% rename from spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DubboRegistration.java rename to spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DelegatingRegistration.java index 9a435ff27..e91831ddd 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DubboRegistration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DelegatingRegistration.java @@ -27,11 +27,11 @@ import java.util.Map; * * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> */ -class DubboRegistration implements Registration { +class DelegatingRegistration implements Registration { private final ServiceInstance delegate; - public DubboRegistration(ServiceInstance delegate) { + public DelegatingRegistration(ServiceInstance delegate) { this.delegate = delegate; } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/RegistrationFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/RegistrationFactory.java new file mode 100644 index 000000000..7d8d298cf --- /dev/null +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/RegistrationFactory.java @@ -0,0 +1,42 @@ +/* + * 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.springframework.cloud.alibaba.dubbo.registry; + +import com.alibaba.dubbo.common.URL; + +import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.context.ApplicationContext; + + +/** + * {@link Registration} Factory to createServiceInstance a instance of {@link Registration} + * + * @param <T> The subclass of {@link Registration} + * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> + */ +public interface RegistrationFactory<T extends Registration> { + + /** + * Create a instance of {@link T} + * + * @param serviceName The service name of Dubbo service interface + * @param url The Dubbo's URL + * @param applicationContext {@link ApplicationContext} + * @return a instance of {@link T} + */ + T create(String serviceName, URL url, ApplicationContext applicationContext); +} diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java index 8d05cbd0e..e02d10836 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java @@ -18,7 +18,7 @@ package org.springframework.cloud.alibaba.dubbo.registry; import com.alibaba.dubbo.common.Constants; import com.alibaba.dubbo.common.URL; -import com.alibaba.dubbo.common.utils.NetUtils; +import com.alibaba.dubbo.common.utils.NamedThreadFactory; import com.alibaba.dubbo.common.utils.UrlUtils; import com.alibaba.dubbo.registry.NotifyListener; import com.alibaba.dubbo.registry.RegistryFactory; @@ -26,11 +26,12 @@ import com.alibaba.dubbo.registry.support.FailbackRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.client.serviceregistry.ServiceRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.core.ResolvableType; import org.springframework.util.StringUtils; import java.util.ArrayList; @@ -38,11 +39,9 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Objects; -import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -50,6 +49,13 @@ import static com.alibaba.dubbo.common.Constants.CONFIGURATORS_CATEGORY; import static com.alibaba.dubbo.common.Constants.CONSUMERS_CATEGORY; import static com.alibaba.dubbo.common.Constants.PROVIDERS_CATEGORY; import static com.alibaba.dubbo.common.Constants.ROUTERS_CATEGORY; +import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; +import static org.springframework.beans.BeanUtils.instantiateClass; +import static org.springframework.core.ResolvableType.forInstance; +import static org.springframework.core.ResolvableType.forType; +import static org.springframework.core.io.support.SpringFactoriesLoader.loadFactoryNames; +import static org.springframework.util.ClassUtils.isPresent; +import static org.springframework.util.ClassUtils.resolveClassName; /** * Dubbo {@link RegistryFactory} uses Spring Cloud Service Registration abstraction, whose protocol is "spring-cloud" @@ -70,10 +76,6 @@ public class SpringCloudRegistry extends FailbackRegistry { private static final int CATEGORY_INDEX = 0; -// private static final int PROTOCOL_INDEX = CATEGORY_INDEX + 1; - -// private static final int SERVICE_INTERFACE_INDEX = PROTOCOL_INDEX + 1; - private static final int SERVICE_INTERFACE_INDEX = CATEGORY_INDEX + 1; private static final int SERVICE_VERSION_INDEX = SERVICE_INTERFACE_INDEX + 1; @@ -82,34 +84,122 @@ public class SpringCloudRegistry extends FailbackRegistry { private static final String WILDCARD = "*"; + private final Logger logger = LoggerFactory.getLogger(getClass()); + /** * The separator for service name */ private static final String SERVICE_NAME_SEPARATOR = ":"; + private final ApplicationContext applicationContext; + private final ServiceRegistry<Registration> serviceRegistry; private final DiscoveryClient discoveryClient; - private final Logger logger = LoggerFactory.getLogger(getClass()); + private final RegistrationFactory registrationFactory; /** - * {@link ScheduledExecutorService} lookup service names(only for Dubbo-OPS) + * The {@link ScheduledExecutorService Scheduler} to lookup the registered services */ - private volatile ScheduledExecutorService scheduledExecutorService; + private final ScheduledExecutorService registeredServicesLookupScheduler; + + /** + * The {@link ScheduledExecutorService Scheduler} to lookup all services (only for Dubbo-OPS) + */ + private volatile ScheduledExecutorService allServicesLookupScheduler; /** * The interval in second of lookup service names(only for Dubbo-OPS) */ - private static final long LOOKUP_INTERVAL = Long.getLong("dubbo.service.names.lookup.interval", 30); + private static final long ALL_SERVICES_LOOKUP_INTERVAL = Long.getLong("dubbo.all.services.lookup.interval", 30); + + /** + * The interval in second of lookup regigered service instances + */ + private static final long REGISTERED_SERVICES_LOOKUP_INTERVAL = Long.getLong("dubbo.registered.services.lookup.interval", 30); - public SpringCloudRegistry(URL url, ServiceRegistry<Registration> serviceRegistry, - DiscoveryClient discoveryClient) { + public SpringCloudRegistry(URL url, ApplicationContext applicationContext) { super(url); - this.serviceRegistry = serviceRegistry; - this.discoveryClient = discoveryClient; + this.applicationContext = applicationContext; + this.serviceRegistry = applicationContext.getBean(ServiceRegistry.class); + this.registrationFactory = buildRegistrationFactory(serviceRegistry, applicationContext.getClassLoader()); + this.discoveryClient = applicationContext.getBean(DiscoveryClient.class); + applicationContext.getClassLoader(); + this.registeredServicesLookupScheduler = newSingleThreadScheduledExecutor(new NamedThreadFactory("dubbo-registered-services-lookup-")); + } + + private RegistrationFactory buildRegistrationFactory(ServiceRegistry<Registration> serviceRegistry, + ClassLoader classLoader) { + RegistrationFactory registrationFactory = null; + List<String> factoryClassNames = loadFactoryNames(RegistrationFactory.class, classLoader); + + ResolvableType serviceRegistryType = forInstance(serviceRegistry); + // Get first generic Class + Class<?> registrationClass = resolveGenericClass(serviceRegistryType, ServiceRegistry.class, 0); + + for (String factoryClassName : factoryClassNames) { + if (isPresent(factoryClassName, classLoader)) { // ignore compilation issue + Class<?> factoryClass = resolveClassName(factoryClassName, classLoader); + ResolvableType registrationFactoryType = forType(factoryClass); + Class<?> actualRegistrationClass = resolveGenericClass(registrationFactoryType, RegistrationFactory.class, 0); + if (actualRegistrationClass.equals(registrationClass)) { + registrationFactory = (RegistrationFactory) instantiateClass(registrationFactoryType.getRawClass()); + break; + } + } + } + + if (registrationFactory == null) { + + if (logger.isWarnEnabled()) { + logger.warn("{} implementation can't be resolved by ServiceRegistry[{}]", + registrationClass.getSimpleName(), serviceRegistry.getClass().getName()); + } + + registrationFactory = new DefaultRegistrationFactory(); + } else { + if (logger.isInfoEnabled()) { + logger.info("{} has been resolved by ServiceRegistry[{}]", + registrationFactory.getClass().getName(), serviceRegistry.getClass().getName()); + } + } + + return registrationFactory; + } + + private Class<?> resolveGenericClass(ResolvableType implementedType, Class<?> interfaceClass, int index) { + + ResolvableType resolvableType = implementedType; + + OUTER: + while (true) { + + ResolvableType[] interfaceTypes = resolvableType.getInterfaces(); + + for (ResolvableType interfaceType : interfaceTypes) { + if (interfaceType.resolve().equals(interfaceClass)) { + resolvableType = interfaceType; + break OUTER; + } + } + + ResolvableType superType = resolvableType.getSuperType(); + + Class<?> superClass = superType.resolve(); + + if (Object.class.equals(superClass)) { + break; + } + + resolvableType = superType; + } + + + return resolvableType.resolveGeneric(index); } + @Override protected void doRegister(URL url) { final String serviceName = getServiceName(url); @@ -128,6 +218,12 @@ public class SpringCloudRegistry extends FailbackRegistry { protected void doSubscribe(URL url, NotifyListener listener) { List<String> serviceNames = getServiceNames(url, listener); doSubscribe(url, listener, serviceNames); + this.registeredServicesLookupScheduler.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + doSubscribe(url, listener, serviceNames); + } + }, REGISTERED_SERVICES_LOOKUP_INTERVAL, REGISTERED_SERVICES_LOOKUP_INTERVAL, TimeUnit.SECONDS); } @Override @@ -135,6 +231,10 @@ public class SpringCloudRegistry extends FailbackRegistry { if (isAdminProtocol(url)) { shutdownServiceNamesLookup(); } + + if (registeredServicesLookupScheduler != null) { + registeredServicesLookupScheduler.shutdown(); + } } @Override @@ -143,25 +243,13 @@ public class SpringCloudRegistry extends FailbackRegistry { } private void shutdownServiceNamesLookup() { - if (scheduledExecutorService != null) { - scheduledExecutorService.shutdown(); + if (allServicesLookupScheduler != null) { + allServicesLookupScheduler.shutdown(); } } private Registration createRegistration(String serviceName, URL url) { - return new DubboRegistration(createServiceInstance(serviceName, url)); - } - - private ServiceInstance createServiceInstance(String serviceName, URL url) { - // Append default category if absent - String category = url.getParameter(Constants.CATEGORY_KEY, Constants.DEFAULT_CATEGORY); - URL newURL = url.addParameter(Constants.CATEGORY_KEY, category); - newURL = newURL.addParameter(Constants.PROTOCOL_KEY, url.getProtocol()); - String ip = NetUtils.getLocalHost(); - int port = newURL.getParameter(Constants.BIND_PORT_KEY, url.getPort()); - DefaultServiceInstance serviceInstance = new DefaultServiceInstance(serviceName, ip, port, false); - serviceInstance.getMetadata().putAll(new LinkedHashMap<>(newURL.getParameters())); - return serviceInstance; + return registrationFactory.create(serviceName, url, applicationContext); } public static String getServiceName(URL url) { @@ -248,10 +336,6 @@ public class SpringCloudRegistry extends FailbackRegistry { return segments[CATEGORY_INDEX]; } -// public static String getProtocol(String[] segments) { -// return segments[PROTOCOL_INDEX]; -// } - public static String getServiceInterface(String[] segments) { return segments[SERVICE_INTERFACE_INDEX]; } @@ -288,7 +372,7 @@ public class SpringCloudRegistry extends FailbackRegistry { */ private List<String> getServiceNames(URL url, NotifyListener listener) { if (isAdminProtocol(url)) { - scheduleServiceNamesLookup(url, listener); + initAllServicesLookupScheduler(url, listener); return getServiceNamesForOps(url); } else { return doGetServiceNames(url); @@ -300,10 +384,10 @@ public class SpringCloudRegistry extends FailbackRegistry { return Constants.ADMIN_PROTOCOL.equals(url.getProtocol()); } - private void scheduleServiceNamesLookup(final URL url, final NotifyListener listener) { - if (scheduledExecutorService == null) { - scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); - scheduledExecutorService.scheduleAtFixedRate(new Runnable() { + private void initAllServicesLookupScheduler(final URL url, final NotifyListener listener) { + if (allServicesLookupScheduler == null) { + allServicesLookupScheduler = newSingleThreadScheduledExecutor(new NamedThreadFactory("dubbo-all-services-lookup-")); + allServicesLookupScheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { List<String> serviceNames = getAllServiceNames(); @@ -323,7 +407,7 @@ public class SpringCloudRegistry extends FailbackRegistry { }); doSubscribe(url, listener, serviceNames); } - }, LOOKUP_INTERVAL, LOOKUP_INTERVAL, TimeUnit.SECONDS); + }, ALL_SERVICES_LOOKUP_INTERVAL, ALL_SERVICES_LOOKUP_INTERVAL, TimeUnit.SECONDS); } } @@ -331,7 +415,6 @@ public class SpringCloudRegistry extends FailbackRegistry { for (String serviceName : serviceNames) { List<ServiceInstance> serviceInstances = discoveryClient.getInstances(serviceName); notifySubscriber(url, listener, serviceInstances); - // TODO Support Update notification event } } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistryFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistryFactory.java index 7402ff974..7b0a9169a 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistryFactory.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistryFactory.java @@ -20,9 +20,6 @@ import com.alibaba.dubbo.common.URL; import com.alibaba.dubbo.registry.Registry; import com.alibaba.dubbo.registry.RegistryFactory; -import org.springframework.cloud.client.discovery.DiscoveryClient; -import org.springframework.cloud.client.serviceregistry.Registration; -import org.springframework.cloud.client.serviceregistry.ServiceRegistry; import org.springframework.context.ApplicationContext; /** @@ -38,9 +35,7 @@ public class SpringCloudRegistryFactory implements RegistryFactory { @Override public Registry getRegistry(URL url) { - ServiceRegistry<Registration> serviceRegistry = applicationContext.getBean(ServiceRegistry.class); - DiscoveryClient discoveryClient = applicationContext.getBean(DiscoveryClient.class); - return new SpringCloudRegistry(url, serviceRegistry, discoveryClient); + return new SpringCloudRegistry(url, applicationContext); } public static void setApplicationContext(ApplicationContext applicationContext) { diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/apache/zookeeper/ZookeeperRegistrationFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/apache/zookeeper/ZookeeperRegistrationFactory.java new file mode 100644 index 000000000..77becb0e5 --- /dev/null +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/apache/zookeeper/ZookeeperRegistrationFactory.java @@ -0,0 +1,54 @@ +/* + * 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.springframework.cloud.alibaba.dubbo.registry.apache.zookeeper; + +import com.alibaba.dubbo.common.URL; + +import org.springframework.cloud.alibaba.dubbo.registry.AbstractRegistrationFactory; +import org.springframework.cloud.alibaba.dubbo.registry.RegistrationFactory; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.zookeeper.discovery.ZookeeperInstance; +import org.springframework.cloud.zookeeper.serviceregistry.ServiceInstanceRegistration; +import org.springframework.cloud.zookeeper.serviceregistry.ZookeeperRegistration; +import org.springframework.context.ApplicationContext; + +/** + * Zookeeper {@link RegistrationFactory} + * + * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> + */ +public class ZookeeperRegistrationFactory extends AbstractRegistrationFactory<ZookeeperRegistration> { + + @Override + public ZookeeperRegistration create(String serviceName, URL url, ApplicationContext applicationContext) { + + ServiceInstance serviceInstance = createServiceInstance(serviceName, url); + + ZookeeperInstance zookeeperInstance = new ZookeeperInstance(serviceInstance.getInstanceId(), + serviceInstance.getServiceId(), serviceInstance.getMetadata()); + + ZookeeperRegistration registration = ServiceInstanceRegistration + .builder() + .address(serviceInstance.getHost()) + .name(serviceInstance.getServiceId()) + .payload(zookeeperInstance) + .port(serviceInstance.getPort()) + .build(); + + return registration; + } +} diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/netflix/eureka/EurekaRegistrationFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/netflix/eureka/EurekaRegistrationFactory.java new file mode 100644 index 000000000..af54039a3 --- /dev/null +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/netflix/eureka/EurekaRegistrationFactory.java @@ -0,0 +1,62 @@ +/* + * 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.springframework.cloud.alibaba.dubbo.registry.netflix.eureka; + +import com.alibaba.dubbo.common.URL; + +import com.netflix.appinfo.HealthCheckHandler; +import com.netflix.discovery.EurekaClientConfig; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.cloud.alibaba.dubbo.registry.AbstractRegistrationFactory; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.cloud.netflix.eureka.CloudEurekaInstanceConfig; +import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean; +import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration; +import org.springframework.context.ApplicationContext; + +/** + * {@link EurekaRegistration} Factory + * + * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> + */ +public class EurekaRegistrationFactory extends AbstractRegistrationFactory<EurekaRegistration> { + + @Override + public EurekaRegistration create(String serviceName, URL url, ApplicationContext applicationContext) { + ServiceInstance serviceInstance = createServiceInstance(serviceName, url); + CloudEurekaInstanceConfig cloudEurekaInstanceConfig = applicationContext.getBean(CloudEurekaInstanceConfig.class); + ObjectProvider<HealthCheckHandler> healthCheckHandler = applicationContext.getBeanProvider(HealthCheckHandler.class); + EurekaClientConfig eurekaClientConfig = applicationContext.getBean(EurekaClientConfig.class); + InetUtils inetUtils = applicationContext.getBean(InetUtils.class); + EurekaInstanceConfigBean eurekaInstanceConfigBean = new EurekaInstanceConfigBean(inetUtils); + BeanUtils.copyProperties(cloudEurekaInstanceConfig, eurekaInstanceConfigBean); + String serviceId = serviceInstance.getServiceId(); + eurekaInstanceConfigBean.setInstanceId(serviceInstance.getInstanceId()); + eurekaInstanceConfigBean.setVirtualHostName(serviceId); + eurekaInstanceConfigBean.setSecureVirtualHostName(serviceId); + eurekaInstanceConfigBean.setAppname(serviceId); + eurekaInstanceConfigBean.setHostname(serviceInstance.getHost()); + eurekaInstanceConfigBean.setMetadataMap(serviceInstance.getMetadata()); + + return EurekaRegistration.builder(eurekaInstanceConfigBean) + .with(healthCheckHandler) + .with(eurekaClientConfig, applicationContext) + .build(); + } +} diff --git a/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories index 516f25f63..c18edcd54 100644 --- a/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories @@ -6,4 +6,9 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.cloud.alibaba.dubbo.autoconfigure.DubboServiceAutoConfiguration org.springframework.context.ApplicationContextInitializer=\ - org.springframework.cloud.alibaba.dubbo.context.DubboServiceRegistrationApplicationContextInitializer \ No newline at end of file + org.springframework.cloud.alibaba.dubbo.context.DubboServiceRegistrationApplicationContextInitializer + +org.springframework.cloud.alibaba.dubbo.registry.RegistrationFactory=\ + org.springframework.cloud.alibaba.dubbo.registry.DefaultRegistrationFactory,\ + org.springframework.cloud.alibaba.dubbo.registry.netflix.eureka.EurekaRegistrationFactory,\ + org.springframework.cloud.alibaba.dubbo.registry.apache.zookeeper.ZookeeperRegistrationFactory \ No newline at end of file diff --git a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudBootstrap.java b/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudBootstrap.java deleted file mode 100644 index 485665859..000000000 --- a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudBootstrap.java +++ /dev/null @@ -1,222 +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.springframework.cloud.alibaba.dubbo.bootstrap; - -import com.alibaba.dubbo.config.annotation.Reference; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.ApplicationRunner; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.cloud.alibaba.dubbo.annotation.DubboTransported; -import org.springframework.cloud.alibaba.dubbo.service.RestService; -import org.springframework.cloud.alibaba.dubbo.service.User; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Lazy; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import java.util.HashMap; -import java.util.Map; - -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; - -/** - * Dubbo Spring Cloud Bootstrap - */ -@EnableDiscoveryClient -@EnableAutoConfiguration -@EnableFeignClients -@RestController -public class DubboSpringCloudBootstrap { - - @Reference(version = "1.0.0") - private RestService restService; - - @Autowired - @Lazy - private FeignRestService feignRestService; - - @Autowired - @Lazy - private DubboFeignRestService dubboFeignRestService; - - @Autowired - @LoadBalanced - private RestTemplate restTemplate; - - @FeignClient("spring-cloud-alibaba-dubbo") - public interface FeignRestService { - - @GetMapping(value = "/param") - String param(@RequestParam("param") String param); - - @PostMapping("/params") - public String params(@RequestParam("b") String b, @RequestParam("a") int a); - - @PostMapping(value = "/request/body/map", produces = APPLICATION_JSON_UTF8_VALUE) - User requestBody(@RequestParam("param") String param, @RequestBody Map<String, Object> data); - - @GetMapping("/headers") - @Path("/headers") - @GET - public String headers(@RequestHeader("h2") String header2, - @RequestHeader("h") String header, - @RequestParam("v") Integer value); - - @GetMapping("/path-variables/{p1}/{p2}") - public String pathVariables(@PathVariable("p2") String path2, - @PathVariable("p1") String path1, - @RequestParam("v") String param); - } - - @FeignClient("spring-cloud-alibaba-dubbo") - @DubboTransported - public interface DubboFeignRestService { - - @GetMapping(value = "/param") - String param(@RequestParam("param") String param); - - @PostMapping("/params") - String params(@RequestParam("b") String paramB, @RequestParam("a") int paramA); - - @PostMapping(value = "/request/body/map", produces = APPLICATION_JSON_UTF8_VALUE) - User requestBody(@RequestParam("param") String param, @RequestBody Map<String, Object> data); - - @GetMapping("/headers") - @Path("/headers") - @GET - public String headers(@RequestHeader("h2") String header2, - @RequestParam("v") Integer value, - @RequestHeader("h") String header); - - @GetMapping("/path-variables/{p1}/{p2}") - public String pathVariables(@RequestParam("v") String param, - @PathVariable("p2") String path2, - @PathVariable("p1") String path1); - } - - - @Bean - public ApplicationRunner paramRunner() { - return arguments -> { - - // To call /path-variables - callPathVariables(); - - // To call /headers - callHeaders(); - - // To call /param - callParam(); - - // To call /params - callParams(); - - // To call /request/body/map - callRequestBodyMap(); - - }; - } - - private void callPathVariables() { - // Dubbo Service call - System.out.println(restService.pathVariables("a", "b", "c")); - // Spring Cloud Open Feign REST Call (Dubbo Transported) - System.out.println(dubboFeignRestService.pathVariables("c", "b", "a")); - // Spring Cloud Open Feign REST Call - System.out.println(feignRestService.pathVariables("b", "a", "c")); - - // RestTemplate call - System.out.println(restTemplate.getForEntity("http://spring-cloud-alibaba-dubbo//path-variables/{p1}/{p2}?v=c", String.class, "a", "b")); - } - - private void callHeaders() { - // Dubbo Service call - System.out.println(restService.headers("a", "b", 10)); - // Spring Cloud Open Feign REST Call (Dubbo Transported) - System.out.println(dubboFeignRestService.headers("b", 10, "a")); - // Spring Cloud Open Feign REST Call - System.out.println(feignRestService.headers("b", "a", 10)); - } - - private void callParam() { - // Dubbo Service call - System.out.println(restService.param("mercyblitz")); - // Spring Cloud Open Feign REST Call (Dubbo Transported) - System.out.println(dubboFeignRestService.param("mercyblitz")); - // Spring Cloud Open Feign REST Call - System.out.println(feignRestService.param("mercyblitz")); - } - - private void callParams() { - // Dubbo Service call - System.out.println(restService.params(1, "1")); - // Spring Cloud Open Feign REST Call (Dubbo Transported) - System.out.println(dubboFeignRestService.params("1", 1)); - // Spring Cloud Open Feign REST Call - System.out.println(feignRestService.params("1", 1)); - - // RestTemplate call - System.out.println(restTemplate.getForEntity("http://spring-cloud-alibaba-dubbo/param?param=小马哥", String.class)); - } - - private void callRequestBodyMap() { - - Map<String, Object> data = new HashMap<>(); - data.put("id", 1); - data.put("name", "小马哥"); - data.put("age", 33); - - // Dubbo Service call - System.out.println(restService.requestBodyMap(data, "Hello,World")); - // Spring Cloud Open Feign REST Call (Dubbo Transported) -// System.out.println(dubboFeignRestService.requestBody("Hello,World", data)); -// Spring Cloud Open Feign REST Call - System.out.println(feignRestService.requestBody("Hello,World", data)); - - // RestTemplate call - System.out.println(restTemplate.postForObject("http://spring-cloud-alibaba-dubbo/request/body/map?param=小马哥", data, User.class)); - } - - @Bean - @LoadBalanced - @DubboTransported - public RestTemplate restTemplate() { - return new RestTemplate(); - } - - public static void main(String[] args) { - new SpringApplicationBuilder(DubboSpringCloudBootstrap.class) - .run(args); - } -} - - - diff --git a/spring-cloud-alibaba-dubbo/src/test/resources/application.yaml b/spring-cloud-alibaba-dubbo/src/test/resources/application.yaml index e3867ace0..2b3eb54e9 100644 --- a/spring-cloud-alibaba-dubbo/src/test/resources/application.yaml +++ b/spring-cloud-alibaba-dubbo/src/test/resources/application.yaml @@ -7,7 +7,7 @@ dubbo: port: 12345 rest: name: rest - port: 9090 + port: 8081 server: netty registry: address: spring-cloud://nacos diff --git a/spring-cloud-alibaba-dubbo/src/test/resources/bootstrap.yaml b/spring-cloud-alibaba-dubbo/src/test/resources/bootstrap.yaml index e21e07da3..9b1aad421 100644 --- a/spring-cloud-alibaba-dubbo/src/test/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-dubbo/src/test/resources/bootstrap.yaml @@ -7,6 +7,9 @@ spring: server-addr: 127.0.0.1:8848 config: server-addr: 127.0.0.1:8848 + zookeeper: + enabled: false + main: allow-bean-definition-overriding: true @@ -27,4 +30,18 @@ eureka: client: enabled: true service-url: - defaultZone: http://127.0.0.1:8761/eureka/ \ No newline at end of file + defaultZone: http://localhost:9090/eureka/ + +--- +spring: + profiles: zookeeper + + cloud: + nacos: + discovery: + enabled: false + register-enabled: false + + zookeeper: + enabled: true + connect-string: localhost:2181 \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java new file mode 100644 index 000000000..03e246337 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java @@ -0,0 +1,37 @@ +/* + * 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.springframework.cloud.alibaba.dubbo.bootstrap; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * Dubbo Spring Cloud Provider Bootstrap + */ +@EnableDiscoveryClient +@EnableAutoConfiguration +public class DubboSpringCloudProviderBootstrap { + + public static void main(String[] args) { + new SpringApplicationBuilder(DubboSpringCloudProviderBootstrap.class) + .run(args); + } +} + + + diff --git a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java similarity index 94% rename from spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java rename to spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java index 0c512f661..642fdb0d2 100644 --- a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java @@ -20,6 +20,7 @@ import com.alibaba.dubbo.rpc.RpcContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -40,7 +41,6 @@ import javax.ws.rs.QueryParam; import java.util.HashMap; import java.util.Map; -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON_VALUE; /** @@ -109,7 +109,7 @@ public class StandardRestService implements RestService { } @Override - @PostMapping(value = "/request/body/map", produces = APPLICATION_JSON_UTF8_VALUE) + @PostMapping(value = "/request/body/map", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Path("/request/body/map") @POST @Produces(APPLICATION_JSON_VALUE) @@ -122,11 +122,11 @@ public class StandardRestService implements RestService { return user; } - @PostMapping(value = "/request/body/user", consumes = APPLICATION_JSON_UTF8_VALUE) + @PostMapping(value = "/request/body/user", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) @Path("/request/body/user") @POST @Override - @Consumes(APPLICATION_JSON_UTF8_VALUE) + @Consumes(MediaType.APPLICATION_JSON_UTF8_VALUE) public Map<String, Object> requestBodyUser(@RequestBody User user) { Map<String, Object> map = new HashMap<>(); map.put("id", user.getId()); diff --git a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java similarity index 98% rename from spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java rename to spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java index 35d6755d4..442a0a9a4 100644 --- a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java @@ -19,7 +19,7 @@ package org.springframework.cloud.alibaba.dubbo.service; import java.util.Map; /** - * Echo Service + * Rest Service * * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> */ @@ -38,5 +38,4 @@ public interface RestService { User requestBodyMap(Map<String, Object> data, String param); Map<String, Object> requestBodyUser(User user); - } diff --git a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/User.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/service/User.java similarity index 94% rename from spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/User.java rename to spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/service/User.java index 79d54107b..f91caba3b 100644 --- a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/User.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/service/User.java @@ -16,21 +16,19 @@ */ package org.springframework.cloud.alibaba.dubbo.service; -import javax.ws.rs.FormParam; import java.io.Serializable; /** * User Entity + * + * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> */ public class User implements Serializable { - @FormParam("id") private Long id; - @FormParam("name") private String name; - @FormParam("age") private Integer age; public Long getId() { From 21f3451f7b2223a35ea4f57549020b39cdfe27bc Mon Sep 17 00:00:00 2001 From: mercyblitz <mercyblitz@gmail.com> Date: Tue, 26 Feb 2019 14:52:47 +0800 Subject: [PATCH 2/5] Polish : spring-cloud-incubator/spring-cloud-alibaba/issues#387 : Add Dubbo Spring Cloud Samples --- spring-cloud-alibaba-examples/pom.xml | 1 + .../pom.xml | 178 ++++++++++++++ .../pom.xml | 38 +++ .../DubboSpringCloudConsumerBootstrap.java | 217 ++++++++++++++++++ .../src/main/resources/application.yaml | 5 + .../src/main/resources/bootstrap.yaml | 51 ++++ .../pom.xml | 65 ++++++ .../src/main/resources/application.yaml | 20 ++ .../src/main/resources/bootstrap.yaml | 47 ++++ .../spring-cloud-dubbo-sample-api/pom.xml | 16 ++ 10 files changed, 638 insertions(+) create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/pom.xml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/pom.xml diff --git a/spring-cloud-alibaba-examples/pom.xml b/spring-cloud-alibaba-examples/pom.xml index 31e8ca5eb..914525908 100644 --- a/spring-cloud-alibaba-examples/pom.xml +++ b/spring-cloud-alibaba-examples/pom.xml @@ -37,6 +37,7 @@ <module>rocketmq-example</module> <module>spring-cloud-bus-rocketmq-example</module> <module>schedulerx-example/schedulerx-simple-task-example</module> + <module>spring-cloud-alibaba-dubbo-examples</module> </modules> <build> diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml new file mode 100644 index 000000000..65bc560f5 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml @@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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>spring-cloud-alibaba-examples</artifactId> + <groupId>org.springframework.cloud</groupId> + <version>0.2.2.BUILD-SNAPSHOT</version> + <relativePath>../pom.xml</relativePath> + </parent> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-alibaba-dubbo-examples</artifactId> + <name>Spring Cloud Alibaba Dubbo Examples</name> + <packaging>pom</packaging> + + <modules> + <module>spring-cloud-dubbo-sample-api</module> + <module>spring-cloud-dubbo-provider-sample</module> + <module>spring-cloud-dubbo-consumer-sample</module> + </modules> + + <properties> + <dubbo.version>2.6.5</dubbo.version> + <dubbo-spring-boot.version>0.2.1.RELEASE</dubbo-spring-boot.version> + <dubbo-registry-nacos.version>0.0.2</dubbo-registry-nacos.version> + <spring-cloud-zookeeper.version>2.1.0.RELEASE</spring-cloud-zookeeper.version> + <curator.version>4.0.1</curator.version> + </properties> + + <dependencyManagement> + + <dependencies> + <!-- Spring Boot dependencies --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-dependencies</artifactId> + <version>${spring-boot.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + + <!-- Apache Dubbo dependencies--> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>dubbo-dependencies-bom</artifactId> + <version>${dubbo.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + + </dependencies> + + </dependencyManagement> + + <dependencies> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-actuator-autoconfigure</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-configuration-processor</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-autoconfigure</artifactId> + <optional>true</optional> + </dependency> + + <!-- Spring Cloud dependencies --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-commons</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-context</artifactId> + </dependency> + + <!-- Nacos Service Discovery --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> + </dependency> + + <!-- Eureka Service Discovery --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> + <optional>true</optional> + </dependency> + + <!-- Zookeeper Service Discovery --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> + <version>${spring-cloud-zookeeper.version}</version> + <optional>true</optional> + <exclusions> + <exclusion> + <groupId>org.apache.zookeeper</groupId> + <artifactId>zookeeper</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>org.apache.zookeeper</groupId> + <artifactId>zookeeper</artifactId> + <version>3.4.12</version> + <optional>true</optional> + <exclusions> + <exclusion> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>org.apache.curator</groupId> + <artifactId>curator-framework</artifactId> + <version>${curator.version}</version> + <optional>true</optional> + </dependency> + + <!-- Dubbo Spring Cloud Starter --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-dubbo</artifactId> + <version>${project.version}</version> + </dependency> + + </dependencies> + + <profiles> + + <!-- Nacos --> + <profile> + <id>nacos</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + <dependencies> + + </dependencies> + </profile> + + <profile> + <id>eureka</id> + <dependencies> + + </dependencies> + </profile> + + <!-- Zookeeper --> + <profile> + <id>zookeeper</id> + <dependencies> + + </dependencies> + </profile> + + </profiles> + + +</project> \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/pom.xml new file mode 100644 index 000000000..5a0debd10 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/pom.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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>spring-cloud-alibaba-dubbo-examples</artifactId> + <groupId>org.springframework.cloud</groupId> + <version>0.2.2.BUILD-SNAPSHOT</version> + <relativePath>../pom.xml</relativePath> + </parent> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-dubbo-consumer-sample</artifactId> + <name>Spring Cloud Dubbo Consumer Sample</name> + + <dependencies> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + + <!-- Sample API --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-dubbo-sample-api</artifactId> + <version>${project.version}</version> + </dependency> + + <!-- Spring Cloud Open Feign --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-openfeign</artifactId> + </dependency> + + </dependencies> +</project> \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java new file mode 100644 index 000000000..5933a281d --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java @@ -0,0 +1,217 @@ +/* + * 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.springframework.cloud.alibaba.dubbo.bootstrap; + +import com.alibaba.dubbo.config.annotation.Reference; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.alibaba.dubbo.annotation.DubboTransported; +import org.springframework.cloud.alibaba.dubbo.service.RestService; +import org.springframework.cloud.alibaba.dubbo.service.User; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Lazy; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; + +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; + +/** + * Dubbo Spring Cloud Consumer Bootstrap + */ +@EnableDiscoveryClient +@EnableAutoConfiguration +@EnableFeignClients +public class DubboSpringCloudConsumerBootstrap { + + @Reference(version = "1.0.0") + private RestService restService; + + @Autowired + @Lazy + private FeignRestService feignRestService; + + @Autowired + @Lazy + private DubboFeignRestService dubboFeignRestService; + + @Value("${provider.application.name}") + private String providerApplicationName; + + @Autowired + @LoadBalanced + private RestTemplate restTemplate; + + @FeignClient("${provider.application.name}") + public interface FeignRestService { + + @GetMapping(value = "/param") + String param(@RequestParam("param") String param); + + @PostMapping("/params") + public String params(@RequestParam("b") String b, @RequestParam("a") int a); + + @PostMapping(value = "/request/body/map", produces = APPLICATION_JSON_UTF8_VALUE) + User requestBody(@RequestParam("param") String param, @RequestBody Map<String, Object> data); + + @GetMapping("/headers") + public String headers(@RequestHeader("h2") String header2, + @RequestHeader("h") String header, + @RequestParam("v") Integer value); + + @GetMapping("/path-variables/{p1}/{p2}") + public String pathVariables(@PathVariable("p2") String path2, + @PathVariable("p1") String path1, + @RequestParam("v") String param); + } + + @FeignClient("${provider.application.name}") + @DubboTransported + public interface DubboFeignRestService { + + @GetMapping(value = "/param") + String param(@RequestParam("param") String param); + + @PostMapping("/params") + String params(@RequestParam("b") String paramB, @RequestParam("a") int paramA); + + @PostMapping(value = "/request/body/map", produces = APPLICATION_JSON_UTF8_VALUE) + User requestBody(@RequestParam("param") String param, @RequestBody Map<String, Object> data); + + @GetMapping("/headers") + public String headers(@RequestHeader("h2") String header2, + @RequestParam("v") Integer value, + @RequestHeader("h") String header); + + @GetMapping("/path-variables/{p1}/{p2}") + public String pathVariables(@RequestParam("v") String param, + @PathVariable("p2") String path2, + @PathVariable("p1") String path1); + } + + @Bean + public ApplicationRunner paramRunner() { + return arguments -> { + + // To call /path-variables + callPathVariables(); + + // To call /headers + callHeaders(); + + // To call /param + callParam(); +// +// // To call /params +// callParams(); +// +// // To call /request/body/map +// callRequestBodyMap(); + + }; + } + + private void callPathVariables() { + // Dubbo Service call + System.out.println(restService.pathVariables("a", "b", "c")); + // Spring Cloud Open Feign REST Call (Dubbo Transported) + System.out.println(dubboFeignRestService.pathVariables("c", "b", "a")); + // Spring Cloud Open Feign REST Call + System.out.println(feignRestService.pathVariables("b", "a", "c")); + + // RestTemplate call + System.out.println(restTemplate.getForEntity("http://" + providerApplicationName + "//path-variables/{p1}/{p2}?v=c", String.class, "a", "b")); + } + + private void callHeaders() { + // Dubbo Service call + System.out.println(restService.headers("a", "b", 10)); + // Spring Cloud Open Feign REST Call (Dubbo Transported) + System.out.println(dubboFeignRestService.headers("b", 10, "a")); + // Spring Cloud Open Feign REST Call + System.out.println(feignRestService.headers("b", "a", 10)); + } + + private void callParam() { + // Dubbo Service call + System.out.println(restService.param("mercyblitz")); + // Spring Cloud Open Feign REST Call (Dubbo Transported) + System.out.println(dubboFeignRestService.param("mercyblitz")); + // Spring Cloud Open Feign REST Call + System.out.println(feignRestService.param("mercyblitz")); + } + + private void callParams() { + // Dubbo Service call + System.out.println(restService.params(1, "1")); + // Spring Cloud Open Feign REST Call (Dubbo Transported) + System.out.println(dubboFeignRestService.params("1", 1)); + // Spring Cloud Open Feign REST Call + System.out.println(feignRestService.params("1", 1)); + + // RestTemplate call + System.out.println(restTemplate.getForEntity("http://" + providerApplicationName + "/param?param=小马哥", String.class)); + } + + private void callRequestBodyMap() { + + Map<String, Object> data = new HashMap<>(); + data.put("id", 1); + data.put("name", "小马哥"); + data.put("age", 33); + + // Dubbo Service call + System.out.println(restService.requestBodyMap(data, "Hello,World")); + // Spring Cloud Open Feign REST Call (Dubbo Transported) +// System.out.println(dubboFeignRestService.requestBody("Hello,World", data)); +// Spring Cloud Open Feign REST Call + System.out.println(feignRestService.requestBody("Hello,World", data)); + + // RestTemplate call + System.out.println(restTemplate.postForObject("http://" + providerApplicationName + "/request/body/map?param=小马哥", data, User.class)); + } + + @Bean + @LoadBalanced + @DubboTransported + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + public static void main(String[] args) { + new SpringApplicationBuilder(DubboSpringCloudConsumerBootstrap.class) + .run(args); + } +} + + + diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml new file mode 100644 index 000000000..83d0d8354 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml @@ -0,0 +1,5 @@ +dubbo: + registry: + address: spring-cloud://nacos +server: + port: 7070 \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml new file mode 100644 index 000000000..d4db17e64 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml @@ -0,0 +1,51 @@ +spring: + application: + name: spring-cloud-alibaba-dubbo-consumer + cloud: + nacos: + discovery: + server-addr: 127.0.0.1:8848 + config: + server-addr: 127.0.0.1:8848 + zookeeper: + enabled: false + + main: + allow-bean-definition-overriding: true + +eureka: + client: + enabled: false + +provider: + application: + name: spring-cloud-alibaba-dubbo-provider + +--- +spring: + profiles: eureka + cloud: + nacos: + discovery: + enabled: false + register-enabled: false + +eureka: + client: + enabled: true + service-url: + defaultZone: http://localhost:9090/eureka/ + +--- +spring: + profiles: zookeeper + + cloud: + nacos: + discovery: + enabled: false + register-enabled: false + + zookeeper: + enabled: true + connect-string: localhost:2181 \ No newline at end of file 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 new file mode 100644 index 000000000..9ebd00a18 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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>spring-cloud-alibaba-dubbo-examples</artifactId> + <groupId>org.springframework.cloud</groupId> + <version>0.2.2.BUILD-SNAPSHOT</version> + <relativePath>../pom.xml</relativePath> + </parent> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-dubbo-provider-sample</artifactId> + <name>Spring Cloud Dubbo Provider Sample</name> + + + <dependencies> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + + <!-- Sample API --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-dubbo-sample-api</artifactId> + <version>${project.version}</version> + </dependency> + + <!-- REST support dependencies --> + <dependency> + <groupId>org.jboss.resteasy</groupId> + <artifactId>resteasy-jaxrs</artifactId> + </dependency> + + <dependency> + <groupId>org.jboss.resteasy</groupId> + <artifactId>resteasy-client</artifactId> + </dependency> + + <dependency> + <groupId>org.jboss.resteasy</groupId> + <artifactId>resteasy-netty4</artifactId> + </dependency> + + <dependency> + <groupId>javax.validation</groupId> + <artifactId>validation-api</artifactId> + </dependency> + + <dependency> + <groupId>org.jboss.resteasy</groupId> + <artifactId>resteasy-jackson-provider</artifactId> + </dependency> + + <dependency> + <groupId>org.jboss.resteasy</groupId> + <artifactId>resteasy-jaxb-provider</artifactId> + </dependency> + + </dependencies> + +</project> \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml new file mode 100644 index 000000000..2b3eb54e9 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml @@ -0,0 +1,20 @@ +dubbo: + scan: + base-packages: org.springframework.cloud.alibaba.dubbo.service + protocols: + dubbo: + name: dubbo + port: 12345 + rest: + name: rest + port: 8081 + server: netty + registry: + address: spring-cloud://nacos + +feign: + hystrix: + enabled: true + +server: + port: 8080 \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml new file mode 100644 index 000000000..0cee4797d --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml @@ -0,0 +1,47 @@ +spring: + application: + name: spring-cloud-alibaba-dubbo-provider + cloud: + nacos: + discovery: + server-addr: 127.0.0.1:8848 + config: + server-addr: 127.0.0.1:8848 + zookeeper: + enabled: false + + main: + allow-bean-definition-overriding: true + +eureka: + client: + enabled: false + +--- +spring: + profiles: eureka + cloud: + nacos: + discovery: + enabled: false + register-enabled: false + +eureka: + client: + enabled: true + service-url: + defaultZone: http://localhost:9090/eureka/ + +--- +spring: + profiles: zookeeper + + cloud: + nacos: + discovery: + enabled: false + register-enabled: false + + zookeeper: + enabled: true + connect-string: localhost:2181 \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/pom.xml new file mode 100644 index 000000000..16b74cdb6 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/pom.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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>spring-cloud-alibaba-dubbo-examples</artifactId> + <groupId>org.springframework.cloud</groupId> + <version>0.2.2.BUILD-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-dubbo-sample-api</artifactId> + <name>Spring Cloud Dubbo Sample API</name> + +</project> \ No newline at end of file From 8e9398d24fd22e61faa7edcc26aa1e30c6d05cac Mon Sep 17 00:00:00 2001 From: mercyblitz <mercyblitz@gmail.com> Date: Tue, 26 Feb 2019 16:24:55 +0800 Subject: [PATCH 3/5] Polish : /spring-cloud-incubator/spring-cloud-alibaba#386 : supports Spring Cloud Consul --- spring-cloud-alibaba-dubbo/pom.xml | 79 +++++++++------- .../dubbo/registry/SpringCloudRegistry.java | 80 ++++++++-------- .../consul/ConsulRegistrationFactory.java | 92 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 3 +- 4 files changed, 181 insertions(+), 73 deletions(-) create mode 100644 spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/hashicorp/consul/ConsulRegistrationFactory.java diff --git a/spring-cloud-alibaba-dubbo/pom.xml b/spring-cloud-alibaba-dubbo/pom.xml index 5dbf37ac2..5d51c191d 100644 --- a/spring-cloud-alibaba-dubbo/pom.xml +++ b/spring-cloud-alibaba-dubbo/pom.xml @@ -18,6 +18,7 @@ <dubbo-spring-boot.version>0.2.1.RELEASE</dubbo-spring-boot.version> <dubbo-registry-nacos.version>0.0.2</dubbo-registry-nacos.version> <spring-cloud-zookeeper.version>2.1.0.RELEASE</spring-cloud-zookeeper.version> + <spring-cloud-consul.version>2.1.0.RELEASE</spring-cloud-consul.version> <curator.version>4.0.1</curator.version> </properties> @@ -55,6 +56,44 @@ <optional>true</optional> </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-actuator-autoconfigure</artifactId> + <optional>true</optional> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-configuration-processor</artifactId> + <optional>true</optional> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot</artifactId> + <optional>true</optional> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-autoconfigure</artifactId> + <optional>true</optional> + </dependency> + + <!-- Spring Cloud dependencies --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-commons</artifactId> + <optional>true</optional> + </dependency> + + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-context</artifactId> + <optional>true</optional> + </dependency> + + <!-- Eureka Service Discovery --> <dependency> <groupId>org.springframework.cloud</groupId> @@ -96,50 +135,22 @@ <optional>true</optional> </dependency> - <!-- Nacos Service Discovery --> + <!-- Spring Cloud Consul --> <dependency> <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> - <optional>true</optional> - </dependency> - - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-actuator-autoconfigure</artifactId> - <optional>true</optional> - </dependency> - - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-configuration-processor</artifactId> - <optional>true</optional> - </dependency> - - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot</artifactId> - <optional>true</optional> - </dependency> - - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-autoconfigure</artifactId> - <optional>true</optional> - </dependency> - - <!-- Spring Cloud dependencies --> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-commons</artifactId> + <artifactId>spring-cloud-starter-consul-discovery</artifactId> + <version>${spring-cloud-consul.version}</version> <optional>true</optional> </dependency> + <!-- Nacos Service Discovery --> <dependency> <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-context</artifactId> + <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <optional>true</optional> </dependency> + <!-- Spring Cloud Open Feign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java index e02d10836..30678ed1f 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java @@ -49,6 +49,7 @@ import static com.alibaba.dubbo.common.Constants.CONFIGURATORS_CATEGORY; import static com.alibaba.dubbo.common.Constants.CONSUMERS_CATEGORY; import static com.alibaba.dubbo.common.Constants.PROVIDERS_CATEGORY; import static com.alibaba.dubbo.common.Constants.ROUTERS_CATEGORY; +import static java.lang.Long.getLong; import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; import static org.springframework.beans.BeanUtils.instantiateClass; import static org.springframework.core.ResolvableType.forInstance; @@ -84,40 +85,40 @@ public class SpringCloudRegistry extends FailbackRegistry { private static final String WILDCARD = "*"; - private final Logger logger = LoggerFactory.getLogger(getClass()); - /** - * The separator for service name + * The interval in second of lookup service names(only for Dubbo-OPS) */ - private static final String SERVICE_NAME_SEPARATOR = ":"; - - private final ApplicationContext applicationContext; - - private final ServiceRegistry<Registration> serviceRegistry; + private static final long ALL_SERVICES_LOOKUP_INTERVAL = getLong("dubbo.all.services.lookup.interval", 30); - private final DiscoveryClient discoveryClient; - - private final RegistrationFactory registrationFactory; + /** + * The interval in second of lookup regigered service instances + */ + private static final long REGISTERED_SERVICES_LOOKUP_INTERVAL = getLong("dubbo.registered.services.lookup.interval", 300); /** * The {@link ScheduledExecutorService Scheduler} to lookup the registered services */ - private final ScheduledExecutorService registeredServicesLookupScheduler; + private static final ScheduledExecutorService registeredServicesLookupScheduler = newSingleThreadScheduledExecutor(new NamedThreadFactory("dubbo-registered-services-lookup-")); /** * The {@link ScheduledExecutorService Scheduler} to lookup all services (only for Dubbo-OPS) */ - private volatile ScheduledExecutorService allServicesLookupScheduler; + private static volatile ScheduledExecutorService allServicesLookupScheduler; - /** - * The interval in second of lookup service names(only for Dubbo-OPS) - */ - private static final long ALL_SERVICES_LOOKUP_INTERVAL = Long.getLong("dubbo.all.services.lookup.interval", 30); + private final Logger logger = LoggerFactory.getLogger(getClass()); /** - * The interval in second of lookup regigered service instances + * The separator for service name */ - private static final long REGISTERED_SERVICES_LOOKUP_INTERVAL = Long.getLong("dubbo.registered.services.lookup.interval", 30); + private static final String SERVICE_NAME_SEPARATOR = ":"; + + private final ApplicationContext applicationContext; + + private final ServiceRegistry<Registration> serviceRegistry; + + private final DiscoveryClient discoveryClient; + + private final RegistrationFactory registrationFactory; public SpringCloudRegistry(URL url, ApplicationContext applicationContext) { super(url); @@ -126,7 +127,6 @@ public class SpringCloudRegistry extends FailbackRegistry { this.registrationFactory = buildRegistrationFactory(serviceRegistry, applicationContext.getClassLoader()); this.discoveryClient = applicationContext.getBean(DiscoveryClient.class); applicationContext.getClassLoader(); - this.registeredServicesLookupScheduler = newSingleThreadScheduledExecutor(new NamedThreadFactory("dubbo-registered-services-lookup-")); } private RegistrationFactory buildRegistrationFactory(ServiceRegistry<Registration> serviceRegistry, @@ -143,7 +143,7 @@ public class SpringCloudRegistry extends FailbackRegistry { Class<?> factoryClass = resolveClassName(factoryClassName, classLoader); ResolvableType registrationFactoryType = forType(factoryClass); Class<?> actualRegistrationClass = resolveGenericClass(registrationFactoryType, RegistrationFactory.class, 0); - if (actualRegistrationClass.equals(registrationClass)) { + if (registrationClass.equals(actualRegistrationClass)) { registrationFactory = (RegistrationFactory) instantiateClass(registrationFactoryType.getRawClass()); break; } @@ -172,30 +172,34 @@ public class SpringCloudRegistry extends FailbackRegistry { ResolvableType resolvableType = implementedType; - OUTER: - while (true) { + try { + OUTER: + while (true) { - ResolvableType[] interfaceTypes = resolvableType.getInterfaces(); + ResolvableType[] interfaceTypes = resolvableType.getInterfaces(); - for (ResolvableType interfaceType : interfaceTypes) { - if (interfaceType.resolve().equals(interfaceClass)) { - resolvableType = interfaceType; - break OUTER; + for (ResolvableType interfaceType : interfaceTypes) { + if (interfaceType.resolve().equals(interfaceClass)) { + resolvableType = interfaceType; + break OUTER; + } } - } - ResolvableType superType = resolvableType.getSuperType(); + ResolvableType superType = resolvableType.getSuperType(); - Class<?> superClass = superType.resolve(); + Class<?> superClass = superType.resolve(); - if (Object.class.equals(superClass)) { - break; + if (Object.class.equals(superClass)) { + break; + } + + resolvableType = superType; } - resolvableType = superType; + } catch (Throwable e) { + resolvableType = ResolvableType.forType(void.class); } - return resolvableType.resolveGeneric(index); } @@ -232,9 +236,9 @@ public class SpringCloudRegistry extends FailbackRegistry { shutdownServiceNamesLookup(); } - if (registeredServicesLookupScheduler != null) { - registeredServicesLookupScheduler.shutdown(); - } +// if (registeredServicesLookupScheduler != null) { +// registeredServicesLookupScheduler.shutdown(); +// } } @Override diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/hashicorp/consul/ConsulRegistrationFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/hashicorp/consul/ConsulRegistrationFactory.java new file mode 100644 index 000000000..89c19acfe --- /dev/null +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/hashicorp/consul/ConsulRegistrationFactory.java @@ -0,0 +1,92 @@ +/* + * 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.springframework.cloud.alibaba.dubbo.registry.hashicorp.consul; + +import com.alibaba.dubbo.common.URL; + +import com.ecwid.consul.v1.agent.model.NewService; +import org.springframework.cloud.alibaba.dubbo.registry.AbstractRegistrationFactory; +import org.springframework.cloud.alibaba.dubbo.registry.RegistrationFactory; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties; +import org.springframework.cloud.consul.discovery.ConsulServerUtils; +import org.springframework.cloud.consul.serviceregistry.ConsulRegistration; +import org.springframework.context.ApplicationContext; + +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * {@link ConsulRegistration} {@link RegistrationFactory} implementation + * + * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> + */ +public class ConsulRegistrationFactory extends AbstractRegistrationFactory<ConsulRegistration> { + + @Override + public ConsulRegistration create(String serviceName, URL url, ApplicationContext applicationContext) { + ServiceInstance serviceInstance = createServiceInstance(serviceName, url); + + Map<String, String> metadata = getMetadata(serviceInstance); + List<String> tags = createTags(metadata); + + NewService service = new NewService(); + service.setId(serviceInstance.getInstanceId()); + service.setName(serviceInstance.getServiceId()); + service.setAddress(serviceInstance.getHost()); + service.setPort(serviceInstance.getPort()); + service.setMeta(metadata); + service.setTags(tags); + + ConsulDiscoveryProperties properties = applicationContext.getBean(ConsulDiscoveryProperties.class); + + ConsulRegistration registration = new ConsulRegistration(service, properties); + return registration; + } + + /** + * @param metadata + * @return + * @see ConsulServerUtils#getMetadata(java.util.List) + */ + private List<String> createTags(Map<String, String> metadata) { + List<String> tags = new LinkedList<>(); + for (Map.Entry<String, String> entry : metadata.entrySet()) { + String tag = entry.getKey() + "=" + entry.getValue(); + tags.add(tag); + + } + return tags; + } + + private Map<String, String> getMetadata(ServiceInstance serviceInstance) { + Map<String, String> metadata = serviceInstance.getMetadata(); + Set<String> removedKeys = new LinkedHashSet<>(); + for (String key : metadata.keySet()) { + if (key.contains(".")) { + removedKeys.add(key); + } + } + for (String removedKey : removedKeys) { + metadata.remove(removedKey); + } + return metadata; + } +} diff --git a/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories index c18edcd54..f90bb175a 100644 --- a/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories @@ -11,4 +11,5 @@ org.springframework.context.ApplicationContextInitializer=\ org.springframework.cloud.alibaba.dubbo.registry.RegistrationFactory=\ org.springframework.cloud.alibaba.dubbo.registry.DefaultRegistrationFactory,\ org.springframework.cloud.alibaba.dubbo.registry.netflix.eureka.EurekaRegistrationFactory,\ - org.springframework.cloud.alibaba.dubbo.registry.apache.zookeeper.ZookeeperRegistrationFactory \ No newline at end of file + org.springframework.cloud.alibaba.dubbo.registry.apache.zookeeper.ZookeeperRegistrationFactory,\ + org.springframework.cloud.alibaba.dubbo.registry.hashicorp.consul.ConsulRegistrationFactory \ No newline at end of file From ab1ecca6ab776cad74989b16045ee0c95c37f42c Mon Sep 17 00:00:00 2001 From: mercyblitz <mercyblitz@gmail.com> Date: Tue, 26 Feb 2019 16:25:41 +0800 Subject: [PATCH 4/5] Polish : /spring-cloud-incubator/spring-cloud-alibaba#387 : Dubbo Spring Cloud Samples --- .../pom.xml | 112 ++++++++++-------- .../DubboSpringCloudConsumerBootstrap.java | 13 +- .../src/main/resources/bootstrap.yaml | 50 +++++--- .../DubboSpringCloudProviderBootstrap.java | 1 + .../src/main/resources/bootstrap.yaml | 50 +++++--- 5 files changed, 134 insertions(+), 92 deletions(-) diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml index 65bc560f5..6a1f3ce11 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml @@ -26,6 +26,7 @@ <dubbo-spring-boot.version>0.2.1.RELEASE</dubbo-spring-boot.version> <dubbo-registry-nacos.version>0.0.2</dubbo-registry-nacos.version> <spring-cloud-zookeeper.version>2.1.0.RELEASE</spring-cloud-zookeeper.version> + <spring-cloud-consul.version>2.1.0.RELEASE</spring-cloud-consul.version> <curator.version>4.0.1</curator.version> </properties> @@ -88,53 +89,6 @@ <artifactId>spring-cloud-context</artifactId> </dependency> - <!-- Nacos Service Discovery --> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> - </dependency> - - <!-- Eureka Service Discovery --> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> - <optional>true</optional> - </dependency> - - <!-- Zookeeper Service Discovery --> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> - <version>${spring-cloud-zookeeper.version}</version> - <optional>true</optional> - <exclusions> - <exclusion> - <groupId>org.apache.zookeeper</groupId> - <artifactId>zookeeper</artifactId> - </exclusion> - </exclusions> - </dependency> - - <dependency> - <groupId>org.apache.zookeeper</groupId> - <artifactId>zookeeper</artifactId> - <version>3.4.12</version> - <optional>true</optional> - <exclusions> - <exclusion> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - </exclusion> - </exclusions> - </dependency> - - <dependency> - <groupId>org.apache.curator</groupId> - <artifactId>curator-framework</artifactId> - <version>${curator.version}</version> - <optional>true</optional> - </dependency> - <!-- Dubbo Spring Cloud Starter --> <dependency> <groupId>org.springframework.cloud</groupId> @@ -149,18 +103,24 @@ <!-- Nacos --> <profile> <id>nacos</id> - <activation> - <activeByDefault>true</activeByDefault> - </activation> <dependencies> - + <!-- Nacos Service Discovery --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> + </dependency> </dependencies> </profile> <profile> <id>eureka</id> <dependencies> - + <!-- Eureka Service Discovery --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> + <optional>true</optional> + </dependency> </dependencies> </profile> @@ -168,7 +128,55 @@ <profile> <id>zookeeper</id> <dependencies> + <!-- Zookeeper Service Discovery --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> + <version>${spring-cloud-zookeeper.version}</version> + <optional>true</optional> + <exclusions> + <exclusion> + <groupId>org.apache.zookeeper</groupId> + <artifactId>zookeeper</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>org.apache.zookeeper</groupId> + <artifactId>zookeeper</artifactId> + <version>3.4.12</version> + <optional>true</optional> + <exclusions> + <exclusion> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>org.apache.curator</groupId> + <artifactId>curator-framework</artifactId> + <version>${curator.version}</version> + <optional>true</optional> + </dependency> + </dependencies> + </profile> + <profile> + <id>consul</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + <dependencies> + <!-- Spring Cloud Consul --> + <dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-consul-discovery</artifactId> + <version>${spring-cloud-consul.version}</version> + <optional>true</optional> + </dependency> </dependencies> </profile> diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java index 5933a281d..b5dea081e 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java @@ -130,12 +130,12 @@ public class DubboSpringCloudConsumerBootstrap { // To call /param callParam(); -// -// // To call /params -// callParams(); -// -// // To call /request/body/map -// callRequestBodyMap(); + + // To call /params + callParams(); + + // To call /request/body/map + callRequestBodyMap(); }; } @@ -209,6 +209,7 @@ public class DubboSpringCloudConsumerBootstrap { public static void main(String[] args) { new SpringApplicationBuilder(DubboSpringCloudConsumerBootstrap.class) + .profiles("consul") .run(args); } } diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml index d4db17e64..5f5ed8d16 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml @@ -1,17 +1,19 @@ spring: application: name: spring-cloud-alibaba-dubbo-consumer + main: + allow-bean-definition-overriding: true + + # default disable all cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 - config: - server-addr: 127.0.0.1:8848 + enabled: false + register-enabled: false zookeeper: enabled: false - - main: - allow-bean-definition-overriding: true + consul: + enabled: false eureka: client: @@ -21,31 +23,45 @@ provider: application: name: spring-cloud-alibaba-dubbo-provider + --- spring: - profiles: eureka + profiles: nacos + cloud: nacos: discovery: - enabled: false - register-enabled: false + enabled: true + register-enabled: true + server-addr: 127.0.0.1:8848 + + +--- +spring: + profiles: eureka eureka: client: enabled: true service-url: - defaultZone: http://localhost:9090/eureka/ + defaultZone: http://127.0.0.1:9090/eureka/ + --- spring: profiles: zookeeper - cloud: - nacos: - discovery: - enabled: false - register-enabled: false - zookeeper: enabled: true - connect-string: localhost:2181 \ No newline at end of file + connect-string: 127.0.0.1:2181 + + +--- +spring: + profiles: consul + + cloud: + consul: + enabled: true + host: 127.0.0.1 + port: 8500 \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java index 03e246337..748511c65 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java @@ -29,6 +29,7 @@ public class DubboSpringCloudProviderBootstrap { public static void main(String[] args) { new SpringApplicationBuilder(DubboSpringCloudProviderBootstrap.class) + .profiles("consul") .run(args); } } diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml index 0cee4797d..c845d8ca1 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml @@ -1,47 +1,63 @@ spring: application: name: spring-cloud-alibaba-dubbo-provider + main: + allow-bean-definition-overriding: true + + # default disable all cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 - config: - server-addr: 127.0.0.1:8848 + enabled: false + register-enabled: false zookeeper: enabled: false - - main: - allow-bean-definition-overriding: true + consul: + enabled: false eureka: client: enabled: false + --- spring: - profiles: eureka + profiles: nacos + cloud: nacos: discovery: - enabled: false - register-enabled: false + enabled: true + register-enabled: true + server-addr: 127.0.0.1:8848 + + +--- +spring: + profiles: eureka eureka: client: enabled: true service-url: - defaultZone: http://localhost:9090/eureka/ + defaultZone: http://127.0.0.1:9090/eureka/ + --- spring: profiles: zookeeper - cloud: - nacos: - discovery: - enabled: false - register-enabled: false - zookeeper: enabled: true - connect-string: localhost:2181 \ No newline at end of file + connect-string: 127.0.0.1:2181 + + +--- +spring: + profiles: consul + + cloud: + consul: + enabled: true + host: 127.0.0.1 + port: 8500 \ No newline at end of file From f719e16d38f8edf6e066f63e9f46e3e4b718f903 Mon Sep 17 00:00:00 2001 From: mercyblitz <mercyblitz@gmail.com> Date: Tue, 26 Feb 2019 16:54:36 +0800 Subject: [PATCH 5/5] Polish : /spring-cloud-incubator/spring-cloud-alibaba#386 : Supports all Spring Cloud Registries and default is Nacos --- .../spring-cloud-alibaba-dubbo-examples/pom.xml | 10 +++------- .../bootstrap/DubboSpringCloudConsumerBootstrap.java | 2 +- .../src/main/resources/bootstrap.yaml | 9 ++++++++- .../bootstrap/DubboSpringCloudProviderBootstrap.java | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml index 6a1f3ce11..93f33466c 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml @@ -103,6 +103,9 @@ <!-- Nacos --> <profile> <id>nacos</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> <dependencies> <!-- Nacos Service Discovery --> <dependency> @@ -119,7 +122,6 @@ <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> - <optional>true</optional> </dependency> </dependencies> </profile> @@ -133,7 +135,6 @@ <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> <version>${spring-cloud-zookeeper.version}</version> - <optional>true</optional> <exclusions> <exclusion> <groupId>org.apache.zookeeper</groupId> @@ -159,23 +160,18 @@ <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>${curator.version}</version> - <optional>true</optional> </dependency> </dependencies> </profile> <profile> <id>consul</id> - <activation> - <activeByDefault>true</activeByDefault> - </activation> <dependencies> <!-- Spring Cloud Consul --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> <version>${spring-cloud-consul.version}</version> - <optional>true</optional> </dependency> </dependencies> </profile> diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java index b5dea081e..2d72b79fe 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java @@ -209,7 +209,7 @@ public class DubboSpringCloudConsumerBootstrap { public static void main(String[] args) { new SpringApplicationBuilder(DubboSpringCloudConsumerBootstrap.class) - .profiles("consul") + .profiles("nacos") .run(args); } } diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml index 5f5ed8d16..1d25940ca 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml @@ -4,6 +4,7 @@ spring: main: allow-bean-definition-overriding: true + # default disable all cloud: nacos: @@ -19,11 +20,14 @@ eureka: client: enabled: false +ribbon: + nacos: + enabled: false + provider: application: name: spring-cloud-alibaba-dubbo-provider - --- spring: profiles: nacos @@ -35,6 +39,9 @@ spring: register-enabled: true server-addr: 127.0.0.1:8848 +ribbon: + nacos: + enabled: true --- spring: diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java index 748511c65..4fbf8ea83 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java @@ -29,7 +29,7 @@ public class DubboSpringCloudProviderBootstrap { public static void main(String[] args) { new SpringApplicationBuilder(DubboSpringCloudProviderBootstrap.class) - .profiles("consul") + .profiles("nacos") .run(args); } }