From 10f06bec1ee086c72018a61f598d9579dc773875 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Fri, 8 Mar 2019 14:54:33 +0800 Subject: [PATCH] Polish : spring-cloud-incubator/spring-cloud-alibaba#409 : Register the Dubbo REST services as Spring Cloud services in non-web environment --- spring-cloud-alibaba-dubbo/pom.xml | 4 +- ...etadataEventHandlingAutoConfiguration.java | 80 +++++++++- .../DubboServiceAutoConfiguration.java | 6 + .../registry/AbstractRegistrationFactory.java | 12 +- .../registry/DefaultRegistrationFactory.java | 3 +- .../dubbo/registry/RegistrationFactory.java | 10 ++ .../registry/RegistrationFactoryProvider.java | 144 ++++++++++++++++++ .../registry/SpringCloudRegistryFactory.java | 86 +---------- .../ZookeeperRegistrationFactory.java | 3 +- .../consul/ConsulRegistrationFactory.java | 3 +- .../eureka/EurekaRegistrationFactory.java | 3 +- .../pom.xml | 1 + .../DubboSpringCloudConsumerBootstrap.java | 2 +- .../src/main/resources/application.yaml | 8 +- .../src/main/resources/bootstrap.yaml | 6 +- .../pom.xml | 15 +- .../DubboSpringCloudProviderBootstrap.java | 2 +- .../dubbo/service/StandardRestService.java | 73 +++------ .../src/main/resources/application.yaml | 10 +- .../src/main/resources/bootstrap.yaml | 2 +- .../pom.xml | 33 ++++ .../DubboSpringCloudWebProviderBootstrap.java | 35 +++++ .../dubbo/service/SpringRestService.java | 109 +++++++++++++ .../src/main/resources/application.yaml | 19 +++ .../src/main/resources/bootstrap.yaml | 64 ++++++++ .../cloud/alibaba/dubbo/util/LoggerUtils.java | 41 +++++ 26 files changed, 597 insertions(+), 177 deletions(-) create mode 100644 spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/RegistrationFactoryProvider.java create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/pom.xml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudWebProviderBootstrap.java create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/service/SpringRestService.java create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/application.yaml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/bootstrap.yaml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/util/LoggerUtils.java diff --git a/spring-cloud-alibaba-dubbo/pom.xml b/spring-cloud-alibaba-dubbo/pom.xml index 983532c3e..e29f655e8 100644 --- a/spring-cloud-alibaba-dubbo/pom.xml +++ b/spring-cloud-alibaba-dubbo/pom.xml @@ -91,7 +91,6 @@ true - org.springframework.cloud @@ -151,8 +150,7 @@ org.springframework.cloud - spring-cloud-starter-openfeign - true + spring-cloud-openfeign-core diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataEventHandlingAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataEventHandlingAutoConfiguration.java index 4bfd762eb..049a2bcf5 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataEventHandlingAutoConfiguration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataEventHandlingAutoConfiguration.java @@ -16,6 +16,7 @@ */ package org.springframework.cloud.alibaba.dubbo.autoconfigure; +import org.apache.dubbo.common.URL; import org.apache.dubbo.config.ApplicationConfig; import org.apache.dubbo.config.ProtocolConfig; import org.apache.dubbo.config.ServiceConfig; @@ -26,17 +27,29 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.ApplicationRunner; import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWebApplication; import org.springframework.boot.context.event.ApplicationFailedEvent; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.cloud.alibaba.dubbo.metadata.resolver.MetadataResolver; +import org.springframework.cloud.alibaba.dubbo.registry.RegistrationFactory; import org.springframework.cloud.alibaba.dubbo.service.DubboMetadataConfigService; import org.springframework.cloud.alibaba.dubbo.service.PublishingDubboMetadataConfigService; +import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.cloud.client.serviceregistry.ServiceRegistry; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.ContextClosedEvent; import org.springframework.context.event.EventListener; import org.springframework.util.StringUtils; +import java.util.HashMap; +import java.util.List; + import static org.springframework.cloud.alibaba.dubbo.autoconfigure.DubboMetadataAutoConfiguration.METADATA_PROTOCOL_BEAN_NAME; /** @@ -63,6 +76,9 @@ public class DubboMetadataEventHandlingAutoConfiguration { @Qualifier(METADATA_PROTOCOL_BEAN_NAME) private ProtocolConfig metadataProtocolConfig; + @Autowired + private ConfigurableApplicationContext context; + @Value("${spring.application.name:application}") private String currentApplicationName; @@ -71,10 +87,44 @@ public class DubboMetadataEventHandlingAutoConfiguration { */ private ServiceConfig serviceConfig; + private ServiceInstance restServiceInstance; + @EventListener(ServiceBeanExportedEvent.class) - public void recordRestMetadata(ServiceBeanExportedEvent event) { + public void onServiceBeanExported(ServiceBeanExportedEvent event) { ServiceBean serviceBean = event.getServiceBean(); - dubboMetadataConfigService.publishServiceRestMetadata(metadataResolver.resolveServiceRestMetadata(serviceBean)); + publishServiceRestMetadata(serviceBean); + setRestServiceInstance(serviceBean); + } + + private void setRestServiceInstance(ServiceBean serviceBean) { + List urls = serviceBean.getExportedUrls(); + urls.stream() + .filter(url -> "rest".equalsIgnoreCase(url.getProtocol())) + .forEach(url -> { + String host = url.getIp(); + int port = url.getPort(); + + if (restServiceInstance == null) { + String instanceId = currentApplicationName + "-" + host + ":" + port; + this.restServiceInstance = new DefaultServiceInstance(instanceId, currentApplicationName, + host, port, false, new HashMap<>()); + } else { + + if (!host.equals(restServiceInstance.getHost())) { + if (logger.isWarnEnabled()) { + logger.warn("Current application[{}] host is not consistent, expected: {}, actual: {}", + currentApplicationName, restServiceInstance.getHost(), host); + } + } + + if (port != restServiceInstance.getPort()) { + if (logger.isWarnEnabled()) { + logger.warn("Current application[{}] port is not consistent, expected: {}, actual: {}", + currentApplicationName, restServiceInstance.getPort(), port); + } + } + } + }); } @EventListener(ApplicationReadyEvent.class) @@ -92,6 +142,32 @@ public class DubboMetadataEventHandlingAutoConfiguration { unexportDubboMetadataConfigService(); } + @ConditionalOnNotWebApplication + @Bean + public ApplicationRunner applicationRunner() { + return args -> { + + if (restServiceInstance == null) { + return; + } + + // From RegistrationFactoryProvider + RegistrationFactory registrationFactory = context.getBean(RegistrationFactory.class); + + ServiceRegistry serviceRegistry = context.getBean(ServiceRegistry.class); + + Registration registration = context.getBean(Registration.class); + + restServiceInstance.getMetadata().putAll(registration.getMetadata()); + + serviceRegistry.register(registrationFactory.create(restServiceInstance, context)); + }; + } + + private void publishServiceRestMetadata(ServiceBean serviceBean) { + dubboMetadataConfigService.publishServiceRestMetadata(metadataResolver.resolveServiceRestMetadata(serviceBean)); + } + private void exportDubboMetadataConfigService() { if (serviceConfig != null && serviceConfig.isExported()) { diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboServiceAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboServiceAutoConfiguration.java index cbab596b6..88da964d8 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboServiceAutoConfiguration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboServiceAutoConfiguration.java @@ -20,6 +20,7 @@ import org.apache.dubbo.common.utils.Assert; import org.apache.dubbo.config.spring.util.PropertySourcesUtils; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.source.ConfigurationPropertySources; +import org.springframework.cloud.alibaba.dubbo.registry.RegistrationFactoryProvider; import org.springframework.cloud.alibaba.dubbo.registry.handler.DubboRegistryServiceIdHandler; import org.springframework.cloud.alibaba.dubbo.registry.handler.StandardDubboRegistryServiceIdHandler; import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceExecutionContextFactory; @@ -76,6 +77,11 @@ public class DubboServiceAutoConfiguration { return new StandardDubboRegistryServiceIdHandler(context); } + @Bean + public RegistrationFactoryProvider registrationFactoryProvider() { + return new RegistrationFactoryProvider(); + } + /** * Bugfix code for an issue : https://github.com/apache/incubator-dubbo-spring-boot-project/issues/459 * 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 index 8cd299986..f17c30195 100644 --- 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 @@ -37,19 +37,9 @@ public abstract class AbstractRegistrationFactory implem public final R create(URL url, ConfigurableApplicationContext applicationContext) { ServiceInstance serviceInstance = createServiceInstance(url, applicationContext); - return create(url, applicationContext, serviceInstance); + return create(serviceInstance, applicationContext); } - /** - * Sub-class should override this method to create an instance of {@link R} - * - * @param url The Dubbo's {@link URL} - * @param applicationContext {@link ConfigurableApplicationContext} - * @param serviceInstance {@link ServiceInstance} - * @return nullable - */ - protected abstract R create(URL url, ConfigurableApplicationContext applicationContext, ServiceInstance serviceInstance); - /** * Create an instance {@link ServiceInstance}. This method maybe override by sub-class. * 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 index 308657684..1bcfd534f 100644 --- 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 @@ -16,7 +16,6 @@ */ package org.springframework.cloud.alibaba.dubbo.registry; -import org.apache.dubbo.common.URL; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.context.ConfigurableApplicationContext; @@ -29,7 +28,7 @@ import org.springframework.context.ConfigurableApplicationContext; public class DefaultRegistrationFactory extends AbstractRegistrationFactory { @Override - protected Registration create(URL url, ConfigurableApplicationContext applicationContext, ServiceInstance serviceInstance) { + public Registration create(ServiceInstance serviceInstance, ConfigurableApplicationContext applicationContext) { return new DelegatingRegistration(serviceInstance); } } 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 index d7d977374..d05eea944 100644 --- 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 @@ -17,6 +17,7 @@ package org.springframework.cloud.alibaba.dubbo.registry; import org.apache.dubbo.common.URL; +import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.context.ConfigurableApplicationContext; @@ -37,4 +38,13 @@ public interface RegistrationFactory { * @return a instance of {@link R}, if null, it indicates the registration will not be executed. */ R create(URL url, ConfigurableApplicationContext applicationContext); + + /** + * Create a instance of {@link R} + * + * @param serviceInstance {@link ServiceInstance} + * @param applicationContext {@link ConfigurableApplicationContext} + * @return a instance of {@link R}, if null, it indicates the registration will not be executed. + */ + R create(ServiceInstance serviceInstance, ConfigurableApplicationContext applicationContext); } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/RegistrationFactoryProvider.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/RegistrationFactoryProvider.java new file mode 100644 index 000000000..c5debc684 --- /dev/null +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/RegistrationFactoryProvider.java @@ -0,0 +1,144 @@ +/* + * 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 org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.cloud.client.serviceregistry.ServiceRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.core.ResolvableType; + +import java.util.List; + +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; + +/** + * {@link RegistrationFactory} Provider + * + * @author Mercy + */ +public class RegistrationFactoryProvider implements FactoryBean, ApplicationContextAware { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + private RegistrationFactory registrationFactory; + + @Override + public RegistrationFactory getObject() throws BeansException { + return registrationFactory; + } + + @Override + public Class getObjectType() { + return RegistrationFactory.class; + } + + public boolean isSingleton() { + return true; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + ServiceRegistry serviceRegistry = applicationContext.getBean(ServiceRegistry.class); + ClassLoader classLoader = applicationContext.getClassLoader(); + this.registrationFactory = buildRegistrationFactory(serviceRegistry, classLoader); + } + + private RegistrationFactory buildRegistrationFactory(ServiceRegistry serviceRegistry, + ClassLoader classLoader) { + RegistrationFactory registrationFactory = null; + List 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 (registrationClass.equals(actualRegistrationClass)) { + 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; + + try { + 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; + } + + } catch (Throwable e) { + resolvableType = ResolvableType.forType(void.class); + } + + return resolvableType.resolveGeneric(index); + } + +} 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 3ff199c92..234c65d44 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 @@ -26,19 +26,11 @@ 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.ConfigurableApplicationContext; -import org.springframework.core.ResolvableType; -import java.util.List; import java.util.concurrent.ScheduledExecutorService; import static java.lang.System.getProperty; 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" @@ -77,7 +69,7 @@ public class SpringCloudRegistryFactory implements RegistryFactory { } this.serviceRegistry = applicationContext.getBean(ServiceRegistry.class); - this.registrationFactory = buildRegistrationFactory(serviceRegistry, applicationContext.getClassLoader()); + this.registrationFactory = applicationContext.getBean(RegistrationFactory.class); this.discoveryClient = applicationContext.getBean(DiscoveryClient.class); } @@ -91,80 +83,4 @@ public class SpringCloudRegistryFactory implements RegistryFactory { public static void setApplicationContext(ConfigurableApplicationContext applicationContext) { SpringCloudRegistryFactory.applicationContext = applicationContext; } - - - private RegistrationFactory buildRegistrationFactory(ServiceRegistry serviceRegistry, - ClassLoader classLoader) { - RegistrationFactory registrationFactory = null; - List 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 (registrationClass.equals(actualRegistrationClass)) { - 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; - - try { - 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; - } - - } catch (Throwable e) { - resolvableType = ResolvableType.forType(void.class); - } - - return resolvableType.resolveGeneric(index); - } - } 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 index d24e9e718..6657343f3 100644 --- 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 @@ -16,7 +16,6 @@ */ package org.springframework.cloud.alibaba.dubbo.registry.apache.zookeeper; -import org.apache.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; @@ -33,7 +32,7 @@ import org.springframework.context.ConfigurableApplicationContext; public class ZookeeperRegistrationFactory extends AbstractRegistrationFactory { @Override - protected ZookeeperRegistration create(URL url, ConfigurableApplicationContext applicationContext, ServiceInstance serviceInstance) { + public ZookeeperRegistration create(ServiceInstance serviceInstance, ConfigurableApplicationContext applicationContext) { ZookeeperInstance zookeeperInstance = new ZookeeperInstance(serviceInstance.getInstanceId(), serviceInstance.getServiceId(), serviceInstance.getMetadata()); 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 index 8fd93a658..a5861fb9e 100644 --- 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 @@ -17,7 +17,6 @@ package org.springframework.cloud.alibaba.dubbo.registry.hashicorp.consul; import com.ecwid.consul.v1.agent.model.NewService; -import org.apache.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; @@ -40,7 +39,7 @@ import java.util.Set; public class ConsulRegistrationFactory extends AbstractRegistrationFactory { @Override - protected ConsulRegistration create(URL url, ConfigurableApplicationContext applicationContext, ServiceInstance serviceInstance) { + public ConsulRegistration create(ServiceInstance serviceInstance, ConfigurableApplicationContext applicationContext) { Map metadata = getMetadata(serviceInstance); List tags = createTags(metadata); 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 index 486154f59..84fafa62d 100644 --- 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 @@ -18,7 +18,6 @@ package org.springframework.cloud.alibaba.dubbo.registry.netflix.eureka; import com.netflix.appinfo.HealthCheckHandler; import com.netflix.discovery.EurekaClientConfig; -import org.apache.dubbo.common.URL; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.ObjectProvider; import org.springframework.cloud.alibaba.dubbo.registry.AbstractRegistrationFactory; @@ -37,7 +36,7 @@ import org.springframework.context.ConfigurableApplicationContext; public class EurekaRegistrationFactory extends AbstractRegistrationFactory { @Override - protected EurekaRegistration create(URL url, ConfigurableApplicationContext applicationContext, ServiceInstance serviceInstance) { + public EurekaRegistration create(ServiceInstance serviceInstance, ConfigurableApplicationContext applicationContext) { CloudEurekaInstanceConfig cloudEurekaInstanceConfig = applicationContext.getBean(CloudEurekaInstanceConfig.class); ObjectProvider healthCheckHandler = applicationContext.getBeanProvider(HealthCheckHandler.class); EurekaClientConfig eurekaClientConfig = applicationContext.getBean(EurekaClientConfig.class); 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 34dd0cee4..6a96eb0df 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 @@ -19,6 +19,7 @@ spring-cloud-dubbo-sample-api spring-cloud-dubbo-provider-sample spring-cloud-dubbo-consumer-sample + spring-cloud-dubbo-provider-web-sample 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 13a5c4331..8c2a0c9eb 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 @@ -208,7 +208,7 @@ public class DubboSpringCloudConsumerBootstrap { public static void main(String[] args) { new SpringApplicationBuilder(DubboSpringCloudConsumerBootstrap.class) - .profiles("nacos") + .properties("spring.profiles.active=nacos") .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 index d2b72d471..263a56997 100644 --- 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 @@ -1,8 +1,12 @@ dubbo: registry: -# The Spring Cloud Dubbo's registry extension + # The Spring Cloud Dubbo's registry extension address: spring-cloud://localhost # The traditional Dubbo's registry # address: zookeeper://127.0.0.1:2181 server: - port: 7070 \ No newline at end of file + port: 0 + +provider: + application: + name: spring-cloud-alibaba-dubbo-web-provider \ 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 index 1d25940ca..dca555cf2 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 @@ -24,10 +24,6 @@ ribbon: nacos: enabled: false -provider: - application: - name: spring-cloud-alibaba-dubbo-provider - --- spring: profiles: nacos @@ -51,7 +47,7 @@ eureka: client: enabled: true service-url: - defaultZone: http://127.0.0.1:9090/eureka/ + defaultZone: http://127.0.0.1:8761/eureka/ --- diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml index 9ebd00a18..152e91aac 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml @@ -17,9 +17,10 @@ + - org.springframework.boot - spring-boot-starter-web + org.springframework + spring-web @@ -30,6 +31,11 @@ + + io.netty + netty-all + + org.jboss.resteasy resteasy-jaxrs @@ -60,6 +66,11 @@ resteasy-jaxb-provider + + org.hibernate.validator + hibernate-validator + + \ 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 4fbf8ea83..4606a190d 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("nacos") + .properties("spring.profiles.active=nacos") .run(args); } } 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/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 index 1f910a382..aeea2b167 100644 --- a/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 +++ 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 @@ -16,17 +16,9 @@ */ package org.springframework.cloud.alibaba.dubbo.service; -import org.apache.dubbo.rpc.RpcContext; +import org.apache.dubbo.config.annotation.Service; 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; -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 javax.ws.rs.Consumes; import javax.ws.rs.FormParam; @@ -37,9 +29,11 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; import java.util.HashMap; import java.util.Map; +import static org.springframework.cloud.alibaba.dubbo.util.LoggerUtils.log; import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON_VALUE; /** @@ -47,50 +41,46 @@ import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON_VALUE; * * @author Mercy */ -@org.apache.dubbo.config.annotation.Service(version = "1.0.0", protocol = {"dubbo", "rest"}) -@RestController +@Service(version = "1.0.0", protocol = {"dubbo", "rest"}) @Path("/") public class StandardRestService implements RestService { private Logger logger = LoggerFactory.getLogger(getClass()); @Override - @GetMapping(value = "/param") - @Path("/param") + @Path("param") @GET - public String param(@RequestParam @QueryParam("param") String param) { + public String param(@QueryParam("param") String param) { log("/param", param); return param; } @Override - @PostMapping("/params") - @Path("/params") + @Path("params") @POST - public String params(@RequestParam @QueryParam("a") int a, @RequestParam @QueryParam("b") String b) { + public String params(@QueryParam("a") int a, @QueryParam("b") String b) { log("/params", a + b); return a + b; } @Override - @GetMapping("/headers") - @Path("/headers") + @Path("headers") @GET - public String headers(@RequestHeader("h") @HeaderParam("h") String header, - @RequestHeader("h2") @HeaderParam("h2") String header2, - @RequestParam("v") @QueryParam("v") Integer param) { + public String headers(@HeaderParam("h") String header, + @HeaderParam("h2") String header2, + @QueryParam("v") + Integer param) { String result = header + " , " + header2 + " , " + param; log("/headers", result); return result; } @Override - @GetMapping("/path-variables/{p1}/{p2}") - @Path("/path-variables/{p1}/{p2}") + @Path("path-variables/{p1}/{p2}") @GET - public String pathVariables(@PathVariable("p1") @PathParam("p1") String path1, - @PathVariable("p2") @PathParam("p2") String path2, - @RequestParam("v") @QueryParam("v") String param) { + public String pathVariables(@PathParam("p1") String path1, + @PathParam("p2") String path2, + @QueryParam("v") String param) { String result = path1 + " , " + path2 + " , " + param; log("/path-variables", result); return result; @@ -100,19 +90,17 @@ public class StandardRestService implements RestService { // @CookieValue also does not support @Override - @PostMapping("/form") - @Path("/form") + @Path("form") @POST - public String form(@RequestParam("f") @FormParam("f") String form) { + public String form(@FormParam("f") String form) { return String.valueOf(form); } @Override - @PostMapping(value = "/request/body/map", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) - @Path("/request/body/map") + @Path("request/body/map") @POST @Produces(APPLICATION_JSON_VALUE) - public User requestBodyMap(@RequestBody Map data, @RequestParam("param") @QueryParam("param") String param) { + public User requestBodyMap(Map data, @QueryParam("param") String param) { User user = new User(); user.setId(((Integer) data.get("id")).longValue()); user.setName((String) data.get("name")); @@ -121,28 +109,15 @@ public class StandardRestService implements RestService { return user; } - @PostMapping(value = "/request/body/user", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) - @Path("/request/body/user") + @Path("request/body/user") @POST @Override - @Consumes(MediaType.APPLICATION_JSON_UTF8_VALUE) - public Map requestBodyUser(@RequestBody User user) { + @Consumes(MediaType.APPLICATION_JSON) + public Map requestBodyUser(User user) { Map map = new HashMap<>(); map.put("id", user.getId()); map.put("name", user.getName()); map.put("age", user.getAge()); return map; } - - private void log(String url, Object result) { - String message = String.format("The client[%s] uses '%s' protocol to call %s : %s", - RpcContext.getContext().getRemoteHostName(), - RpcContext.getContext().getUrl() == null ? "N/A" : RpcContext.getContext().getUrl().getProtocol(), - url, - result - ); - if (logger.isInfoEnabled()) { - logger.info(message); - } - } } 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 index 0f6094acb..056b48564 100644 --- 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 @@ -4,20 +4,16 @@ dubbo: protocols: dubbo: name: dubbo - port: 12345 + port: -1 rest: name: rest - port: 8081 + port: 9090 server: netty registry: # The Spring Cloud Dubbo's registry extension address: spring-cloud://localhost # The traditional Dubbo's registry # address: zookeeper://127.0.0.1:2181 - feign: hystrix: - enabled: true - -server: - port: 8080 \ No newline at end of file + enabled: true \ 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 index 3af263251..0d8dfca92 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 @@ -41,7 +41,7 @@ eureka: client: enabled: true service-url: - defaultZone: http://127.0.0.1:9090/eureka/ + defaultZone: http://127.0.0.1:8761/eureka/ --- diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/pom.xml new file mode 100644 index 000000000..af30d4b2b --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/pom.xml @@ -0,0 +1,33 @@ + + + + spring-cloud-alibaba-dubbo-examples + org.springframework.cloud + 0.2.2.BUILD-SNAPSHOT + ../pom.xml + + 4.0.0 + + org.springframework.cloud + spring-cloud-dubbo-provider-web-sample + Spring Cloud Dubbo Provider Web Sample + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.cloud + spring-cloud-dubbo-sample-api + ${project.version} + + + + + \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudWebProviderBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudWebProviderBootstrap.java new file mode 100644 index 000000000..799a3a748 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudWebProviderBootstrap.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.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 DubboSpringCloudWebProviderBootstrap { + + public static void main(String[] args) { + new SpringApplicationBuilder(DubboSpringCloudWebProviderBootstrap.class) + .properties("spring.profiles.active=nacos") + .run(args); + } +} diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/service/SpringRestService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/service/SpringRestService.java new file mode 100644 index 000000000..f39fd70e0 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/service/SpringRestService.java @@ -0,0 +1,109 @@ +/* + * 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.service; + +import org.apache.dubbo.config.annotation.Service; +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; +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 java.util.HashMap; +import java.util.Map; + +import static org.springframework.cloud.alibaba.dubbo.util.LoggerUtils.log; + +/** + * Spring MVC {@link RestService} + * + * @author Mercy + */ +@Service(version = "1.0.0") +@RestController +public class SpringRestService implements RestService { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + @GetMapping(value = "/param") + public String param(@RequestParam String param) { + log("/param", param); + return param; + } + + @Override + @PostMapping("/params") + public String params(@RequestParam int a, @RequestParam String b) { + log("/params", a + b); + return a + b; + } + + @Override + @GetMapping("/headers") + public String headers(@RequestHeader("h") String header, + @RequestHeader("h2") String header2, + @RequestParam("v") Integer param) { + String result = header + " , " + header2 + " , " + param; + log("/headers", result); + return result; + } + + @Override + @GetMapping("/path-variables/{p1}/{p2}") + public String pathVariables(@PathVariable("p1") String path1, + @PathVariable("p2") String path2, + @RequestParam("v") String param) { + String result = path1 + " , " + path2 + " , " + param; + log("/path-variables", result); + return result; + } + + @Override + @PostMapping("/form") + public String form(@RequestParam("f") String form) { + return String.valueOf(form); + } + + @Override + @PostMapping(value = "/request/body/map", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) + public User requestBodyMap(@RequestBody Map data, @RequestParam("param") String param) { + User user = new User(); + user.setId(((Integer) data.get("id")).longValue()); + user.setName((String) data.get("name")); + user.setAge((Integer) data.get("age")); + log("/request/body/map", param); + return user; + } + + @PostMapping(value = "/request/body/user", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + @Override + public Map requestBodyUser(@RequestBody User user) { + Map map = new HashMap<>(); + map.put("id", user.getId()); + map.put("name", user.getName()); + map.put("age", user.getAge()); + return map; + } + +} + diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/application.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/application.yaml new file mode 100644 index 000000000..a890294c8 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/application.yaml @@ -0,0 +1,19 @@ +dubbo: + scan: + base-packages: org.springframework.cloud.alibaba.dubbo.service + protocols: + dubbo: + name: dubbo + port: -1 + registry: +# The Spring Cloud Dubbo's registry extension + address: spring-cloud://localhost +# The traditional Dubbo's registry +# address: zookeeper://127.0.0.1:2181 + +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-web-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/bootstrap.yaml new file mode 100644 index 000000000..fd82247bf --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/bootstrap.yaml @@ -0,0 +1,64 @@ +spring: + application: + name: spring-cloud-alibaba-dubbo-web-provider + main: + allow-bean-definition-overriding: true + + + # default disable all + cloud: + nacos: + discovery: + enabled: false + register-enabled: false + zookeeper: + enabled: false + consul: + enabled: false + +eureka: + client: + enabled: false + + +--- +spring: + profiles: nacos + + cloud: + nacos: + discovery: + enabled: true + register-enabled: true + server-addr: 127.0.0.1:8848 + + +--- +spring: + profiles: eureka + +eureka: + client: + enabled: true + service-url: + defaultZone: http://127.0.0.1:8761/eureka/ + + +--- +spring: + profiles: zookeeper + cloud: + zookeeper: + enabled: true + 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-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/util/LoggerUtils.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/util/LoggerUtils.java new file mode 100644 index 000000000..1985c2832 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/util/LoggerUtils.java @@ -0,0 +1,41 @@ +/* + * 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.util; + +import org.apache.dubbo.rpc.RpcContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Logger Utilities + */ +public abstract class LoggerUtils { + + private static final Logger logger = LoggerFactory.getLogger(LoggerUtils.class); + + public static void log(String url, Object result) { + String message = String.format("The client[%s] uses '%s' protocol to call %s : %s", + RpcContext.getContext().getRemoteHostName(), + RpcContext.getContext().getUrl() == null ? "N/A" : RpcContext.getContext().getUrl().getProtocol(), + url, + result + ); + if (logger.isInfoEnabled()) { + logger.info(message); + } + } +}