diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/DubboMetadataEndpointAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/DubboMetadataEndpointAutoConfiguration.java
index 2d7a08002..f992365eb 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/DubboMetadataEndpointAutoConfiguration.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/DubboMetadataEndpointAutoConfiguration.java
@@ -16,7 +16,6 @@
*/
package com.alibaba.cloud.dubbo.actuate;
-import com.alibaba.cloud.dubbo.actuate.endpoint.DubboRestMetadataEndpoint;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -25,6 +24,8 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
+import com.alibaba.cloud.dubbo.actuate.endpoint.DubboRestMetadataEndpoint;
+
/**
* Dubbo Metadata Endpoints Auto-{@link Configuration}
*
@@ -35,12 +36,10 @@ import org.springframework.context.annotation.PropertySource;
@ManagementContextConfiguration
public class DubboMetadataEndpointAutoConfiguration {
- @Bean
- @ConditionalOnMissingBean
- @ConditionalOnEnabledEndpoint
- public DubboRestMetadataEndpoint dubboRestMetadataEndpoint() {
- return new DubboRestMetadataEndpoint();
- }
+ @Bean
+ @ConditionalOnMissingBean
+ @ConditionalOnEnabledEndpoint
+ public DubboRestMetadataEndpoint dubboRestMetadataEndpoint() {
+ return new DubboRestMetadataEndpoint();
+ }
}
-
-
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboRestMetadataEndpoint.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboRestMetadataEndpoint.java
index 41697d7e5..e04e246d5 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboRestMetadataEndpoint.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboRestMetadataEndpoint.java
@@ -16,12 +16,13 @@
*/
package com.alibaba.cloud.dubbo.actuate.endpoint;
-import com.alibaba.cloud.dubbo.service.DubboMetadataService;
+import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE;
+
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
-import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE;
+import com.alibaba.cloud.dubbo.service.DubboMetadataService;
/**
* Dubbo Rest Metadata {@link Endpoint}
@@ -31,11 +32,11 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE;
@Endpoint(id = "dubborestmetadata")
public class DubboRestMetadataEndpoint {
- @Autowired
- private DubboMetadataService dubboMetadataService;
+ @Autowired
+ private DubboMetadataService dubboMetadataService;
- @ReadOperation(produces = APPLICATION_JSON_UTF8_VALUE)
- public String get() {
- return dubboMetadataService.getServiceRestMetadata();
- }
+ @ReadOperation(produces = APPLICATION_JSON_UTF8_VALUE)
+ public String get() {
+ return dubboMetadataService.getServiceRestMetadata();
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/annotation/DubboTransported.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/annotation/DubboTransported.java
index 10724aa73..23dcf34ff 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/annotation/DubboTransported.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/annotation/DubboTransported.java
@@ -16,13 +16,7 @@
*/
package com.alibaba.cloud.dubbo.annotation;
-import org.apache.dubbo.config.annotation.Reference;
-import org.apache.dubbo.rpc.ExporterListener;
-import org.apache.dubbo.rpc.Filter;
-
-import org.springframework.cloud.client.loadbalancer.LoadBalanced;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.client.RestTemplate;
+import static org.apache.dubbo.rpc.cluster.Constants.DEFAULT_RETRIES;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
@@ -30,22 +24,31 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import static org.apache.dubbo.rpc.cluster.Constants.DEFAULT_RETRIES;
+import org.apache.dubbo.config.annotation.Reference;
+import org.apache.dubbo.rpc.ExporterListener;
+import org.apache.dubbo.rpc.Filter;
+
+import org.springframework.cloud.client.loadbalancer.LoadBalanced;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.client.RestTemplate;
/**
- * {@link DubboTransported @DubboTransported} annotation indicates that the traditional Spring Cloud Service-to-Service call is transported
- * by Dubbo under the hood, there are two main scenarios:
+ * {@link DubboTransported @DubboTransported} annotation indicates that the traditional
+ * Spring Cloud Service-to-Service call is transported by Dubbo under the hood, there are
+ * two main scenarios:
*
* {@link FeignClient @FeignClient} annotated classes:
*
- * If {@link DubboTransported @DubboTransported} annotated classes, the invocation of all methods of
- * {@link FeignClient @FeignClient} annotated classes.
+ * If {@link DubboTransported @DubboTransported} annotated classes, the invocation of all
+ * methods of {@link FeignClient @FeignClient} annotated classes.
*
*
- * If {@link DubboTransported @DubboTransported} annotated methods of {@link FeignClient @FeignClient} annotated classes.
+ * If {@link DubboTransported @DubboTransported} annotated methods of
+ * {@link FeignClient @FeignClient} annotated classes.
*
*
- * {@link LoadBalanced @LoadBalanced} {@link RestTemplate} annotated field, method and parameters
+ * {@link LoadBalanced @LoadBalanced} {@link RestTemplate} annotated field, method and
+ * parameters
*
*
*
@@ -54,94 +57,99 @@ import static org.apache.dubbo.rpc.cluster.Constants.DEFAULT_RETRIES;
* @see LoadBalanced
*/
@Retention(RetentionPolicy.RUNTIME)
-@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
+@Target(value = { ElementType.TYPE, ElementType.FIELD, ElementType.METHOD,
+ ElementType.PARAMETER })
@Documented
public @interface DubboTransported {
- /**
- * The protocol of Dubbo transport whose value could be used the placeholder "dubbo.transport.protocol"
- *
- * @return the default protocol is "dubbo"
- */
- String protocol() default "${dubbo.transport.protocol:dubbo}";
-
- /**
- * The cluster of Dubbo transport whose value could be used the placeholder "dubbo.transport.cluster"
- *
- * @return the default cluster is "failover"
- */
- String cluster() default "${dubbo.transport.cluster:failover}";
-
- /**
- * Whether to reconnect if connection is lost, if not specify, reconnect is enabled by default, and the interval
- * for retry connecting is 2000 ms
- *
- * @see Reference#reconnect()
- */
- String reconnect() default "${dubbo.transport.reconnect:2000}";
-
- /**
- * Maximum connections service provider can accept, default value is 0 - connection is shared
- *
- * @see Reference#connections()
- */
- int connections() default 0;
-
- /**
- * Service invocation retry times
- *
- * @see Reference#retries()
- */
- int retries() default DEFAULT_RETRIES;
-
- /**
- * Load balance strategy, legal values include: random, roundrobin, leastactive
- *
- * @see Reference#loadbalance()
- */
- String loadbalance() default "${dubbo.transport.loadbalance:}";
-
- /**
- * Maximum active requests allowed, default value is 0
- *
- * @see Reference#actives()
- */
- int actives() default 0;
-
- /**
- * Timeout value for service invocation, default value is 0
- *
- * @see Reference#timeout()
- */
- int timeout() default 0;
-
- /**
- * Specify cache implementation for service invocation, legal values include: lru, threadlocal, jcache
- *
- * @see Reference#cache()
- */
- String cache() default "${dubbo.transport.cache:}";
-
- /**
- * Filters for service invocation
- *
- * @see Filter
- * @see Reference#filter()
- */
- String[] filter() default {};
-
- /**
- * Listeners for service exporting and unexporting
- *
- * @see ExporterListener
- * @see Reference#listener()
- */
- String[] listener() default {};
-
- /**
- * Customized parameter key-value pair, for example: {key1, value1, key2, value2}
- *
- * @see Reference#parameters()
- */
- String[] parameters() default {};
+ /**
+ * The protocol of Dubbo transport whose value could be used the placeholder
+ * "dubbo.transport.protocol"
+ *
+ * @return the default protocol is "dubbo"
+ */
+ String protocol() default "${dubbo.transport.protocol:dubbo}";
+
+ /**
+ * The cluster of Dubbo transport whose value could be used the placeholder
+ * "dubbo.transport.cluster"
+ *
+ * @return the default cluster is "failover"
+ */
+ String cluster() default "${dubbo.transport.cluster:failover}";
+
+ /**
+ * Whether to reconnect if connection is lost, if not specify, reconnect is enabled by
+ * default, and the interval for retry connecting is 2000 ms
+ *
+ * @see Reference#reconnect()
+ */
+ String reconnect() default "${dubbo.transport.reconnect:2000}";
+
+ /**
+ * Maximum connections service provider can accept, default value is 0 - connection is
+ * shared
+ *
+ * @see Reference#connections()
+ */
+ int connections() default 0;
+
+ /**
+ * Service invocation retry times
+ *
+ * @see Reference#retries()
+ */
+ int retries() default DEFAULT_RETRIES;
+
+ /**
+ * Load balance strategy, legal values include: random, roundrobin, leastactive
+ *
+ * @see Reference#loadbalance()
+ */
+ String loadbalance() default "${dubbo.transport.loadbalance:}";
+
+ /**
+ * Maximum active requests allowed, default value is 0
+ *
+ * @see Reference#actives()
+ */
+ int actives() default 0;
+
+ /**
+ * Timeout value for service invocation, default value is 0
+ *
+ * @see Reference#timeout()
+ */
+ int timeout() default 0;
+
+ /**
+ * Specify cache implementation for service invocation, legal values include: lru,
+ * threadlocal, jcache
+ *
+ * @see Reference#cache()
+ */
+ String cache() default "${dubbo.transport.cache:}";
+
+ /**
+ * Filters for service invocation
+ *
+ * @see Filter
+ * @see Reference#filter()
+ */
+ String[] filter() default {};
+
+ /**
+ * Listeners for service exporting and unexporting
+ *
+ * @see ExporterListener
+ * @see Reference#listener()
+ */
+ String[] listener() default {};
+
+ /**
+ * Customized parameter key-value pair, for example: {key1, value1, key2, value2}
+ *
+ * @see Reference#parameters()
+ */
+ String[] parameters() default {};
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboLoadBalancedRestTemplateAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboLoadBalancedRestTemplateAutoConfiguration.java
index 00c464dff..5165e4b53 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboLoadBalancedRestTemplateAutoConfiguration.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboLoadBalancedRestTemplateAutoConfiguration.java
@@ -16,13 +16,11 @@
*/
package com.alibaba.cloud.dubbo.autoconfigure;
-import com.alibaba.cloud.dubbo.annotation.DubboTransported;
-import com.alibaba.cloud.dubbo.client.loadbalancer.DubboMetadataInitializerInterceptor;
-import com.alibaba.cloud.dubbo.client.loadbalancer.DubboTransporterInterceptor;
-import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
-import com.alibaba.cloud.dubbo.metadata.resolver.DubboTransportedAttributesResolver;
-import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContextFactory;
-import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
@@ -44,133 +42,154 @@ import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.util.CollectionUtils;
import org.springframework.web.client.RestTemplate;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import com.alibaba.cloud.dubbo.annotation.DubboTransported;
+import com.alibaba.cloud.dubbo.client.loadbalancer.DubboMetadataInitializerInterceptor;
+import com.alibaba.cloud.dubbo.client.loadbalancer.DubboTransporterInterceptor;
+import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
+import com.alibaba.cloud.dubbo.metadata.resolver.DubboTransportedAttributesResolver;
+import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContextFactory;
+import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory;
/**
- * Dubbo Auto-{@link Configuration} for {@link LoadBalanced @LoadBalanced} {@link RestTemplate}
+ * Dubbo Auto-{@link Configuration} for {@link LoadBalanced @LoadBalanced}
+ * {@link RestTemplate}
*
* @author Mercy
*/
@Configuration
-@ConditionalOnClass(name = {"org.springframework.web.client.RestTemplate"})
-@AutoConfigureAfter(name = {"org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration"})
-public class DubboLoadBalancedRestTemplateAutoConfiguration implements BeanClassLoaderAware, SmartInitializingSingleton {
-
- private static final Class DUBBO_TRANSPORTED_CLASS = DubboTransported.class;
-
- private static final String DUBBO_TRANSPORTED_CLASS_NAME = DUBBO_TRANSPORTED_CLASS.getName();
-
- @Autowired
- private DubboServiceMetadataRepository repository;
-
- @Autowired(required = false)
- private LoadBalancerInterceptor loadBalancerInterceptor;
-
- @Autowired(required = false)
- private RetryLoadBalancerInterceptor retryLoadBalancerInterceptor;
-
- @Autowired
- private ConfigurableListableBeanFactory beanFactory;
-
- @Autowired
- private DubboGenericServiceFactory serviceFactory;
-
- @Autowired
- private DubboGenericServiceExecutionContextFactory contextFactory;
-
- @Autowired
- private Environment environment;
-
- @LoadBalanced
- @Autowired(required = false)
- private Map restTemplates = Collections.emptyMap();
-
- private ClassLoader classLoader;
-
- /**
- * The {@link ClientHttpRequestInterceptor} bean that may be {@link LoadBalancerInterceptor} or {@link RetryLoadBalancerInterceptor}
- */
- private ClientHttpRequestInterceptor loadBalancerInterceptorBean;
-
- @Override
- public void afterSingletonsInstantiated() {
- loadBalancerInterceptorBean = retryLoadBalancerInterceptor != null ?
- retryLoadBalancerInterceptor :
- loadBalancerInterceptor;
- }
-
- /**
- * Adapt the {@link RestTemplate} beans that are annotated {@link LoadBalanced @LoadBalanced} and
- * {@link LoadBalanced @LoadBalanced} when Spring Boot application started
- * (after the callback of {@link SmartInitializingSingleton} beans or
- * {@link RestTemplateCustomizer#customize(RestTemplate) customization})
- */
- @EventListener(ApplicationStartedEvent.class)
- public void adaptRestTemplates() {
-
- DubboTransportedAttributesResolver attributesResolver = new DubboTransportedAttributesResolver(environment);
-
- for (Map.Entry entry : restTemplates.entrySet()) {
- String beanName = entry.getKey();
- Map dubboTranslatedAttributes = getDubboTranslatedAttributes(beanName, attributesResolver);
- if (!CollectionUtils.isEmpty(dubboTranslatedAttributes)) {
- adaptRestTemplate(entry.getValue(), dubboTranslatedAttributes);
- }
- }
- }
-
- /**
- * Gets the annotation attributes {@link RestTemplate} bean being annotated
- * {@link DubboTransported @DubboTransported}
- *
- * @param beanName the bean name of {@link LoadBalanced @LoadBalanced} {@link RestTemplate}
- * @param attributesResolver {@link DubboTransportedAttributesResolver}
- * @return non-null {@link Map}
- */
- private Map getDubboTranslatedAttributes(String beanName,
- DubboTransportedAttributesResolver attributesResolver) {
- Map attributes = Collections.emptyMap();
- BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
- if (beanDefinition instanceof AnnotatedBeanDefinition) {
- AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition) beanDefinition;
- MethodMetadata factoryMethodMetadata = annotatedBeanDefinition.getFactoryMethodMetadata();
- attributes = factoryMethodMetadata != null ?
- factoryMethodMetadata.getAnnotationAttributes(DUBBO_TRANSPORTED_CLASS_NAME) : Collections.emptyMap();
- }
- return attributesResolver.resolve(attributes);
- }
-
-
- /**
- * Adapt the instance of {@link DubboTransporterInterceptor} to the {@link LoadBalancerInterceptor} Bean.
- *
- * @param restTemplate {@link LoadBalanced @LoadBalanced} {@link RestTemplate} Bean
- * @param dubboTranslatedAttributes the annotation dubboTranslatedAttributes {@link RestTemplate} bean being annotated
- * {@link DubboTransported @DubboTransported}
- */
- private void adaptRestTemplate(RestTemplate restTemplate, Map dubboTranslatedAttributes) {
-
- List interceptors = new ArrayList<>(restTemplate.getInterceptors());
-
- int index = loadBalancerInterceptorBean == null ? -1 : interceptors.indexOf(loadBalancerInterceptorBean);
-
- index = index < 0 ? 0 : index;
-
- // Add ClientHttpRequestInterceptor instances before loadBalancerInterceptor
- interceptors.add(index++, new DubboMetadataInitializerInterceptor(repository));
-
- interceptors.add(index++, new DubboTransporterInterceptor(repository, restTemplate.getMessageConverters(),
- classLoader, dubboTranslatedAttributes, serviceFactory, contextFactory));
-
- restTemplate.setInterceptors(interceptors);
- }
-
- @Override
- public void setBeanClassLoader(ClassLoader classLoader) {
- this.classLoader = classLoader;
- }
+@ConditionalOnClass(name = { "org.springframework.web.client.RestTemplate" })
+@AutoConfigureAfter(name = {
+ "org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration" })
+public class DubboLoadBalancedRestTemplateAutoConfiguration
+ implements BeanClassLoaderAware, SmartInitializingSingleton {
+
+ private static final Class DUBBO_TRANSPORTED_CLASS = DubboTransported.class;
+
+ private static final String DUBBO_TRANSPORTED_CLASS_NAME = DUBBO_TRANSPORTED_CLASS
+ .getName();
+
+ @Autowired
+ private DubboServiceMetadataRepository repository;
+
+ @Autowired(required = false)
+ private LoadBalancerInterceptor loadBalancerInterceptor;
+
+ @Autowired(required = false)
+ private RetryLoadBalancerInterceptor retryLoadBalancerInterceptor;
+
+ @Autowired
+ private ConfigurableListableBeanFactory beanFactory;
+
+ @Autowired
+ private DubboGenericServiceFactory serviceFactory;
+
+ @Autowired
+ private DubboGenericServiceExecutionContextFactory contextFactory;
+
+ @Autowired
+ private Environment environment;
+
+ @LoadBalanced
+ @Autowired(required = false)
+ private Map restTemplates = Collections.emptyMap();
+
+ private ClassLoader classLoader;
+
+ /**
+ * The {@link ClientHttpRequestInterceptor} bean that may be
+ * {@link LoadBalancerInterceptor} or {@link RetryLoadBalancerInterceptor}
+ */
+ private ClientHttpRequestInterceptor loadBalancerInterceptorBean;
+
+ @Override
+ public void afterSingletonsInstantiated() {
+ loadBalancerInterceptorBean = retryLoadBalancerInterceptor != null
+ ? retryLoadBalancerInterceptor
+ : loadBalancerInterceptor;
+ }
+
+ /**
+ * Adapt the {@link RestTemplate} beans that are annotated
+ * {@link LoadBalanced @LoadBalanced} and {@link LoadBalanced @LoadBalanced} when
+ * Spring Boot application started (after the callback of
+ * {@link SmartInitializingSingleton} beans or
+ * {@link RestTemplateCustomizer#customize(RestTemplate) customization})
+ */
+ @EventListener(ApplicationStartedEvent.class)
+ public void adaptRestTemplates() {
+
+ DubboTransportedAttributesResolver attributesResolver = new DubboTransportedAttributesResolver(
+ environment);
+
+ for (Map.Entry entry : restTemplates.entrySet()) {
+ String beanName = entry.getKey();
+ Map dubboTranslatedAttributes = getDubboTranslatedAttributes(
+ beanName, attributesResolver);
+ if (!CollectionUtils.isEmpty(dubboTranslatedAttributes)) {
+ adaptRestTemplate(entry.getValue(), dubboTranslatedAttributes);
+ }
+ }
+ }
+
+ /**
+ * Gets the annotation attributes {@link RestTemplate} bean being annotated
+ * {@link DubboTransported @DubboTransported}
+ *
+ * @param beanName the bean name of {@link LoadBalanced @LoadBalanced}
+ * {@link RestTemplate}
+ * @param attributesResolver {@link DubboTransportedAttributesResolver}
+ * @return non-null {@link Map}
+ */
+ private Map getDubboTranslatedAttributes(String beanName,
+ DubboTransportedAttributesResolver attributesResolver) {
+ Map attributes = Collections.emptyMap();
+ BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
+ if (beanDefinition instanceof AnnotatedBeanDefinition) {
+ AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition) beanDefinition;
+ MethodMetadata factoryMethodMetadata = annotatedBeanDefinition
+ .getFactoryMethodMetadata();
+ attributes = factoryMethodMetadata != null
+ ? factoryMethodMetadata
+ .getAnnotationAttributes(DUBBO_TRANSPORTED_CLASS_NAME)
+ : Collections.emptyMap();
+ }
+ return attributesResolver.resolve(attributes);
+ }
+
+ /**
+ * Adapt the instance of {@link DubboTransporterInterceptor} to the
+ * {@link LoadBalancerInterceptor} Bean.
+ *
+ * @param restTemplate {@link LoadBalanced @LoadBalanced} {@link RestTemplate} Bean
+ * @param dubboTranslatedAttributes the annotation dubboTranslatedAttributes
+ * {@link RestTemplate} bean being annotated
+ * {@link DubboTransported @DubboTransported}
+ */
+ private void adaptRestTemplate(RestTemplate restTemplate,
+ Map dubboTranslatedAttributes) {
+
+ List interceptors = new ArrayList<>(
+ restTemplate.getInterceptors());
+
+ int index = loadBalancerInterceptorBean == null ? -1
+ : interceptors.indexOf(loadBalancerInterceptorBean);
+
+ index = index < 0 ? 0 : index;
+
+ // Add ClientHttpRequestInterceptor instances before loadBalancerInterceptor
+ interceptors.add(index++, new DubboMetadataInitializerInterceptor(repository));
+
+ interceptors.add(index++,
+ new DubboTransporterInterceptor(repository,
+ restTemplate.getMessageConverters(), classLoader,
+ dubboTranslatedAttributes, serviceFactory, contextFactory));
+
+ restTemplate.setInterceptors(interceptors);
+ }
+
+ @Override
+ public void setBeanClassLoader(ClassLoader classLoader) {
+ this.classLoader = classLoader;
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java
index cfab21fc1..f39aa5fb2 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java
@@ -16,20 +16,13 @@
*/
package com.alibaba.cloud.dubbo.autoconfigure;
+import java.util.Collection;
+import java.util.function.Supplier;
+
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.spring.ServiceBean;
import org.apache.dubbo.config.spring.context.event.ServiceBeanExportedEvent;
-import com.alibaba.cloud.dubbo.metadata.DubboProtocolConfigSupplier;
-import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
-import com.alibaba.cloud.dubbo.metadata.resolver.DubboServiceBeanMetadataResolver;
-import com.alibaba.cloud.dubbo.metadata.resolver.MetadataResolver;
-import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory;
-import com.alibaba.cloud.dubbo.service.DubboMetadataServiceExporter;
-import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy;
-import com.alibaba.cloud.dubbo.service.IntrospectiveDubboMetadataService;
-import com.alibaba.cloud.dubbo.util.JSONUtils;
-import feign.Contract;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -40,8 +33,17 @@ import org.springframework.context.annotation.Import;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.EventListener;
-import java.util.Collection;
-import java.util.function.Supplier;
+import com.alibaba.cloud.dubbo.metadata.DubboProtocolConfigSupplier;
+import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
+import com.alibaba.cloud.dubbo.metadata.resolver.DubboServiceBeanMetadataResolver;
+import com.alibaba.cloud.dubbo.metadata.resolver.MetadataResolver;
+import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory;
+import com.alibaba.cloud.dubbo.service.DubboMetadataServiceExporter;
+import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy;
+import com.alibaba.cloud.dubbo.service.IntrospectiveDubboMetadataService;
+import com.alibaba.cloud.dubbo.util.JSONUtils;
+
+import feign.Contract;
/**
* Spring Boot Auto-Configuration class for Dubbo Metadata
@@ -49,61 +51,62 @@ import java.util.function.Supplier;
* @author Mercy
*/
@Configuration
-@Import({DubboServiceMetadataRepository.class,
- IntrospectiveDubboMetadataService.class,
- DubboMetadataServiceExporter.class,
- JSONUtils.class})
+@Import({ DubboServiceMetadataRepository.class, IntrospectiveDubboMetadataService.class,
+ DubboMetadataServiceExporter.class, JSONUtils.class })
public class DubboMetadataAutoConfiguration {
- @Autowired
- private ObjectProvider dubboServiceMetadataRepository;
-
- @Autowired
- private MetadataResolver metadataResolver;
-
- @Autowired
- private DubboMetadataServiceExporter dubboMetadataConfigServiceExporter;
-
- @Bean
- @ConditionalOnMissingBean
- public MetadataResolver metadataJsonResolver(ObjectProvider contract) {
- return new DubboServiceBeanMetadataResolver(contract);
- }
-
- @Bean
- public Supplier dubboProtocolConfigSupplier(ObjectProvider> protocols) {
- return new DubboProtocolConfigSupplier(protocols);
- }
-
- @Bean
- @ConditionalOnMissingBean
- public DubboMetadataServiceProxy dubboMetadataConfigServiceProxy(DubboGenericServiceFactory factory) {
- return new DubboMetadataServiceProxy(factory);
- }
-
- // Event-Handling
-
- @EventListener(ServiceBeanExportedEvent.class)
- public void onServiceBeanExported(ServiceBeanExportedEvent event) {
- ServiceBean serviceBean = event.getServiceBean();
- publishServiceRestMetadata(serviceBean);
- }
-
- @EventListener(ApplicationFailedEvent.class)
- public void onApplicationFailed() {
- unExportDubboMetadataConfigService();
- }
-
- @EventListener(ContextClosedEvent.class)
- public void onContextClosed() {
- unExportDubboMetadataConfigService();
- }
-
- private void publishServiceRestMetadata(ServiceBean serviceBean) {
- dubboServiceMetadataRepository.getIfAvailable().publishServiceRestMetadata(metadataResolver.resolveServiceRestMetadata(serviceBean));
- }
-
- private void unExportDubboMetadataConfigService() {
- dubboMetadataConfigServiceExporter.unexport();
- }
+ @Autowired
+ private ObjectProvider dubboServiceMetadataRepository;
+
+ @Autowired
+ private MetadataResolver metadataResolver;
+
+ @Autowired
+ private DubboMetadataServiceExporter dubboMetadataConfigServiceExporter;
+
+ @Bean
+ @ConditionalOnMissingBean
+ public MetadataResolver metadataJsonResolver(ObjectProvider contract) {
+ return new DubboServiceBeanMetadataResolver(contract);
+ }
+
+ @Bean
+ public Supplier dubboProtocolConfigSupplier(
+ ObjectProvider> protocols) {
+ return new DubboProtocolConfigSupplier(protocols);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public DubboMetadataServiceProxy dubboMetadataConfigServiceProxy(
+ DubboGenericServiceFactory factory) {
+ return new DubboMetadataServiceProxy(factory);
+ }
+
+ // Event-Handling
+
+ @EventListener(ServiceBeanExportedEvent.class)
+ public void onServiceBeanExported(ServiceBeanExportedEvent event) {
+ ServiceBean serviceBean = event.getServiceBean();
+ publishServiceRestMetadata(serviceBean);
+ }
+
+ @EventListener(ApplicationFailedEvent.class)
+ public void onApplicationFailed() {
+ unExportDubboMetadataConfigService();
+ }
+
+ @EventListener(ContextClosedEvent.class)
+ public void onContextClosed() {
+ unExportDubboMetadataConfigService();
+ }
+
+ private void publishServiceRestMetadata(ServiceBean serviceBean) {
+ dubboServiceMetadataRepository.getIfAvailable().publishServiceRestMetadata(
+ metadataResolver.resolveServiceRestMetadata(serviceBean));
+ }
+
+ private void unExportDubboMetadataConfigService() {
+ dubboMetadataConfigServiceExporter.unexport();
+ }
}
\ No newline at end of file
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java
index 230b54b01..0f282bf3f 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java
@@ -16,38 +16,39 @@
*/
package com.alibaba.cloud.dubbo.autoconfigure;
-import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
-import com.alibaba.cloud.dubbo.openfeign.TargeterBeanPostProcessor;
-import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContextFactory;
-import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory;
+import static com.alibaba.cloud.dubbo.autoconfigure.DubboOpenFeignAutoConfiguration.TARGETER_CLASS_NAME;
+
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
-import static com.alibaba.cloud.dubbo.autoconfigure.DubboOpenFeignAutoConfiguration.TARGETER_CLASS_NAME;
-
+import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
+import com.alibaba.cloud.dubbo.openfeign.TargeterBeanPostProcessor;
+import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContextFactory;
+import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory;
/**
* Dubbo Feign Auto-{@link Configuration Configuration}
*
* @author Mercy
*/
-@ConditionalOnClass(name = {"feign.Feign", TARGETER_CLASS_NAME})
-@AutoConfigureAfter(name = {"org.springframework.cloud.openfeign.FeignAutoConfiguration"})
+@ConditionalOnClass(name = { "feign.Feign", TARGETER_CLASS_NAME })
+@AutoConfigureAfter(name = {
+ "org.springframework.cloud.openfeign.FeignAutoConfiguration" })
@Configuration
public class DubboOpenFeignAutoConfiguration {
- public static final String TARGETER_CLASS_NAME = "org.springframework.cloud.openfeign.Targeter";
+ public static final String TARGETER_CLASS_NAME = "org.springframework.cloud.openfeign.Targeter";
- @Bean
- public TargeterBeanPostProcessor targeterBeanPostProcessor(Environment environment,
- DubboServiceMetadataRepository dubboServiceMetadataRepository,
- DubboGenericServiceFactory dubboGenericServiceFactory,
- DubboGenericServiceExecutionContextFactory contextFactory) {
- return new TargeterBeanPostProcessor(environment, dubboServiceMetadataRepository,
- dubboGenericServiceFactory, contextFactory);
- }
+ @Bean
+ public TargeterBeanPostProcessor targeterBeanPostProcessor(Environment environment,
+ DubboServiceMetadataRepository dubboServiceMetadataRepository,
+ DubboGenericServiceFactory dubboGenericServiceFactory,
+ DubboGenericServiceExecutionContextFactory contextFactory) {
+ return new TargeterBeanPostProcessor(environment, dubboServiceMetadataRepository,
+ dubboGenericServiceFactory, contextFactory);
+ }
}
\ No newline at end of file
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceAutoConfiguration.java
index 70ba733ba..70d992dcd 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceAutoConfiguration.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceAutoConfiguration.java
@@ -16,13 +16,6 @@
*/
package com.alibaba.cloud.dubbo.autoconfigure;
-import com.alibaba.cloud.dubbo.env.DubboCloudProperties;
-import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContextFactory;
-import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory;
-import com.alibaba.cloud.dubbo.service.parameter.PathVariableServiceParameterResolver;
-import com.alibaba.cloud.dubbo.service.parameter.RequestBodyServiceParameterResolver;
-import com.alibaba.cloud.dubbo.service.parameter.RequestHeaderServiceParameterResolver;
-import com.alibaba.cloud.dubbo.service.parameter.RequestParamServiceParameterResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -33,6 +26,14 @@ import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.core.env.PropertyResolver;
+import com.alibaba.cloud.dubbo.env.DubboCloudProperties;
+import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContextFactory;
+import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory;
+import com.alibaba.cloud.dubbo.service.parameter.PathVariableServiceParameterResolver;
+import com.alibaba.cloud.dubbo.service.parameter.RequestBodyServiceParameterResolver;
+import com.alibaba.cloud.dubbo.service.parameter.RequestHeaderServiceParameterResolver;
+import com.alibaba.cloud.dubbo.service.parameter.RequestParamServiceParameterResolver;
+
/**
* Spring Boot Auto-Configuration class for Dubbo Service
*
@@ -42,32 +43,30 @@ import org.springframework.core.env.PropertyResolver;
@EnableConfigurationProperties(DubboCloudProperties.class)
public class DubboServiceAutoConfiguration {
- @Bean
- @ConditionalOnMissingBean
- public DubboGenericServiceFactory dubboGenericServiceFactory() {
- return new DubboGenericServiceFactory();
- }
+ @Bean
+ @ConditionalOnMissingBean
+ public DubboGenericServiceFactory dubboGenericServiceFactory() {
+ return new DubboGenericServiceFactory();
+ }
- /**
- * Build a primary {@link PropertyResolver} bean to {@link Autowired @Autowired}
- *
- * @param environment {@link Environment}
- * @return alias bean for {@link Environment}
- */
- @Bean
- @Primary
- public PropertyResolver primaryPropertyResolver(Environment environment) {
- return environment;
- }
+ /**
+ * Build a primary {@link PropertyResolver} bean to {@link Autowired @Autowired}
+ *
+ * @param environment {@link Environment}
+ * @return alias bean for {@link Environment}
+ */
+ @Bean
+ @Primary
+ public PropertyResolver primaryPropertyResolver(Environment environment) {
+ return environment;
+ }
- @Configuration
- @Import(value = {
- DubboGenericServiceExecutionContextFactory.class,
- RequestParamServiceParameterResolver.class,
- RequestBodyServiceParameterResolver.class,
- RequestHeaderServiceParameterResolver.class,
- PathVariableServiceParameterResolver.class
- })
- static class ParameterResolversConfiguration {
- }
+ @Configuration
+ @Import(value = { DubboGenericServiceExecutionContextFactory.class,
+ RequestParamServiceParameterResolver.class,
+ RequestBodyServiceParameterResolver.class,
+ RequestHeaderServiceParameterResolver.class,
+ PathVariableServiceParameterResolver.class })
+ static class ParameterResolversConfiguration {
+ }
}
\ No newline at end of file
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java
index 4a91b762b..db22da918 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java
@@ -16,21 +16,24 @@
*/
package com.alibaba.cloud.dubbo.autoconfigure;
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.registry.NotifyListener;
+import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceDiscoveryAutoConfiguration.CONSUL_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME;
+import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceDiscoveryAutoConfiguration.NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME;
+import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceDiscoveryAutoConfiguration.ZOOKEEPER_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME;
+import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME;
+import static com.alibaba.cloud.nacos.discovery.NacosDiscoveryClient.hostToServiceInstanceList;
+import static org.springframework.util.StringUtils.hasText;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.ConcurrentSkipListSet;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
-import com.alibaba.cloud.dubbo.env.DubboCloudProperties;
-import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
-import com.alibaba.cloud.dubbo.registry.AbstractSpringCloudRegistry;
-import com.alibaba.cloud.dubbo.registry.event.ServiceInstancesChangedEvent;
-import com.alibaba.cloud.dubbo.registry.event.SubscribedServicesChangedEvent;
-import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
-import com.alibaba.cloud.nacos.discovery.NacosWatch;
-import com.alibaba.nacos.api.exception.NacosException;
-import com.alibaba.nacos.api.naming.NamingService;
-import com.alibaba.nacos.api.naming.listener.NamingEvent;
-import com.netflix.discovery.CacheRefreshedEvent;
-import com.netflix.discovery.shared.Applications;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.listen.Listenable;
import org.apache.curator.framework.listen.ListenerContainer;
@@ -38,6 +41,10 @@ import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.registry.NotifyListener;
+
import org.apache.zookeeper.Watcher;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
@@ -67,26 +74,22 @@ import org.springframework.scheduling.TaskScheduler;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.ReflectionUtils;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.ConcurrentSkipListSet;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Predicate;
-import java.util.stream.Stream;
-
-import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceDiscoveryAutoConfiguration.CONSUL_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME;
-import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceDiscoveryAutoConfiguration.NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME;
-import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceDiscoveryAutoConfiguration.ZOOKEEPER_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME;
-import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME;
-import static com.alibaba.cloud.nacos.discovery.NacosDiscoveryClient.hostToServiceInstanceList;
-import static org.springframework.util.StringUtils.hasText;
+import com.alibaba.cloud.dubbo.env.DubboCloudProperties;
+import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
+import com.alibaba.cloud.dubbo.registry.AbstractSpringCloudRegistry;
+import com.alibaba.cloud.dubbo.registry.event.ServiceInstancesChangedEvent;
+import com.alibaba.cloud.dubbo.registry.event.SubscribedServicesChangedEvent;
+import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+import com.alibaba.cloud.nacos.discovery.NacosWatch;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.alibaba.nacos.api.naming.NamingService;
+import com.alibaba.nacos.api.naming.listener.NamingEvent;
+import com.netflix.discovery.CacheRefreshedEvent;
+import com.netflix.discovery.shared.Applications;
/**
- * Dubbo Service Discovery Auto {@link Configuration} (after {@link DubboServiceRegistrationAutoConfiguration})
+ * Dubbo Service Discovery Auto {@link Configuration} (after
+ * {@link DubboServiceRegistrationAutoConfiguration})
*
* @author Mercy
* @see DubboServiceRegistrationAutoConfiguration
@@ -96,421 +99,454 @@ import static org.springframework.util.StringUtils.hasText;
@Configuration
@ConditionalOnClass(name = "org.springframework.cloud.client.discovery.DiscoveryClient")
@ConditionalOnProperty(name = "spring.cloud.discovery.enabled", matchIfMissing = true)
-@AutoConfigureAfter(name = {
- EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME,
- ZOOKEEPER_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME,
- CONSUL_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME,
- NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME
-}, value = {DubboServiceRegistrationAutoConfiguration.class})
+@AutoConfigureAfter(name = { EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME,
+ ZOOKEEPER_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME,
+ CONSUL_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME,
+ NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME }, value = {
+ DubboServiceRegistrationAutoConfiguration.class })
public class DubboServiceDiscoveryAutoConfiguration {
- public static final String ZOOKEEPER_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME = "org.springframework.cloud.zookeeper.discovery.ZookeeperDiscoveryAutoConfiguration";
-
- public static final String CONSUL_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME = "org.springframework.cloud.consul.discovery.ConsulDiscoveryClientConfiguration";
-
- public static final String NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME = "com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration";
-
- private final DubboServiceMetadataRepository dubboServiceMetadataRepository;
-
- private final Logger logger = LoggerFactory.getLogger(getClass());
-
- private final ApplicationEventPublisher applicationEventPublisher;
-
- private final DiscoveryClient discoveryClient;
-
- private final AtomicReference heartbeatState = new AtomicReference<>();
-
- /**
- * @see #defaultHeartbeatEventChangePredicate()
- */
- private final ObjectProvider> heartbeatEventChangedPredicate;
-
- public DubboServiceDiscoveryAutoConfiguration(DubboServiceMetadataRepository dubboServiceMetadataRepository,
- ApplicationEventPublisher applicationEventPublisher,
- DiscoveryClient discoveryClient,
- ObjectProvider> heartbeatEventChangedPredicate) {
- this.dubboServiceMetadataRepository = dubboServiceMetadataRepository;
- this.applicationEventPublisher = applicationEventPublisher;
- this.discoveryClient = discoveryClient;
- this.heartbeatEventChangedPredicate = heartbeatEventChangedPredicate;
- }
-
- /**
- * Dispatch a {@link ServiceInstancesChangedEvent}
- *
- * @param serviceName the name of service
- * @param serviceInstances the {@link ServiceInstance instances} of some service
- * @see AbstractSpringCloudRegistry#registerServiceInstancesChangedEventListener(URL, NotifyListener)
- */
- private void dispatchServiceInstancesChangedEvent(String serviceName, Collection serviceInstances) {
- if (!hasText(serviceName) || serviceInstances == null) {
- return;
- }
- ServiceInstancesChangedEvent event = new ServiceInstancesChangedEvent(serviceName, serviceInstances);
- if (logger.isInfoEnabled()) {
- logger.info("The event of the service instances[name : {} , size : {}] change is about to be dispatched",
- serviceName, serviceInstances.size());
- }
- applicationEventPublisher.publishEvent(event);
- }
-
- private List getInstances(String serviceName) {
- return discoveryClient.getInstances(serviceName);
- }
-
- /**
- * Dispatch a {@link ServiceInstancesChangedEvent} when the {@link HeartbeatEvent} raised, use for these scenarios:
- *
- * Eureka : {@link CloudEurekaClient#onCacheRefreshed()} publishes a {@link HeartbeatEvent} instead of {@link CacheRefreshedEvent}
- * Zookeeper : {@link ZookeeperServiceWatch#childEvent(CuratorFramework, TreeCacheEvent)} publishes a
- * {@link HeartbeatEvent} when {@link ZookeeperDiscoveryProperties#getRoot() the services' root path} has been changed
- * Consul : {@link ConsulCatalogWatch#catalogServicesWatch()} publishes a {@link HeartbeatEvent} when
- * Consul's Blocking Queries response
- *
- * Nacos : {@link NacosWatch#nacosServicesWatch()} publishes a {@link HeartbeatEvent} under a
- * {@link TaskScheduler} every {@link NacosDiscoveryProperties#getWatchDelay()} milliseconds
- *
- *
- * In order to reduce the duplicated handling for {@link ServiceInstancesChangedEvent},
- * {@link #defaultHeartbeatEventChangePredicate()} method providers the default implementation to detect whether the
- * {@link HeartbeatEvent#getValue() state} is changed or not. If and only if changed, the
- * {@link #dispatchServiceInstancesChangedEvent(String, Collection)} will be executed.
- *
- * Note :
- * Spring Cloud {@link HeartbeatEvent} has a critical flaw that can't figure out which service was changed precisely,
- * it's just used for a notification that the
- * {@link DubboServiceMetadataRepository#getSubscribedServices() subscribed services} used to
- * {@link NotifyListener#notify(List) notify} the Dubbo consumer cached {@link URL URLs}.
- * Because of some {@link DiscoveryClient} implementations have the better and fine-grained the event mechanism for service instances
- * change, thus {@link HeartbeatEvent} handle will be ignored in these scenarios:
- *
- * Zookeeper : {@link Watcher}, see {@link ZookeeperConfiguration#heartbeatEventChangedPredicate()}
- * Nacos : {@link com.alibaba.nacos.api.naming.listener.EventListener} , see {@link NacosConfiguration#heartbeatEventChangedPredicate()}
- *
- *
- * If the customized {@link DiscoveryClient} also providers the similar mechanism, the implementation could declare
- * a Spring Bean of {@link Predicate} of {@link HeartbeatEvent} to override
- * {@link #defaultHeartbeatEventChangePredicate() default one}.
- *
- * @param event the instance of {@link HeartbeatEvent}
- * @see HeartbeatEvent
- */
- @EventListener(HeartbeatEvent.class)
- public void onHeartbeatEvent(HeartbeatEvent event) {
- /**
- * Try to re-initialize the subscribed services, in order to sense the change of services if
- * {@link DubboCloudProperties#getSubscribedServices()} is wildcard that indicates all services should be
- * subscribed.
- */
- Stream subscribedServices = dubboServiceMetadataRepository.initSubscribedServices();
-
- heartbeatEventChangedPredicate.ifAvailable(predicate -> {
- if (predicate.test(event)) {
- // Dispatch ServiceInstancesChangedEvent for each service
- subscribedServices.forEach(serviceName -> {
- List serviceInstances = getInstances(serviceName);
- dispatchServiceInstancesChangedEvent(serviceName, serviceInstances);
- });
- }
- });
- }
-
- /**
- * The default {@link Predicate} implementation of {@link HeartbeatEvent} based on the comparison between
- * previous and current {@link HeartbeatEvent#getValue() state value}, the {@link DiscoveryClient}
- * implementation may override current.
- *
- * @return {@link Predicate}
- * @see EurekaConfiguration#heartbeatEventChangedPredicate()
- */
- @Bean
- @ConditionalOnMissingBean
- public Predicate defaultHeartbeatEventChangePredicate() {
- return event -> {
- Object oldState = heartbeatState.get();
- Object newState = event.getValue();
- return heartbeatState.compareAndSet(oldState, newState) && !Objects.equals(oldState, newState);
- };
- }
-
-
- /**
- * Eureka Customized Configuration
- */
- @Configuration
- @ConditionalOnBean(name = EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME)
- public class EurekaConfiguration {
-
- private final AtomicReference appsHashCodeCache = new AtomicReference<>();
-
- /**
- * Compare {@link Applications#getAppsHashCode() apps hash code} between last {@link Applications} and current.
- *
- * @see Applications#getAppsHashCode()
- */
- @Bean
- public Predicate heartbeatEventChangedPredicate() {
- return event -> {
- String oldAppsHashCode = appsHashCodeCache.get();
- CloudEurekaClient cloudEurekaClient = (CloudEurekaClient) event.getSource();
- Applications applications = cloudEurekaClient.getApplications();
- String appsHashCode = applications.getAppsHashCode();
- return appsHashCodeCache.compareAndSet(oldAppsHashCode, appsHashCode) &&
- !Objects.equals(oldAppsHashCode, appsHashCode);
- };
- }
- }
-
- /**
- * Zookeeper Customized Configuration
- */
- @Configuration
- @ConditionalOnBean(name = ZOOKEEPER_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME)
- @Aspect
- public class ZookeeperConfiguration implements ApplicationListener {
- /**
- * The pointcut expression for {@link ZookeeperServiceWatch#childEvent(CuratorFramework, TreeCacheEvent)}
- */
- public static final String CHILD_EVENT_POINTCUT_EXPRESSION =
- "execution(void org.springframework.cloud.zookeeper.discovery.ZookeeperServiceWatch.childEvent(..)) && args(client,event)";
-
- /**
- * The path separator of Zookeeper node
- */
- public static final String NODE_PATH_SEPARATOR = "/";
-
- /**
- * The path variable name for the name of service
- */
- private static final String SERVICE_NAME_PATH_VARIABLE_NAME = "serviceName";
-
- /**
- * The path variable name for the id of {@link ServiceInstance service instance}
- */
- private static final String SERVICE_INSTANCE_ID_PATH_VARIABLE_NAME = "serviceInstanceId";
-
- private final ZookeeperServiceWatch zookeeperServiceWatch;
-
- private final String rootPath;
-
- private final AntPathMatcher pathMatcher;
-
- /**
- * Ant Path pattern for {@link ServiceInstance} :
- *
- *
- * ${{@link #rootPath}}/{serviceName}/{serviceInstanceId}
- *
- * @see #rootPath
- * @see #SERVICE_NAME_PATH_VARIABLE_NAME
- * @see #SERVICE_INSTANCE_ID_PATH_VARIABLE_NAME
- */
- private final String serviceInstancePathPattern;
-
- /**
- * The {@link ThreadLocal} holds the processed service name
- */
- private final ThreadLocal processedServiceNameThreadLocal;
-
- ZookeeperConfiguration(
- ZookeeperDiscoveryProperties zookeeperDiscoveryProperties,
- ZookeeperServiceWatch zookeeperServiceWatch) {
- this.zookeeperServiceWatch = zookeeperServiceWatch;
- this.rootPath = zookeeperDiscoveryProperties.getRoot();
- this.pathMatcher = new AntPathMatcher(NODE_PATH_SEPARATOR);
- this.serviceInstancePathPattern = rootPath +
- NODE_PATH_SEPARATOR + "{" + SERVICE_NAME_PATH_VARIABLE_NAME + "}" +
- NODE_PATH_SEPARATOR + "{" + SERVICE_INSTANCE_ID_PATH_VARIABLE_NAME + "}";
- this.processedServiceNameThreadLocal = new ThreadLocal<>();
- }
-
- /**
- * Zookeeper uses {@link TreeCacheEvent} to trigger {@link #dispatchServiceInstancesChangedEvent(String, Collection)}
- * , thus {@link HeartbeatEvent} handle is always ignored
- *
- * @return false
forever
- */
- @Bean
- public Predicate heartbeatEventChangedPredicate() {
- return event -> false;
- }
-
- /**
- * Handle on {@link InstanceRegisteredEvent} after
- * {@link ZookeeperServiceWatch#onApplicationEvent(InstanceRegisteredEvent)}
- *
- * @param event {@link InstanceRegisteredEvent}
- * @see #reattachTreeCacheListeners()
- */
- @Override
- public void onApplicationEvent(InstanceRegisteredEvent event) {
- reattachTreeCacheListeners();
- }
-
- /**
- * Re-attach the {@link TreeCacheListener TreeCacheListeners}
- */
- private void reattachTreeCacheListeners() {
-
- TreeCache treeCache = zookeeperServiceWatch.getCache();
-
- Listenable listenable = treeCache.getListenable();
-
- /**
- * All registered TreeCacheListeners except {@link ZookeeperServiceWatch}.
- * Usually, "otherListeners" will be empty because Spring Cloud Zookeeper only adds
- * "zookeeperServiceWatch" bean as {@link TreeCacheListener}
- */
- List otherListeners = new LinkedList<>();
-
- if (listenable instanceof ListenerContainer) {
- ListenerContainer listenerContainer = (ListenerContainer) listenable;
- listenerContainer.forEach(listener -> {
- /**
- * Even though "listener" is an instance of {@link ZookeeperServiceWatch},
- * "zookeeperServiceWatch" bean that was enhanced by AOP is different from the former,
- * thus it's required to exclude "listener"
- */
- if (!(listener instanceof ZookeeperServiceWatch)) {
- otherListeners.add(listener);
- }
- return null;
- });
-
- // remove all TreeCacheListeners temporarily
- listenerContainer.clear();
- // re-store zookeeperServiceWatch, and make sure it's first one
- // now "beforeChildEvent" is available for Spring AOP
- listenerContainer.addListener(zookeeperServiceWatch);
- // re-store others
- otherListeners.forEach(listenerContainer::addListener);
- } else {
- if (logger.isWarnEnabled()) {
- logger.warn("Tell me which version Curator framework current application used? I will do better :D");
- }
- }
- }
-
- /**
- * Try to {@link #dispatchServiceInstancesChangedEvent(String, Collection) dispatch}
- * {@link ServiceInstancesChangedEvent} before {@link ZookeeperServiceWatch#childEvent(CuratorFramework, TreeCacheEvent)}
- * execution if required
- *
- * @param client {@link CuratorFramework}
- * @param event {@link TreeCacheEvent}
- */
- @Before(CHILD_EVENT_POINTCUT_EXPRESSION)
- public void beforeChildEvent(CuratorFramework client, TreeCacheEvent event) {
- if (supportsEventType(event)) {
- String serviceName = resolveServiceName(event);
- if (hasText(serviceName)) {
- dispatchServiceInstancesChangedEvent(serviceName, getInstances(serviceName));
- }
- }
- }
-
- @After(CHILD_EVENT_POINTCUT_EXPRESSION)
- public void afterChildEvent(CuratorFramework client, TreeCacheEvent event) {
- }
-
- /**
- * Resolve the name of service
- *
- * @param event {@link TreeCacheEvent}
- * @return If the Zookeeper's {@link ChildData#getPath() node path} that was notified comes from
- * {@link ServiceInstance the service instance}, return it's parent path as the service name,
- * or return null
- */
- private String resolveServiceName(TreeCacheEvent event) {
- ChildData childData = event.getData();
- String path = childData.getPath();
- if (logger.isDebugEnabled()) {
- logger.debug("ZK node[path : {}] event type : {}", path, event.getType());
- }
-
- String serviceName = null;
-
- if (pathMatcher.match(serviceInstancePathPattern, path)) {
- Map variables = pathMatcher.extractUriTemplateVariables(serviceInstancePathPattern, path);
- serviceName = variables.get(SERVICE_NAME_PATH_VARIABLE_NAME);
- }
-
- return serviceName;
- }
-
- /**
- * The {@link TreeCacheEvent#getType() event type} is supported or not
- *
- * @param event {@link TreeCacheEvent}
- * @return the rule is same as {@link ZookeeperServiceWatch#childEvent(CuratorFramework, TreeCacheEvent)} method
- */
- private boolean supportsEventType(TreeCacheEvent event) {
- TreeCacheEvent.Type eventType = event.getType();
- return eventType.equals(TreeCacheEvent.Type.NODE_ADDED)
- || eventType.equals(TreeCacheEvent.Type.NODE_REMOVED)
- || eventType.equals(TreeCacheEvent.Type.NODE_UPDATED);
- }
- }
-
- /**
- * Consul Customized Configuration
- */
- @Configuration
- @ConditionalOnBean(name = CONSUL_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME)
- class ConsulConfiguration {
-
- }
-
- /**
- * Nacos Customized Configuration
- */
- @Configuration
- @ConditionalOnBean(name = NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME)
- class NacosConfiguration {
-
- private final NamingService namingService;
-
- /**
- * the set of services is listening
- */
- private final Set listeningServices;
-
- NacosConfiguration(NacosDiscoveryProperties nacosDiscoveryProperties) {
- this.namingService = nacosDiscoveryProperties.namingServiceInstance();
- this.listeningServices = new ConcurrentSkipListSet<>();
- }
-
- /**
- * Nacos uses {@link EventListener} to trigger {@link #dispatchServiceInstancesChangedEvent(String, Collection)}
- * , thus {@link HeartbeatEvent} handle is always ignored
- *
- * @return false
forever
- */
- @Bean
- public Predicate heartbeatEventChangedPredicate() {
- return event -> false;
- }
-
- @EventListener(SubscribedServicesChangedEvent.class)
- public void onSubscribedServicesChangedEvent(SubscribedServicesChangedEvent event) throws Exception {
- // subscribe EventListener for each service
- event.getNewSubscribedServices().forEach(this::subscribeEventListener);
- }
-
- private void subscribeEventListener(String serviceName) {
- if (listeningServices.add(serviceName)) {
- try {
- namingService.subscribe(serviceName, event -> {
- if (event instanceof NamingEvent) {
- NamingEvent namingEvent = (NamingEvent) event;
- List serviceInstances = hostToServiceInstanceList(namingEvent.getInstances(), serviceName);
- dispatchServiceInstancesChangedEvent(serviceName, serviceInstances);
- }
- });
- } catch (NacosException e) {
- ReflectionUtils.rethrowRuntimeException(e);
- }
- }
- }
- }
+ public static final String ZOOKEEPER_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME = "org.springframework.cloud.zookeeper.discovery.ZookeeperDiscoveryAutoConfiguration";
+
+ public static final String CONSUL_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME = "org.springframework.cloud.consul.discovery.ConsulDiscoveryClientConfiguration";
+
+ public static final String NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME = "com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration";
+
+ private final DubboServiceMetadataRepository dubboServiceMetadataRepository;
+
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+
+ private final ApplicationEventPublisher applicationEventPublisher;
+
+ private final DiscoveryClient discoveryClient;
+
+ private final AtomicReference heartbeatState = new AtomicReference<>();
+
+ /**
+ * @see #defaultHeartbeatEventChangePredicate()
+ */
+ private final ObjectProvider> heartbeatEventChangedPredicate;
+
+ public DubboServiceDiscoveryAutoConfiguration(
+ DubboServiceMetadataRepository dubboServiceMetadataRepository,
+ ApplicationEventPublisher applicationEventPublisher,
+ DiscoveryClient discoveryClient,
+ ObjectProvider> heartbeatEventChangedPredicate) {
+ this.dubboServiceMetadataRepository = dubboServiceMetadataRepository;
+ this.applicationEventPublisher = applicationEventPublisher;
+ this.discoveryClient = discoveryClient;
+ this.heartbeatEventChangedPredicate = heartbeatEventChangedPredicate;
+ }
+
+ /**
+ * Dispatch a {@link ServiceInstancesChangedEvent}
+ *
+ * @param serviceName the name of service
+ * @param serviceInstances the {@link ServiceInstance instances} of some service
+ * @see AbstractSpringCloudRegistry#registerServiceInstancesChangedEventListener(URL,
+ * NotifyListener)
+ */
+ private void dispatchServiceInstancesChangedEvent(String serviceName,
+ Collection serviceInstances) {
+ if (!hasText(serviceName) || serviceInstances == null) {
+ return;
+ }
+ ServiceInstancesChangedEvent event = new ServiceInstancesChangedEvent(serviceName,
+ serviceInstances);
+ if (logger.isInfoEnabled()) {
+ logger.info(
+ "The event of the service instances[name : {} , size : {}] change is about to be dispatched",
+ serviceName, serviceInstances.size());
+ }
+ applicationEventPublisher.publishEvent(event);
+ }
+
+ private List getInstances(String serviceName) {
+ return discoveryClient.getInstances(serviceName);
+ }
+
+ /**
+ * Dispatch a {@link ServiceInstancesChangedEvent} when the {@link HeartbeatEvent}
+ * raised, use for these scenarios:
+ *
+ * Eureka : {@link CloudEurekaClient#onCacheRefreshed()} publishes a
+ * {@link HeartbeatEvent} instead of {@link CacheRefreshedEvent}
+ * Zookeeper :
+ * {@link ZookeeperServiceWatch#childEvent(CuratorFramework, TreeCacheEvent)}
+ * publishes a {@link HeartbeatEvent} when
+ * {@link ZookeeperDiscoveryProperties#getRoot() the services' root path} has been
+ * changed
+ * Consul : {@link ConsulCatalogWatch#catalogServicesWatch()} publishes a
+ * {@link HeartbeatEvent} when
+ * Consul's Blocking
+ * Queries response
+ * Nacos : {@link NacosWatch#nacosServicesWatch()} publishes a
+ * {@link HeartbeatEvent} under a {@link TaskScheduler} every
+ * {@link NacosDiscoveryProperties#getWatchDelay()} milliseconds
+ *
+ *
+ * In order to reduce the duplicated handling for
+ * {@link ServiceInstancesChangedEvent},
+ * {@link #defaultHeartbeatEventChangePredicate()} method providers the default
+ * implementation to detect whether the {@link HeartbeatEvent#getValue() state} is
+ * changed or not. If and only if changed, the
+ * {@link #dispatchServiceInstancesChangedEvent(String, Collection)} will be executed.
+ *
+ * Note : Spring Cloud {@link HeartbeatEvent} has a critical flaw that can't
+ * figure out which service was changed precisely, it's just used for a notification
+ * that the {@link DubboServiceMetadataRepository#getSubscribedServices() subscribed
+ * services} used to {@link NotifyListener#notify(List) notify} the Dubbo consumer
+ * cached {@link URL URLs}. Because of some {@link DiscoveryClient} implementations
+ * have the better and fine-grained the event mechanism for service instances change,
+ * thus {@link HeartbeatEvent} handle will be ignored in these scenarios:
+ *
+ * Zookeeper : {@link Watcher}, see
+ * {@link ZookeeperConfiguration#heartbeatEventChangedPredicate()}
+ * Nacos : {@link com.alibaba.nacos.api.naming.listener.EventListener} , see
+ * {@link NacosConfiguration#heartbeatEventChangedPredicate()}
+ *
+ *
+ * If the customized {@link DiscoveryClient} also providers the similar mechanism, the
+ * implementation could declare a Spring Bean of {@link Predicate} of
+ * {@link HeartbeatEvent} to override {@link #defaultHeartbeatEventChangePredicate()
+ * default one}.
+ *
+ * @param event the instance of {@link HeartbeatEvent}
+ * @see HeartbeatEvent
+ */
+ @EventListener(HeartbeatEvent.class)
+ public void onHeartbeatEvent(HeartbeatEvent event) {
+ /**
+ * Try to re-initialize the subscribed services, in order to sense the change of
+ * services if {@link DubboCloudProperties#getSubscribedServices()} is wildcard
+ * that indicates all services should be subscribed.
+ */
+ Stream subscribedServices = dubboServiceMetadataRepository
+ .initSubscribedServices();
+
+ heartbeatEventChangedPredicate.ifAvailable(predicate -> {
+ if (predicate.test(event)) {
+ // Dispatch ServiceInstancesChangedEvent for each service
+ subscribedServices.forEach(serviceName -> {
+ List serviceInstances = getInstances(serviceName);
+ dispatchServiceInstancesChangedEvent(serviceName, serviceInstances);
+ });
+ }
+ });
+ }
+
+ /**
+ * The default {@link Predicate} implementation of {@link HeartbeatEvent} based on the
+ * comparison between previous and current {@link HeartbeatEvent#getValue() state
+ * value}, the {@link DiscoveryClient} implementation may override current.
+ *
+ * @return {@link Predicate}
+ * @see EurekaConfiguration#heartbeatEventChangedPredicate()
+ */
+ @Bean
+ @ConditionalOnMissingBean
+ public Predicate defaultHeartbeatEventChangePredicate() {
+ return event -> {
+ Object oldState = heartbeatState.get();
+ Object newState = event.getValue();
+ return heartbeatState.compareAndSet(oldState, newState)
+ && !Objects.equals(oldState, newState);
+ };
+ }
+
+ /**
+ * Eureka Customized Configuration
+ */
+ @Configuration
+ @ConditionalOnBean(name = EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME)
+ public class EurekaConfiguration {
+
+ private final AtomicReference appsHashCodeCache = new AtomicReference<>();
+
+ /**
+ * Compare {@link Applications#getAppsHashCode() apps hash code} between last
+ * {@link Applications} and current.
+ *
+ * @see Applications#getAppsHashCode()
+ */
+ @Bean
+ public Predicate heartbeatEventChangedPredicate() {
+ return event -> {
+ String oldAppsHashCode = appsHashCodeCache.get();
+ CloudEurekaClient cloudEurekaClient = (CloudEurekaClient) event
+ .getSource();
+ Applications applications = cloudEurekaClient.getApplications();
+ String appsHashCode = applications.getAppsHashCode();
+ return appsHashCodeCache.compareAndSet(oldAppsHashCode, appsHashCode)
+ && !Objects.equals(oldAppsHashCode, appsHashCode);
+ };
+ }
+ }
+
+ /**
+ * Zookeeper Customized Configuration
+ */
+ @Configuration
+ @ConditionalOnBean(name = ZOOKEEPER_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME)
+ @Aspect
+ public class ZookeeperConfiguration
+ implements ApplicationListener {
+ /**
+ * The pointcut expression for
+ * {@link ZookeeperServiceWatch#childEvent(CuratorFramework, TreeCacheEvent)}
+ */
+ public static final String CHILD_EVENT_POINTCUT_EXPRESSION = "execution(void org.springframework.cloud.zookeeper.discovery.ZookeeperServiceWatch.childEvent(..)) && args(client,event)";
+
+ /**
+ * The path separator of Zookeeper node
+ */
+ public static final String NODE_PATH_SEPARATOR = "/";
+
+ /**
+ * The path variable name for the name of service
+ */
+ private static final String SERVICE_NAME_PATH_VARIABLE_NAME = "serviceName";
+
+ /**
+ * The path variable name for the id of {@link ServiceInstance service instance}
+ */
+ private static final String SERVICE_INSTANCE_ID_PATH_VARIABLE_NAME = "serviceInstanceId";
+
+ private final ZookeeperServiceWatch zookeeperServiceWatch;
+
+ private final String rootPath;
+
+ private final AntPathMatcher pathMatcher;
+
+ /**
+ * Ant Path pattern for {@link ServiceInstance} :
+ *
+ *
+ * ${{@link #rootPath}}/{serviceName}/{serviceInstanceId}
+ *
+ * @see #rootPath
+ * @see #SERVICE_NAME_PATH_VARIABLE_NAME
+ * @see #SERVICE_INSTANCE_ID_PATH_VARIABLE_NAME
+ */
+ private final String serviceInstancePathPattern;
+
+ /**
+ * The {@link ThreadLocal} holds the processed service name
+ */
+ private final ThreadLocal processedServiceNameThreadLocal;
+
+ ZookeeperConfiguration(ZookeeperDiscoveryProperties zookeeperDiscoveryProperties,
+ ZookeeperServiceWatch zookeeperServiceWatch) {
+ this.zookeeperServiceWatch = zookeeperServiceWatch;
+ this.rootPath = zookeeperDiscoveryProperties.getRoot();
+ this.pathMatcher = new AntPathMatcher(NODE_PATH_SEPARATOR);
+ this.serviceInstancePathPattern = rootPath + NODE_PATH_SEPARATOR + "{"
+ + SERVICE_NAME_PATH_VARIABLE_NAME + "}" + NODE_PATH_SEPARATOR + "{"
+ + SERVICE_INSTANCE_ID_PATH_VARIABLE_NAME + "}";
+ this.processedServiceNameThreadLocal = new ThreadLocal<>();
+ }
+
+ /**
+ * Zookeeper uses {@link TreeCacheEvent} to trigger
+ * {@link #dispatchServiceInstancesChangedEvent(String, Collection)} , thus
+ * {@link HeartbeatEvent} handle is always ignored
+ *
+ * @return false
forever
+ */
+ @Bean
+ public Predicate heartbeatEventChangedPredicate() {
+ return event -> false;
+ }
+
+ /**
+ * Handle on {@link InstanceRegisteredEvent} after
+ * {@link ZookeeperServiceWatch#onApplicationEvent(InstanceRegisteredEvent)}
+ *
+ * @param event {@link InstanceRegisteredEvent}
+ * @see #reattachTreeCacheListeners()
+ */
+ @Override
+ public void onApplicationEvent(InstanceRegisteredEvent event) {
+ reattachTreeCacheListeners();
+ }
+
+ /**
+ * Re-attach the {@link TreeCacheListener TreeCacheListeners}
+ */
+ private void reattachTreeCacheListeners() {
+
+ TreeCache treeCache = zookeeperServiceWatch.getCache();
+
+ Listenable listenable = treeCache.getListenable();
+
+ /**
+ * All registered TreeCacheListeners except {@link ZookeeperServiceWatch}.
+ * Usually, "otherListeners" will be empty because Spring Cloud Zookeeper only
+ * adds "zookeeperServiceWatch" bean as {@link TreeCacheListener}
+ */
+ List otherListeners = new LinkedList<>();
+
+ if (listenable instanceof ListenerContainer) {
+ ListenerContainer listenerContainer = (ListenerContainer) listenable;
+ listenerContainer.forEach(listener -> {
+ /**
+ * Even though "listener" is an instance of
+ * {@link ZookeeperServiceWatch}, "zookeeperServiceWatch" bean that
+ * was enhanced by AOP is different from the former, thus it's
+ * required to exclude "listener"
+ */
+ if (!(listener instanceof ZookeeperServiceWatch)) {
+ otherListeners.add(listener);
+ }
+ return null;
+ });
+
+ // remove all TreeCacheListeners temporarily
+ listenerContainer.clear();
+ // re-store zookeeperServiceWatch, and make sure it's first one
+ // now "beforeChildEvent" is available for Spring AOP
+ listenerContainer.addListener(zookeeperServiceWatch);
+ // re-store others
+ otherListeners.forEach(listenerContainer::addListener);
+ }
+ else {
+ if (logger.isWarnEnabled()) {
+ logger.warn(
+ "Tell me which version Curator framework current application used? I will do better :D");
+ }
+ }
+ }
+
+ /**
+ * Try to {@link #dispatchServiceInstancesChangedEvent(String, Collection)
+ * dispatch} {@link ServiceInstancesChangedEvent} before
+ * {@link ZookeeperServiceWatch#childEvent(CuratorFramework, TreeCacheEvent)}
+ * execution if required
+ *
+ * @param client {@link CuratorFramework}
+ * @param event {@link TreeCacheEvent}
+ */
+ @Before(CHILD_EVENT_POINTCUT_EXPRESSION)
+ public void beforeChildEvent(CuratorFramework client, TreeCacheEvent event) {
+ if (supportsEventType(event)) {
+ String serviceName = resolveServiceName(event);
+ if (hasText(serviceName)) {
+ dispatchServiceInstancesChangedEvent(serviceName,
+ getInstances(serviceName));
+ }
+ }
+ }
+
+ @After(CHILD_EVENT_POINTCUT_EXPRESSION)
+ public void afterChildEvent(CuratorFramework client, TreeCacheEvent event) {
+ }
+
+ /**
+ * Resolve the name of service
+ *
+ * @param event {@link TreeCacheEvent}
+ * @return If the Zookeeper's {@link ChildData#getPath() node path} that was
+ * notified comes from {@link ServiceInstance the service instance}, return it's
+ * parent path as the service name, or return null
+ */
+ private String resolveServiceName(TreeCacheEvent event) {
+ ChildData childData = event.getData();
+ String path = childData.getPath();
+ if (logger.isDebugEnabled()) {
+ logger.debug("ZK node[path : {}] event type : {}", path, event.getType());
+ }
+
+ String serviceName = null;
+
+ if (pathMatcher.match(serviceInstancePathPattern, path)) {
+ Map variables = pathMatcher
+ .extractUriTemplateVariables(serviceInstancePathPattern, path);
+ serviceName = variables.get(SERVICE_NAME_PATH_VARIABLE_NAME);
+ }
+
+ return serviceName;
+ }
+
+ /**
+ * The {@link TreeCacheEvent#getType() event type} is supported or not
+ *
+ * @param event {@link TreeCacheEvent}
+ * @return the rule is same as
+ * {@link ZookeeperServiceWatch#childEvent(CuratorFramework, TreeCacheEvent)}
+ * method
+ */
+ private boolean supportsEventType(TreeCacheEvent event) {
+ TreeCacheEvent.Type eventType = event.getType();
+ return eventType.equals(TreeCacheEvent.Type.NODE_ADDED)
+ || eventType.equals(TreeCacheEvent.Type.NODE_REMOVED)
+ || eventType.equals(TreeCacheEvent.Type.NODE_UPDATED);
+ }
+ }
+
+ /**
+ * Consul Customized Configuration
+ */
+ @Configuration
+ @ConditionalOnBean(name = CONSUL_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME)
+ class ConsulConfiguration {
+
+ }
+
+ /**
+ * Nacos Customized Configuration
+ */
+ @Configuration
+ @ConditionalOnBean(name = NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME)
+ class NacosConfiguration {
+
+ private final NamingService namingService;
+
+ /**
+ * the set of services is listening
+ */
+ private final Set listeningServices;
+
+ NacosConfiguration(NacosDiscoveryProperties nacosDiscoveryProperties) {
+ this.namingService = nacosDiscoveryProperties.namingServiceInstance();
+ this.listeningServices = new ConcurrentSkipListSet<>();
+ }
+
+ /**
+ * Nacos uses {@link EventListener} to trigger
+ * {@link #dispatchServiceInstancesChangedEvent(String, Collection)} , thus
+ * {@link HeartbeatEvent} handle is always ignored
+ *
+ * @return false
forever
+ */
+ @Bean
+ public Predicate heartbeatEventChangedPredicate() {
+ return event -> false;
+ }
+
+ @EventListener(SubscribedServicesChangedEvent.class)
+ public void onSubscribedServicesChangedEvent(SubscribedServicesChangedEvent event)
+ throws Exception {
+ // subscribe EventListener for each service
+ event.getNewSubscribedServices().forEach(this::subscribeEventListener);
+ }
+
+ private void subscribeEventListener(String serviceName) {
+ if (listeningServices.add(serviceName)) {
+ try {
+ namingService.subscribe(serviceName, event -> {
+ if (event instanceof NamingEvent) {
+ NamingEvent namingEvent = (NamingEvent) event;
+ List serviceInstances = hostToServiceInstanceList(
+ namingEvent.getInstances(), serviceName);
+ dispatchServiceInstancesChangedEvent(serviceName,
+ serviceInstances);
+ }
+ });
+ }
+ catch (NacosException e) {
+ ReflectionUtils.rethrowRuntimeException(e);
+ }
+ }
+ }
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationAutoConfiguration.java
index b9cce47a5..6031edce2 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationAutoConfiguration.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationAutoConfiguration.java
@@ -16,15 +16,19 @@
*/
package com.alibaba.cloud.dubbo.autoconfigure;
+import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME;
+import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME;
+import static com.alibaba.cloud.dubbo.registry.SpringCloudRegistryFactory.ADDRESS;
+import static com.alibaba.cloud.dubbo.registry.SpringCloudRegistryFactory.PROTOCOL;
+import static org.springframework.util.ObjectUtils.isEmpty;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.spring.ServiceBean;
-import com.alibaba.cloud.dubbo.autoconfigure.condition.MissingSpringCloudRegistryConfigPropertyCondition;
-import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
-import com.alibaba.cloud.dubbo.registry.DubboServiceRegistrationEventPublishingAspect;
-import com.alibaba.cloud.dubbo.registry.event.ServiceInstancePreRegisteredEvent;
-import com.ecwid.consul.v1.agent.model.NewService;
-import com.netflix.appinfo.InstanceInfo;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -49,15 +53,12 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.event.EventListener;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME;
-import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME;
-import static com.alibaba.cloud.dubbo.registry.SpringCloudRegistryFactory.ADDRESS;
-import static com.alibaba.cloud.dubbo.registry.SpringCloudRegistryFactory.PROTOCOL;
-import static org.springframework.util.ObjectUtils.isEmpty;
+import com.alibaba.cloud.dubbo.autoconfigure.condition.MissingSpringCloudRegistryConfigPropertyCondition;
+import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
+import com.alibaba.cloud.dubbo.registry.DubboServiceRegistrationEventPublishingAspect;
+import com.alibaba.cloud.dubbo.registry.event.ServiceInstancePreRegisteredEvent;
+import com.ecwid.consul.v1.agent.model.NewService;
+import com.netflix.appinfo.InstanceInfo;
/**
* Dubbo Service Registration Auto-{@link Configuration}
@@ -65,125 +66,126 @@ import static org.springframework.util.ObjectUtils.isEmpty;
* @author Mercy
*/
@Configuration
-@Import({DubboServiceRegistrationEventPublishingAspect.class})
+@Import({ DubboServiceRegistrationEventPublishingAspect.class })
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
-@AutoConfigureAfter(name = {
- EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME,
- CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME,
- "org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration"
-}, value = {
- DubboMetadataAutoConfiguration.class
-})
+@AutoConfigureAfter(name = { EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME,
+ CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME,
+ "org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration" }, value = {
+ DubboMetadataAutoConfiguration.class })
public class DubboServiceRegistrationAutoConfiguration {
- public static final String EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME =
- "org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration";
-
- public static final String CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME =
- "org.springframework.cloud.consul.serviceregistry.ConsulAutoServiceRegistrationAutoConfiguration";
-
- public static final String CONSUL_AUTO_SERVICE_AUTO_REGISTRATION_CLASS_NAME =
- "org.springframework.cloud.consul.serviceregistry.ConsulAutoRegistration";
-
- public static final String ZOOKEEPER_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME =
- "org.springframework.cloud.zookeeper.serviceregistry.ZookeeperAutoServiceRegistrationAutoConfiguration";
-
- private static final Logger logger = LoggerFactory.getLogger(DubboServiceRegistrationAutoConfiguration.class);
-
- @Autowired
- private DubboServiceMetadataRepository dubboServiceMetadataRepository;
-
- @Bean
- @Conditional(value = {
- MissingSpringCloudRegistryConfigPropertyCondition.class
- })
- public RegistryConfig defaultSpringCloudRegistryConfig() {
- return new RegistryConfig(ADDRESS, PROTOCOL);
- }
-
- @EventListener(ServiceInstancePreRegisteredEvent.class)
- public void onServiceInstancePreRegistered(ServiceInstancePreRegisteredEvent event) {
- Registration registration = event.getSource();
- attachDubboMetadataServiceMetadata(registration);
- }
-
- private void attachDubboMetadataServiceMetadata(Registration registration) {
- if (registration == null) {
- return;
- }
- synchronized (registration) {
- Map metadata = registration.getMetadata();
- attachDubboMetadataServiceMetadata(metadata);
- }
- }
-
- private void attachDubboMetadataServiceMetadata(Map metadata) {
- Map serviceMetadata = dubboServiceMetadataRepository.getDubboMetadataServiceMetadata();
- if (!isEmpty(serviceMetadata)) {
- metadata.putAll(serviceMetadata);
- }
- }
-
- @Configuration
- @ConditionalOnBean(name = EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME)
- @Aspect
- class EurekaConfiguration implements SmartInitializingSingleton {
-
- @Autowired
- private ObjectProvider> serviceBeans;
-
- @EventListener(ServiceInstancePreRegisteredEvent.class)
- public void onServiceInstancePreRegistered(ServiceInstancePreRegisteredEvent event) {
- Registration registration = event.getSource();
- EurekaRegistration eurekaRegistration = EurekaRegistration.class.cast(registration);
- InstanceInfo instanceInfo = eurekaRegistration.getApplicationInfoManager().getInfo();
- attachDubboMetadataServiceMetadata(instanceInfo.getMetadata());
- }
-
- /**
- * {@link EurekaServiceRegistry} will register current {@link ServiceInstance service instance} on
- * {@link EurekaAutoServiceRegistration#start()} execution(in {@link SmartLifecycle#start() start phase}),
- * thus this method must {@link ServiceBean#export() export} all {@link ServiceBean ServiceBeans} in advance.
- */
- @Override
- public void afterSingletonsInstantiated() {
- Collection serviceBeans = this.serviceBeans.getIfAvailable();
- if (!isEmpty(serviceBeans)) {
- serviceBeans.forEach(ServiceBean::export);
- }
- }
- }
-
- @Configuration
- @ConditionalOnBean(name = CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME)
- @AutoConfigureOrder
- class ConsulConfiguration {
-
- /**
- * Handle the pre-registered event of {@link ServiceInstance} for Consul
- *
- * @param event {@link ServiceInstancePreRegisteredEvent}
- */
- @EventListener(ServiceInstancePreRegisteredEvent.class)
- public void onServiceInstancePreRegistered(ServiceInstancePreRegisteredEvent event) {
- Registration registration = event.getSource();
- Class> registrationClass = AopUtils.getTargetClass(registration);
- String registrationClassName = registrationClass.getName();
- if (CONSUL_AUTO_SERVICE_AUTO_REGISTRATION_CLASS_NAME.equalsIgnoreCase(registrationClassName)) {
- ConsulRegistration consulRegistration = (ConsulRegistration) registration;
- attachURLsIntoMetadata(consulRegistration);
- }
- }
-
- private void attachURLsIntoMetadata(ConsulRegistration consulRegistration) {
- NewService newService = consulRegistration.getService();
- Map serviceMetadata = dubboServiceMetadataRepository.getDubboMetadataServiceMetadata();
- if (!isEmpty(serviceMetadata)) {
- List tags = newService.getTags();
- for (Map.Entry entry : serviceMetadata.entrySet()) {
- tags.add(entry.getKey() + "=" + entry.getValue());
- }
- }
- }
- }
+ public static final String EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME = "org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration";
+
+ public static final String CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME = "org.springframework.cloud.consul.serviceregistry.ConsulAutoServiceRegistrationAutoConfiguration";
+
+ public static final String CONSUL_AUTO_SERVICE_AUTO_REGISTRATION_CLASS_NAME = "org.springframework.cloud.consul.serviceregistry.ConsulAutoRegistration";
+
+ public static final String ZOOKEEPER_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME = "org.springframework.cloud.zookeeper.serviceregistry.ZookeeperAutoServiceRegistrationAutoConfiguration";
+
+ private static final Logger logger = LoggerFactory
+ .getLogger(DubboServiceRegistrationAutoConfiguration.class);
+
+ @Autowired
+ private DubboServiceMetadataRepository dubboServiceMetadataRepository;
+
+ @Bean
+ @Conditional(value = { MissingSpringCloudRegistryConfigPropertyCondition.class })
+ public RegistryConfig defaultSpringCloudRegistryConfig() {
+ return new RegistryConfig(ADDRESS, PROTOCOL);
+ }
+
+ @EventListener(ServiceInstancePreRegisteredEvent.class)
+ public void onServiceInstancePreRegistered(ServiceInstancePreRegisteredEvent event) {
+ Registration registration = event.getSource();
+ attachDubboMetadataServiceMetadata(registration);
+ }
+
+ private void attachDubboMetadataServiceMetadata(Registration registration) {
+ if (registration == null) {
+ return;
+ }
+ synchronized (registration) {
+ Map metadata = registration.getMetadata();
+ attachDubboMetadataServiceMetadata(metadata);
+ }
+ }
+
+ private void attachDubboMetadataServiceMetadata(Map metadata) {
+ Map serviceMetadata = dubboServiceMetadataRepository
+ .getDubboMetadataServiceMetadata();
+ if (!isEmpty(serviceMetadata)) {
+ metadata.putAll(serviceMetadata);
+ }
+ }
+
+ @Configuration
+ @ConditionalOnBean(name = EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME)
+ @Aspect
+ class EurekaConfiguration implements SmartInitializingSingleton {
+
+ @Autowired
+ private ObjectProvider> serviceBeans;
+
+ @EventListener(ServiceInstancePreRegisteredEvent.class)
+ public void onServiceInstancePreRegistered(
+ ServiceInstancePreRegisteredEvent event) {
+ Registration registration = event.getSource();
+ EurekaRegistration eurekaRegistration = EurekaRegistration.class
+ .cast(registration);
+ InstanceInfo instanceInfo = eurekaRegistration.getApplicationInfoManager()
+ .getInfo();
+ attachDubboMetadataServiceMetadata(instanceInfo.getMetadata());
+ }
+
+ /**
+ * {@link EurekaServiceRegistry} will register current {@link ServiceInstance
+ * service instance} on {@link EurekaAutoServiceRegistration#start()} execution(in
+ * {@link SmartLifecycle#start() start phase}), thus this method must
+ * {@link ServiceBean#export() export} all {@link ServiceBean ServiceBeans} in
+ * advance.
+ */
+ @Override
+ public void afterSingletonsInstantiated() {
+ Collection serviceBeans = this.serviceBeans.getIfAvailable();
+ if (!isEmpty(serviceBeans)) {
+ serviceBeans.forEach(ServiceBean::export);
+ }
+ }
+ }
+
+ @Configuration
+ @ConditionalOnBean(name = CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME)
+ @AutoConfigureOrder
+ class ConsulConfiguration {
+
+ /**
+ * Handle the pre-registered event of {@link ServiceInstance} for Consul
+ *
+ * @param event {@link ServiceInstancePreRegisteredEvent}
+ */
+ @EventListener(ServiceInstancePreRegisteredEvent.class)
+ public void onServiceInstancePreRegistered(
+ ServiceInstancePreRegisteredEvent event) {
+ Registration registration = event.getSource();
+ Class> registrationClass = AopUtils.getTargetClass(registration);
+ String registrationClassName = registrationClass.getName();
+ if (CONSUL_AUTO_SERVICE_AUTO_REGISTRATION_CLASS_NAME
+ .equalsIgnoreCase(registrationClassName)) {
+ ConsulRegistration consulRegistration = (ConsulRegistration) registration;
+ attachURLsIntoMetadata(consulRegistration);
+ }
+ }
+
+ private void attachURLsIntoMetadata(ConsulRegistration consulRegistration) {
+ NewService newService = consulRegistration.getService();
+ Map serviceMetadata = dubboServiceMetadataRepository
+ .getDubboMetadataServiceMetadata();
+ if (!isEmpty(serviceMetadata)) {
+ List tags = newService.getTags();
+ for (Map.Entry entry : serviceMetadata.entrySet()) {
+ tags.add(entry.getKey() + "=" + entry.getValue());
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationNonWebApplicationAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationNonWebApplicationAutoConfiguration.java
index 34d743935..9c8e209c2 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationNonWebApplicationAutoConfiguration.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceRegistrationNonWebApplicationAutoConfiguration.java
@@ -16,12 +16,14 @@
*/
package com.alibaba.cloud.dubbo.autoconfigure;
+import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME;
+import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.ZOOKEEPER_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME;
+
+import java.util.List;
+
import org.apache.dubbo.common.URL;
import org.apache.dubbo.config.spring.ServiceBean;
-import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
-import com.alibaba.cloud.dubbo.registry.event.ServiceInstancePreRegisteredEvent;
-import com.ecwid.consul.v1.agent.model.NewService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@@ -41,10 +43,9 @@ import org.springframework.cloud.zookeeper.serviceregistry.ServiceInstanceRegist
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener;
-import java.util.List;
-
-import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME;
-import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.ZOOKEEPER_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME;
+import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
+import com.alibaba.cloud.dubbo.registry.event.ServiceInstancePreRegisteredEvent;
+import com.ecwid.consul.v1.agent.model.NewService;
/**
* Dubbo Service Registration Auto-{@link Configuration} for Non-Web application
@@ -58,111 +59,113 @@ import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAuto
@Aspect
public class DubboServiceRegistrationNonWebApplicationAutoConfiguration {
- private static final String REST_PROTOCOL = "rest";
-
- @Autowired
- private ServiceRegistry serviceRegistry;
-
- @Autowired
- private Registration registration;
-
- private volatile Integer serverPort = null;
-
- private volatile boolean registered = false;
-
- @Autowired
- private DubboServiceMetadataRepository repository;
-
- @Around("execution(* org.springframework.cloud.client.serviceregistry.Registration.getPort())")
- public Object getPort(ProceedingJoinPoint pjp) throws Throwable {
- return serverPort != null ? serverPort : pjp.proceed();
- }
-
- @EventListener(ApplicationStartedEvent.class)
- public void onApplicationStarted() {
- setServerPort();
- register();
- }
-
- private void register() {
- if (registered) {
- return;
- }
- serviceRegistry.register(registration);
- registered = true;
- }
-
- /**
- * Set web port from {@link ServiceBean#getExportedUrls() exported URLs} if "rest" protocol is present.
- */
- private void setServerPort() {
- if (serverPort == null) {
- for (List urls : repository.getAllExportedUrls().values()) {
- urls.stream()
- .filter(url -> REST_PROTOCOL.equalsIgnoreCase(url.getProtocol()))
- .findFirst()
- .ifPresent(url -> {
- serverPort = url.getPort();
- });
-
- // If REST protocol is not present, use any applied port.
- if (serverPort == null) {
- urls.stream()
- .findAny().ifPresent(url -> {
- serverPort = url.getPort();
- });
- }
- }
- }
- }
-
- @Configuration
- @ConditionalOnBean(name = ZOOKEEPER_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME)
- class ZookeeperConfiguration implements SmartInitializingSingleton {
-
- @Autowired
- private ServiceInstanceRegistration registration;
-
- @EventListener(ServiceInstancePreRegisteredEvent.class)
- public void onServiceInstancePreRegistered(ServiceInstancePreRegisteredEvent event) {
- registration.setPort(serverPort);
- }
-
- @Override
- public void afterSingletonsInstantiated() {
- // invoke getServiceInstance() method to trigger the ServiceInstance building before register
- registration.getServiceInstance();
- }
- }
-
- @Configuration
- @ConditionalOnBean(name = CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME)
- class ConsulConfiguration {
-
- /**
- * Handle the pre-registered event of {@link ServiceInstance} for Consul
- *
- * @param event {@link ServiceInstancePreRegisteredEvent}
- */
- @EventListener(ServiceInstancePreRegisteredEvent.class)
- public void onServiceInstancePreRegistered(ServiceInstancePreRegisteredEvent event) {
- Registration registration = event.getSource();
- ConsulAutoRegistration consulRegistration = (ConsulAutoRegistration) registration;
- setPort(consulRegistration);
- }
-
- /**
- * Set port on Non-Web Application
- *
- * @param consulRegistration {@link ConsulRegistration}
- */
- private void setPort(ConsulAutoRegistration consulRegistration) {
- int port = consulRegistration.getPort();
- NewService newService = consulRegistration.getService();
- if (newService.getPort() == null) {
- newService.setPort(port);
- }
- }
- }
+ private static final String REST_PROTOCOL = "rest";
+
+ @Autowired
+ private ServiceRegistry serviceRegistry;
+
+ @Autowired
+ private Registration registration;
+
+ private volatile Integer serverPort = null;
+
+ private volatile boolean registered = false;
+
+ @Autowired
+ private DubboServiceMetadataRepository repository;
+
+ @Around("execution(* org.springframework.cloud.client.serviceregistry.Registration.getPort())")
+ public Object getPort(ProceedingJoinPoint pjp) throws Throwable {
+ return serverPort != null ? serverPort : pjp.proceed();
+ }
+
+ @EventListener(ApplicationStartedEvent.class)
+ public void onApplicationStarted() {
+ setServerPort();
+ register();
+ }
+
+ private void register() {
+ if (registered) {
+ return;
+ }
+ serviceRegistry.register(registration);
+ registered = true;
+ }
+
+ /**
+ * Set web port from {@link ServiceBean#getExportedUrls() exported URLs} if "rest"
+ * protocol is present.
+ */
+ private void setServerPort() {
+ if (serverPort == null) {
+ for (List urls : repository.getAllExportedUrls().values()) {
+ urls.stream()
+ .filter(url -> REST_PROTOCOL.equalsIgnoreCase(url.getProtocol()))
+ .findFirst().ifPresent(url -> {
+ serverPort = url.getPort();
+ });
+
+ // If REST protocol is not present, use any applied port.
+ if (serverPort == null) {
+ urls.stream().findAny().ifPresent(url -> {
+ serverPort = url.getPort();
+ });
+ }
+ }
+ }
+ }
+
+ @Configuration
+ @ConditionalOnBean(name = ZOOKEEPER_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME)
+ class ZookeeperConfiguration implements SmartInitializingSingleton {
+
+ @Autowired
+ private ServiceInstanceRegistration registration;
+
+ @EventListener(ServiceInstancePreRegisteredEvent.class)
+ public void onServiceInstancePreRegistered(
+ ServiceInstancePreRegisteredEvent event) {
+ registration.setPort(serverPort);
+ }
+
+ @Override
+ public void afterSingletonsInstantiated() {
+ // invoke getServiceInstance() method to trigger the ServiceInstance building
+ // before register
+ registration.getServiceInstance();
+ }
+ }
+
+ @Configuration
+ @ConditionalOnBean(name = CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME)
+ class ConsulConfiguration {
+
+ /**
+ * Handle the pre-registered event of {@link ServiceInstance} for Consul
+ *
+ * @param event {@link ServiceInstancePreRegisteredEvent}
+ */
+ @EventListener(ServiceInstancePreRegisteredEvent.class)
+ public void onServiceInstancePreRegistered(
+ ServiceInstancePreRegisteredEvent event) {
+ Registration registration = event.getSource();
+ ConsulAutoRegistration consulRegistration = (ConsulAutoRegistration) registration;
+ setPort(consulRegistration);
+ }
+
+ /**
+ * Set port on Non-Web Application
+ *
+ * @param consulRegistration {@link ConsulRegistration}
+ */
+ private void setPort(ConsulAutoRegistration consulRegistration) {
+ int port = consulRegistration.getPort();
+ NewService newService = consulRegistration.getService();
+ if (newService.getPort() == null) {
+ newService.setPort(port);
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/condition/MissingSpringCloudRegistryConfigPropertyCondition.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/condition/MissingSpringCloudRegistryConfigPropertyCondition.java
index 1fe77da03..3aa14cd73 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/condition/MissingSpringCloudRegistryConfigPropertyCondition.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/condition/MissingSpringCloudRegistryConfigPropertyCondition.java
@@ -16,7 +16,11 @@
*/
package com.alibaba.cloud.dubbo.autoconfigure.condition;
-import com.alibaba.cloud.dubbo.registry.SpringCloudRegistry;
+import static com.alibaba.cloud.dubbo.registry.SpringCloudRegistryFactory.PROTOCOL;
+import static org.apache.dubbo.config.spring.util.PropertySourcesUtils.getSubProperties;
+
+import java.util.Map;
+
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
import org.springframework.context.annotation.Condition;
@@ -25,10 +29,7 @@ import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.util.StringUtils;
-import java.util.Map;
-
-import static com.alibaba.cloud.dubbo.registry.SpringCloudRegistryFactory.PROTOCOL;
-import static org.apache.dubbo.config.spring.util.PropertySourcesUtils.getSubProperties;
+import com.alibaba.cloud.dubbo.registry.SpringCloudRegistry;
/**
* Missing {@link SpringCloudRegistry} Property {@link Condition}
@@ -37,35 +38,43 @@ import static org.apache.dubbo.config.spring.util.PropertySourcesUtils.getSubPro
* @see SpringCloudRegistry
* @see Condition
*/
-public class MissingSpringCloudRegistryConfigPropertyCondition extends SpringBootCondition {
-
+public class MissingSpringCloudRegistryConfigPropertyCondition
+ extends SpringBootCondition {
- @Override
- public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
- ConfigurableEnvironment environment = (ConfigurableEnvironment) context.getEnvironment();
+ @Override
+ public ConditionOutcome getMatchOutcome(ConditionContext context,
+ AnnotatedTypeMetadata metadata) {
+ ConfigurableEnvironment environment = (ConfigurableEnvironment) context
+ .getEnvironment();
- String protocol = environment.getProperty("dubbo.registry.protocol");
+ String protocol = environment.getProperty("dubbo.registry.protocol");
- if (PROTOCOL.equals(protocol)) {
- return ConditionOutcome.noMatch("'spring-cloud' protocol was found from 'dubbo.registry.protocol'");
- }
+ if (PROTOCOL.equals(protocol)) {
+ return ConditionOutcome.noMatch(
+ "'spring-cloud' protocol was found from 'dubbo.registry.protocol'");
+ }
- String address = environment.getProperty("dubbo.registry.address");
+ String address = environment.getProperty("dubbo.registry.address");
- if (StringUtils.startsWithIgnoreCase(address, PROTOCOL)) {
- return ConditionOutcome.noMatch("'spring-cloud' protocol was found from 'dubbo.registry.address'");
- }
+ if (StringUtils.startsWithIgnoreCase(address, PROTOCOL)) {
+ return ConditionOutcome.noMatch(
+ "'spring-cloud' protocol was found from 'dubbo.registry.address'");
+ }
- Map properties = getSubProperties(environment, "dubbo.registries.");
+ Map properties = getSubProperties(environment,
+ "dubbo.registries.");
- boolean found = properties.entrySet().stream().anyMatch(entry -> {
- String key = entry.getKey();
- String value = String.valueOf(entry.getValue());
- return (key.endsWith(".address") && value.startsWith(PROTOCOL)) ||
- (key.endsWith(".protocol") && PROTOCOL.equals(value));
+ boolean found = properties.entrySet().stream().anyMatch(entry -> {
+ String key = entry.getKey();
+ String value = String.valueOf(entry.getValue());
+ return (key.endsWith(".address") && value.startsWith(PROTOCOL))
+ || (key.endsWith(".protocol") && PROTOCOL.equals(value));
- });
+ });
- return found ? ConditionOutcome.noMatch("'spring-cloud' protocol was found in 'dubbo.registries.*'") : ConditionOutcome.match();
- }
+ return found
+ ? ConditionOutcome.noMatch(
+ "'spring-cloud' protocol was found in 'dubbo.registries.*'")
+ : ConditionOutcome.match();
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboClientHttpResponse.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboClientHttpResponse.java
index ef02aa989..27fc1c943 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboClientHttpResponse.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboClientHttpResponse.java
@@ -16,15 +16,15 @@
*/
package com.alibaba.cloud.dubbo.client.loadbalancer;
+import java.io.IOException;
+import java.io.InputStream;
+
import org.apache.dubbo.rpc.service.GenericException;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.client.ClientHttpResponse;
-import java.io.IOException;
-import java.io.InputStream;
-
/**
* Dubbo {@link ClientHttpResponse} implementation
*
@@ -33,47 +33,50 @@ import java.io.InputStream;
*/
class DubboClientHttpResponse implements ClientHttpResponse {
- private final HttpStatus httpStatus;
+ private final HttpStatus httpStatus;
- private final String statusText;
+ private final String statusText;
- private final HttpHeaders httpHeaders = new HttpHeaders();
+ private final HttpHeaders httpHeaders = new HttpHeaders();
- private final DubboHttpOutputMessage httpOutputMessage;
+ private final DubboHttpOutputMessage httpOutputMessage;
- public DubboClientHttpResponse(DubboHttpOutputMessage httpOutputMessage, GenericException exception) {
- this.httpStatus = exception != null ? HttpStatus.INTERNAL_SERVER_ERROR : HttpStatus.OK;
- this.statusText = exception != null ? exception.getExceptionMessage() : httpStatus.getReasonPhrase();
- this.httpOutputMessage = httpOutputMessage;
- this.httpHeaders.putAll(httpOutputMessage.getHeaders());
- }
+ public DubboClientHttpResponse(DubboHttpOutputMessage httpOutputMessage,
+ GenericException exception) {
+ this.httpStatus = exception != null ? HttpStatus.INTERNAL_SERVER_ERROR
+ : HttpStatus.OK;
+ this.statusText = exception != null ? exception.getExceptionMessage()
+ : httpStatus.getReasonPhrase();
+ this.httpOutputMessage = httpOutputMessage;
+ this.httpHeaders.putAll(httpOutputMessage.getHeaders());
+ }
- @Override
- public HttpStatus getStatusCode() throws IOException {
- return httpStatus;
- }
+ @Override
+ public HttpStatus getStatusCode() throws IOException {
+ return httpStatus;
+ }
- @Override
- public int getRawStatusCode() throws IOException {
- return httpStatus.value();
- }
+ @Override
+ public int getRawStatusCode() throws IOException {
+ return httpStatus.value();
+ }
- @Override
- public String getStatusText() throws IOException {
- return statusText;
- }
+ @Override
+ public String getStatusText() throws IOException {
+ return statusText;
+ }
- @Override
- public void close() {
- }
+ @Override
+ public void close() {
+ }
- @Override
- public InputStream getBody() throws IOException {
- return httpOutputMessage.getBody().getInputStream();
- }
+ @Override
+ public InputStream getBody() throws IOException {
+ return httpOutputMessage.getBody().getInputStream();
+ }
- @Override
- public HttpHeaders getHeaders() {
- return httpHeaders;
- }
+ @Override
+ public HttpHeaders getHeaders() {
+ return httpHeaders;
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboClientHttpResponseFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboClientHttpResponseFactory.java
index cb51ccd33..561515f78 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboClientHttpResponseFactory.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboClientHttpResponseFactory.java
@@ -16,18 +16,19 @@
*/
package com.alibaba.cloud.dubbo.client.loadbalancer;
+import java.io.IOException;
+import java.util.List;
+
import org.apache.dubbo.rpc.service.GenericException;
-import com.alibaba.cloud.dubbo.http.converter.HttpMessageConverterHolder;
-import com.alibaba.cloud.dubbo.http.util.HttpMessageConverterResolver;
-import com.alibaba.cloud.dubbo.metadata.RequestMetadata;
-import com.alibaba.cloud.dubbo.metadata.RestMethodMetadata;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.converter.HttpMessageConverter;
-import java.io.IOException;
-import java.util.List;
+import com.alibaba.cloud.dubbo.http.converter.HttpMessageConverterHolder;
+import com.alibaba.cloud.dubbo.http.util.HttpMessageConverterResolver;
+import com.alibaba.cloud.dubbo.metadata.RequestMetadata;
+import com.alibaba.cloud.dubbo.metadata.RestMethodMetadata;
/**
* Dubbo {@link ClientHttpResponse} Factory
@@ -36,29 +37,33 @@ import java.util.List;
*/
class DubboClientHttpResponseFactory {
- private final HttpMessageConverterResolver httpMessageConverterResolver;
+ private final HttpMessageConverterResolver httpMessageConverterResolver;
- public DubboClientHttpResponseFactory(List> messageConverters, ClassLoader classLoader) {
- this.httpMessageConverterResolver = new HttpMessageConverterResolver(messageConverters, classLoader);
- }
+ public DubboClientHttpResponseFactory(List> messageConverters,
+ ClassLoader classLoader) {
+ this.httpMessageConverterResolver = new HttpMessageConverterResolver(
+ messageConverters, classLoader);
+ }
- public ClientHttpResponse build(Object result, GenericException exception,
- RequestMetadata requestMetadata, RestMethodMetadata restMethodMetadata) {
+ public ClientHttpResponse build(Object result, GenericException exception,
+ RequestMetadata requestMetadata, RestMethodMetadata restMethodMetadata) {
- DubboHttpOutputMessage httpOutputMessage = new DubboHttpOutputMessage();
+ DubboHttpOutputMessage httpOutputMessage = new DubboHttpOutputMessage();
- HttpMessageConverterHolder httpMessageConverterHolder = httpMessageConverterResolver.resolve(requestMetadata, restMethodMetadata);
+ HttpMessageConverterHolder httpMessageConverterHolder = httpMessageConverterResolver
+ .resolve(requestMetadata, restMethodMetadata);
- if (httpMessageConverterHolder != null) {
- MediaType mediaType = httpMessageConverterHolder.getMediaType();
- HttpMessageConverter converter = httpMessageConverterHolder.getConverter();
- try {
- converter.write(result, mediaType, httpOutputMessage);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
+ if (httpMessageConverterHolder != null) {
+ MediaType mediaType = httpMessageConverterHolder.getMediaType();
+ HttpMessageConverter converter = httpMessageConverterHolder.getConverter();
+ try {
+ converter.write(result, mediaType, httpOutputMessage);
+ }
+ catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
- return new DubboClientHttpResponse(httpOutputMessage, exception);
- }
+ return new DubboClientHttpResponse(httpOutputMessage, exception);
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboHttpOutputMessage.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboHttpOutputMessage.java
index 634579028..96a3e6c8c 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboHttpOutputMessage.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboHttpOutputMessage.java
@@ -16,12 +16,12 @@
*/
package com.alibaba.cloud.dubbo.client.loadbalancer;
+import java.io.IOException;
+
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpOutputMessage;
import org.springframework.util.FastByteArrayOutputStream;
-import java.io.IOException;
-
/**
* Dubbo {@link HttpOutputMessage} implementation
*
@@ -29,17 +29,17 @@ import java.io.IOException;
*/
class DubboHttpOutputMessage implements HttpOutputMessage {
- private final FastByteArrayOutputStream outputStream = new FastByteArrayOutputStream();
+ private final FastByteArrayOutputStream outputStream = new FastByteArrayOutputStream();
- private final HttpHeaders httpHeaders = new HttpHeaders();
+ private final HttpHeaders httpHeaders = new HttpHeaders();
- @Override
- public FastByteArrayOutputStream getBody() throws IOException {
- return outputStream;
- }
+ @Override
+ public FastByteArrayOutputStream getBody() throws IOException {
+ return outputStream;
+ }
- @Override
- public HttpHeaders getHeaders() {
- return httpHeaders;
- }
+ @Override
+ public HttpHeaders getHeaders() {
+ return httpHeaders;
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboMetadataInitializerInterceptor.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboMetadataInitializerInterceptor.java
index 43b14ffff..53bc6a3fa 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboMetadataInitializerInterceptor.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboMetadataInitializerInterceptor.java
@@ -16,39 +16,42 @@
*/
package com.alibaba.cloud.dubbo.client.loadbalancer;
-import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
+import java.io.IOException;
+import java.net.URI;
+
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
-import java.io.IOException;
-import java.net.URI;
+import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
/**
- * Dubbo Metadata {@link ClientHttpRequestInterceptor} Initializing Interceptor executes intercept before
- * {@link DubboTransporterInterceptor}
+ * Dubbo Metadata {@link ClientHttpRequestInterceptor} Initializing Interceptor executes
+ * intercept before {@link DubboTransporterInterceptor}
*
* @author Mercy
*/
public class DubboMetadataInitializerInterceptor implements ClientHttpRequestInterceptor {
- private final DubboServiceMetadataRepository repository;
+ private final DubboServiceMetadataRepository repository;
- public DubboMetadataInitializerInterceptor(DubboServiceMetadataRepository repository) {
- this.repository = repository;
- }
+ public DubboMetadataInitializerInterceptor(
+ DubboServiceMetadataRepository repository) {
+ this.repository = repository;
+ }
- @Override
- public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
+ @Override
+ public ClientHttpResponse intercept(HttpRequest request, byte[] body,
+ ClientHttpRequestExecution execution) throws IOException {
- URI originalUri = request.getURI();
+ URI originalUri = request.getURI();
- String serviceName = originalUri.getHost();
+ String serviceName = originalUri.getHost();
- repository.initializeMetadata(serviceName);
+ repository.initializeMetadata(serviceName);
- // Execute next
- return execution.execute(request, body);
- }
+ // Execute next
+ return execution.execute(request, body);
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboTransporterInterceptor.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboTransporterInterceptor.java
index bec422ed5..4d73112d5 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboTransporterInterceptor.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/client/loadbalancer/DubboTransporterInterceptor.java
@@ -16,17 +16,16 @@
*/
package com.alibaba.cloud.dubbo.client.loadbalancer;
+import static org.springframework.web.util.UriComponentsBuilder.fromUri;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
import org.apache.dubbo.rpc.service.GenericException;
import org.apache.dubbo.rpc.service.GenericService;
-import com.alibaba.cloud.dubbo.http.MutableHttpServerRequest;
-import com.alibaba.cloud.dubbo.metadata.DubboRestServiceMetadata;
-import com.alibaba.cloud.dubbo.metadata.RequestMetadata;
-import com.alibaba.cloud.dubbo.metadata.RestMethodMetadata;
-import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
-import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContext;
-import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContextFactory;
-import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory;
import org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
@@ -38,12 +37,14 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.PathMatcher;
import org.springframework.web.util.UriComponents;
-import java.io.IOException;
-import java.net.URI;
-import java.util.List;
-import java.util.Map;
-
-import static org.springframework.web.util.UriComponentsBuilder.fromUri;
+import com.alibaba.cloud.dubbo.http.MutableHttpServerRequest;
+import com.alibaba.cloud.dubbo.metadata.DubboRestServiceMetadata;
+import com.alibaba.cloud.dubbo.metadata.RequestMetadata;
+import com.alibaba.cloud.dubbo.metadata.RestMethodMetadata;
+import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
+import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContext;
+import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContextFactory;
+import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory;
/**
* Dubbo Transporter {@link ClientHttpRequestInterceptor} implementation
@@ -53,91 +54,100 @@ import static org.springframework.web.util.UriComponentsBuilder.fromUri;
*/
public class DubboTransporterInterceptor implements ClientHttpRequestInterceptor {
- private final DubboServiceMetadataRepository repository;
+ private final DubboServiceMetadataRepository repository;
- private final DubboClientHttpResponseFactory clientHttpResponseFactory;
+ private final DubboClientHttpResponseFactory clientHttpResponseFactory;
- private final Map dubboTranslatedAttributes;
+ private final Map dubboTranslatedAttributes;
- private final DubboGenericServiceFactory serviceFactory;
+ private final DubboGenericServiceFactory serviceFactory;
- private final DubboGenericServiceExecutionContextFactory contextFactory;
+ private final DubboGenericServiceExecutionContextFactory contextFactory;
- private final PathMatcher pathMatcher = new AntPathMatcher();
+ private final PathMatcher pathMatcher = new AntPathMatcher();
- public DubboTransporterInterceptor(DubboServiceMetadataRepository dubboServiceMetadataRepository,
- List> messageConverters,
- ClassLoader classLoader,
- Map dubboTranslatedAttributes,
- DubboGenericServiceFactory serviceFactory,
- DubboGenericServiceExecutionContextFactory contextFactory) {
- this.repository = dubboServiceMetadataRepository;
- this.dubboTranslatedAttributes = dubboTranslatedAttributes;
- this.clientHttpResponseFactory = new DubboClientHttpResponseFactory(messageConverters, classLoader);
- this.serviceFactory = serviceFactory;
- this.contextFactory = contextFactory;
- }
+ public DubboTransporterInterceptor(
+ DubboServiceMetadataRepository dubboServiceMetadataRepository,
+ List> messageConverters, ClassLoader classLoader,
+ Map dubboTranslatedAttributes,
+ DubboGenericServiceFactory serviceFactory,
+ DubboGenericServiceExecutionContextFactory contextFactory) {
+ this.repository = dubboServiceMetadataRepository;
+ this.dubboTranslatedAttributes = dubboTranslatedAttributes;
+ this.clientHttpResponseFactory = new DubboClientHttpResponseFactory(
+ messageConverters, classLoader);
+ this.serviceFactory = serviceFactory;
+ this.contextFactory = contextFactory;
+ }
- @Override
- public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
+ @Override
+ public ClientHttpResponse intercept(HttpRequest request, byte[] body,
+ ClientHttpRequestExecution execution) throws IOException {
- URI originalUri = request.getURI();
+ URI originalUri = request.getURI();
- String serviceName = originalUri.getHost();
+ String serviceName = originalUri.getHost();
- RequestMetadata clientMetadata = buildRequestMetadata(request);
+ RequestMetadata clientMetadata = buildRequestMetadata(request);
- DubboRestServiceMetadata metadata = repository.get(serviceName, clientMetadata);
+ DubboRestServiceMetadata metadata = repository.get(serviceName, clientMetadata);
- if (metadata == null) {
- // if DubboServiceMetadata is not found, executes next
- return execution.execute(request, body);
- }
+ if (metadata == null) {
+ // if DubboServiceMetadata is not found, executes next
+ return execution.execute(request, body);
+ }
- RestMethodMetadata dubboRestMethodMetadata = metadata.getRestMethodMetadata();
+ RestMethodMetadata dubboRestMethodMetadata = metadata.getRestMethodMetadata();
- GenericService genericService = serviceFactory.create(metadata, dubboTranslatedAttributes);
+ GenericService genericService = serviceFactory.create(metadata,
+ dubboTranslatedAttributes);
- MutableHttpServerRequest httpServerRequest = new MutableHttpServerRequest(request, body);
+ MutableHttpServerRequest httpServerRequest = new MutableHttpServerRequest(request,
+ body);
- customizeRequest(httpServerRequest, dubboRestMethodMetadata, clientMetadata);
+ customizeRequest(httpServerRequest, dubboRestMethodMetadata, clientMetadata);
- DubboGenericServiceExecutionContext context = contextFactory.create(dubboRestMethodMetadata, httpServerRequest);
+ DubboGenericServiceExecutionContext context = contextFactory
+ .create(dubboRestMethodMetadata, httpServerRequest);
- Object result = null;
- GenericException exception = null;
+ Object result = null;
+ GenericException exception = null;
- try {
- result = genericService.$invoke(context.getMethodName(), context.getParameterTypes(), context.getParameters());
- } catch (GenericException e) {
- exception = e;
- }
+ try {
+ result = genericService.$invoke(context.getMethodName(),
+ context.getParameterTypes(), context.getParameters());
+ }
+ catch (GenericException e) {
+ exception = e;
+ }
- return clientHttpResponseFactory.build(result, exception, clientMetadata, dubboRestMethodMetadata);
- }
+ return clientHttpResponseFactory.build(result, exception, clientMetadata,
+ dubboRestMethodMetadata);
+ }
- protected void customizeRequest(MutableHttpServerRequest httpServerRequest,
- RestMethodMetadata dubboRestMethodMetadata, RequestMetadata clientMetadata) {
+ protected void customizeRequest(MutableHttpServerRequest httpServerRequest,
+ RestMethodMetadata dubboRestMethodMetadata, RequestMetadata clientMetadata) {
- RequestMetadata dubboRequestMetadata = dubboRestMethodMetadata.getRequest();
- String pathPattern = dubboRequestMetadata.getPath();
+ RequestMetadata dubboRequestMetadata = dubboRestMethodMetadata.getRequest();
+ String pathPattern = dubboRequestMetadata.getPath();
- Map pathVariables = pathMatcher.extractUriTemplateVariables(pathPattern, httpServerRequest.getPath());
+ Map pathVariables = pathMatcher
+ .extractUriTemplateVariables(pathPattern, httpServerRequest.getPath());
- if (!CollectionUtils.isEmpty(pathVariables)) {
- // Put path variables Map into query parameters Map
- httpServerRequest.params(pathVariables);
- }
+ if (!CollectionUtils.isEmpty(pathVariables)) {
+ // Put path variables Map into query parameters Map
+ httpServerRequest.params(pathVariables);
+ }
- }
+ }
- private RequestMetadata buildRequestMetadata(HttpRequest request) {
- UriComponents uriComponents = fromUri(request.getURI()).build(true);
- RequestMetadata requestMetadata = new RequestMetadata();
- requestMetadata.setPath(uriComponents.getPath());
- requestMetadata.setMethod(request.getMethod().name());
- requestMetadata.setParams(uriComponents.getQueryParams());
- requestMetadata.setHeaders(request.getHeaders());
- return requestMetadata;
- }
+ private RequestMetadata buildRequestMetadata(HttpRequest request) {
+ UriComponents uriComponents = fromUri(request.getURI()).build(true);
+ RequestMetadata requestMetadata = new RequestMetadata();
+ requestMetadata.setPath(uriComponents.getPath());
+ requestMetadata.setMethod(request.getMethod().name());
+ requestMetadata.setParams(uriComponents.getQueryParams());
+ requestMetadata.setHeaders(request.getHeaders());
+ return requestMetadata;
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/context/DubboServiceRegistrationApplicationContextInitializer.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/context/DubboServiceRegistrationApplicationContextInitializer.java
index 83dd98318..e9c747cf4 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/context/DubboServiceRegistrationApplicationContextInitializer.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/context/DubboServiceRegistrationApplicationContextInitializer.java
@@ -16,23 +16,26 @@
*/
package com.alibaba.cloud.dubbo.context;
-import com.alibaba.cloud.dubbo.registry.SpringCloudRegistryFactory;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
+import com.alibaba.cloud.dubbo.registry.SpringCloudRegistryFactory;
+
/**
- * The Dubbo services will be registered as the specified Spring cloud applications that will not be considered
- * normal ones, but only are used to Dubbo's service discovery even if it is based on Spring Cloud Commons abstraction.
- * However, current application will be registered by other DiscoveryClientAutoConfiguration.
+ * The Dubbo services will be registered as the specified Spring cloud applications that
+ * will not be considered normal ones, but only are used to Dubbo's service discovery even
+ * if it is based on Spring Cloud Commons abstraction. However, current application will
+ * be registered by other DiscoveryClientAutoConfiguration.
*
* @author Mercy
*/
-public class DubboServiceRegistrationApplicationContextInitializer implements
- ApplicationContextInitializer {
+public class DubboServiceRegistrationApplicationContextInitializer
+ implements ApplicationContextInitializer {
- @Override
- public void initialize(ConfigurableApplicationContext applicationContext) {
- // Set ApplicationContext into SpringCloudRegistryFactory before Dubbo Service Register
- SpringCloudRegistryFactory.setApplicationContext(applicationContext);
- }
+ @Override
+ public void initialize(ConfigurableApplicationContext applicationContext) {
+ // Set ApplicationContext into SpringCloudRegistryFactory before Dubbo Service
+ // Register
+ SpringCloudRegistryFactory.setApplicationContext(applicationContext);
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java
index dc349e584..b9d33c376 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java
@@ -16,15 +16,15 @@
*/
package com.alibaba.cloud.dubbo.env;
-import org.springframework.boot.context.properties.ConfigurationProperties;
+import static org.springframework.util.StringUtils.commaDelimitedListToStringArray;
+import static org.springframework.util.StringUtils.hasText;
+import static org.springframework.util.StringUtils.trimAllWhitespace;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
-import static org.springframework.util.StringUtils.commaDelimitedListToStringArray;
-import static org.springframework.util.StringUtils.hasText;
-import static org.springframework.util.StringUtils.trimAllWhitespace;
+import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* Dubbo Cloud {@link ConfigurationProperties Properties}
@@ -34,48 +34,49 @@ import static org.springframework.util.StringUtils.trimAllWhitespace;
@ConfigurationProperties(prefix = "dubbo.cloud")
public class DubboCloudProperties {
- /**
- * All services of Dubbo
- */
- public static final String ALL_DUBBO_SERVICES = "*";
+ /**
+ * All services of Dubbo
+ */
+ public static final String ALL_DUBBO_SERVICES = "*";
- /**
- * The subscribed services, the default value is "*". The multiple value will use comma(",") as the separator.
- *
- * @see #ALL_DUBBO_SERVICES
- */
- private String subscribedServices = ALL_DUBBO_SERVICES;
+ /**
+ * The subscribed services, the default value is "*". The multiple value will use
+ * comma(",") as the separator.
+ *
+ * @see #ALL_DUBBO_SERVICES
+ */
+ private String subscribedServices = ALL_DUBBO_SERVICES;
- public String getSubscribedServices() {
- return subscribedServices;
- }
+ public String getSubscribedServices() {
+ return subscribedServices;
+ }
- public void setSubscribedServices(String subscribedServices) {
- this.subscribedServices = subscribedServices;
- }
+ public void setSubscribedServices(String subscribedServices) {
+ this.subscribedServices = subscribedServices;
+ }
- /**
- * Get the subscribed services as a {@link Set} with configuration order.
- *
- * @return non-null Read-only {@link Set}
- */
- public Set subscribedServices() {
+ /**
+ * Get the subscribed services as a {@link Set} with configuration order.
+ *
+ * @return non-null Read-only {@link Set}
+ */
+ public Set subscribedServices() {
- String[] services = commaDelimitedListToStringArray(getSubscribedServices());
+ String[] services = commaDelimitedListToStringArray(getSubscribedServices());
- if (services.length < 1) {
- return Collections.emptySet();
- }
+ if (services.length < 1) {
+ return Collections.emptySet();
+ }
- Set subscribedServices = new LinkedHashSet<>();
+ Set subscribedServices = new LinkedHashSet<>();
- for (String service : services) {
- if (hasText(service)) { // filter blank service name
- // remove all whitespace
- subscribedServices.add(trimAllWhitespace(service));
- }
- }
+ for (String service : services) {
+ if (hasText(service)) { // filter blank service name
+ // remove all whitespace
+ subscribedServices.add(trimAllWhitespace(service));
+ }
+ }
- return Collections.unmodifiableSet(subscribedServices);
- }
+ return Collections.unmodifiableSet(subscribedServices);
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboNonWebApplicationEnvironmentPostProcessor.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboNonWebApplicationEnvironmentPostProcessor.java
index d03f6ccf6..90eae0697 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboNonWebApplicationEnvironmentPostProcessor.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboNonWebApplicationEnvironmentPostProcessor.java
@@ -16,6 +16,13 @@
*/
package com.alibaba.cloud.dubbo.env;
+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_PROTOCOL;
+import static org.apache.dubbo.config.spring.util.PropertySourcesUtils.getSubProperties;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
@@ -29,179 +36,191 @@ import org.springframework.core.env.PropertySource;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_PROTOCOL;
-import static org.apache.dubbo.config.spring.util.PropertySourcesUtils.getSubProperties;
-
/**
- * Dubbo {@link WebApplicationType#NONE Non-Web Application} {@link EnvironmentPostProcessor}
+ * Dubbo {@link WebApplicationType#NONE Non-Web Application}
+ * {@link EnvironmentPostProcessor}
*
* @author Mercy
*/
-public class DubboNonWebApplicationEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
-
- private static final String DOT = ".";
-
- /**
- * The name of default {@link PropertySource} defined in SpringApplication#configurePropertySources method.
- */
- private static final String PROPERTY_SOURCE_NAME = "defaultProperties";
+public class DubboNonWebApplicationEnvironmentPostProcessor
+ implements EnvironmentPostProcessor, Ordered {
- private static final String SERVER_PORT_PROPERTY_NAME = "server.port";
+ private static final String DOT = ".";
- private static final String PORT_PROPERTY_NAME = "port";
+ /**
+ * The name of default {@link PropertySource} defined in
+ * SpringApplication#configurePropertySources method.
+ */
+ private static final String PROPERTY_SOURCE_NAME = "defaultProperties";
- private static final String PROTOCOL_PROPERTY_NAME_PREFIX = "dubbo.protocol";
+ private static final String SERVER_PORT_PROPERTY_NAME = "server.port";
- private static final String PROTOCOL_NAME_PROPERTY_NAME_SUFFIX = DOT + "name";
+ private static final String PORT_PROPERTY_NAME = "port";
- private static final String PROTOCOL_PORT_PROPERTY_NAME_SUFFIX = DOT + PORT_PROPERTY_NAME;
+ private static final String PROTOCOL_PROPERTY_NAME_PREFIX = "dubbo.protocol";
- private static final String PROTOCOL_PORT_PROPERTY_NAME = PROTOCOL_PROPERTY_NAME_PREFIX + PROTOCOL_PORT_PROPERTY_NAME_SUFFIX;
+ private static final String PROTOCOL_NAME_PROPERTY_NAME_SUFFIX = DOT + "name";
- private static final String PROTOCOL_NAME_PROPERTY_NAME = PROTOCOL_PROPERTY_NAME_PREFIX + PROTOCOL_NAME_PROPERTY_NAME_SUFFIX;
+ private static final String PROTOCOL_PORT_PROPERTY_NAME_SUFFIX = DOT
+ + PORT_PROPERTY_NAME;
- private static final String PROTOCOLS_PROPERTY_NAME_PREFIX = "dubbo.protocols";
+ private static final String PROTOCOL_PORT_PROPERTY_NAME = PROTOCOL_PROPERTY_NAME_PREFIX
+ + PROTOCOL_PORT_PROPERTY_NAME_SUFFIX;
- private static final String REST_PROTOCOL = "rest";
+ private static final String PROTOCOL_NAME_PROPERTY_NAME = PROTOCOL_PROPERTY_NAME_PREFIX
+ + PROTOCOL_NAME_PROPERTY_NAME_SUFFIX;
- private final Logger logger = LoggerFactory.getLogger(DubboNonWebApplicationEnvironmentPostProcessor.class);
+ private static final String PROTOCOLS_PROPERTY_NAME_PREFIX = "dubbo.protocols";
- private static boolean isRestProtocol(String protocol) {
- return REST_PROTOCOL.equalsIgnoreCase(protocol);
- }
+ private static final String REST_PROTOCOL = "rest";
- @Override
- public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
- WebApplicationType webApplicationType = application.getWebApplicationType();
+ private final Logger logger = LoggerFactory
+ .getLogger(DubboNonWebApplicationEnvironmentPostProcessor.class);
- if (!WebApplicationType.NONE.equals(webApplicationType)) { // Just works in Non-Web Application
- if (logger.isDebugEnabled()) {
- logger.debug("Current application is a Web Application, the process will be ignored.");
- }
- return;
- }
+ private static boolean isRestProtocol(String protocol) {
+ return REST_PROTOCOL.equalsIgnoreCase(protocol);
+ }
- MutablePropertySources propertySources = environment.getPropertySources();
- Map defaultProperties = createDefaultProperties(environment);
- if (!CollectionUtils.isEmpty(defaultProperties)) {
- addOrReplace(propertySources, defaultProperties);
- }
- }
+ @Override
+ public void postProcessEnvironment(ConfigurableEnvironment environment,
+ SpringApplication application) {
+ WebApplicationType webApplicationType = application.getWebApplicationType();
+
+ if (!WebApplicationType.NONE.equals(webApplicationType)) { // Just works in
+ // Non-Web Application
+ if (logger.isDebugEnabled()) {
+ logger.debug(
+ "Current application is a Web Application, the process will be ignored.");
+ }
+ return;
+ }
- private Map createDefaultProperties(ConfigurableEnvironment environment) {
- Map defaultProperties = new HashMap();
- resetServerPort(environment, defaultProperties);
- return defaultProperties;
- }
-
- /**
- * Reset server port property if it's absent, whose value is configured by "dubbbo.protocol.port"
- * or "dubbo.protcols.rest.port"
- *
- * @param environment
- * @param defaultProperties
- */
- private void resetServerPort(ConfigurableEnvironment environment, Map defaultProperties) {
-
- String serverPort = environment.getProperty(SERVER_PORT_PROPERTY_NAME, environment.getProperty(PORT_PROPERTY_NAME));
-
- if (serverPort != null) {
- return;
- }
-
- serverPort = getRestPortFromProtocolProperty(environment);
-
- if (serverPort == null) {
- serverPort = getRestPortFromProtocolsProperties(environment);
- }
-
- setServerPort(environment, serverPort, defaultProperties);
- }
-
- private String getRestPortFromProtocolProperty(ConfigurableEnvironment environment) {
-
- String protocol = environment.getProperty(PROTOCOL_NAME_PROPERTY_NAME, DEFAULT_PROTOCOL);
-
- return isRestProtocol(protocol) ?
- environment.getProperty(PROTOCOL_PORT_PROPERTY_NAME) :
- null;
- }
-
- private String getRestPortFromProtocolsProperties(ConfigurableEnvironment environment) {
-
- String restPort = null;
-
- Map subProperties = getSubProperties(environment, PROTOCOLS_PROPERTY_NAME_PREFIX);
-
- Properties properties = new Properties();
-
- properties.putAll(subProperties);
-
- for (String propertyName : properties.stringPropertyNames()) {
- if (propertyName.endsWith(PROTOCOL_NAME_PROPERTY_NAME_SUFFIX)) { // protocol name property
- String protocol = properties.getProperty(propertyName);
- if (isRestProtocol(protocol)) {
- String beanName = resolveBeanName(propertyName);
- if (StringUtils.hasText(beanName)) {
- restPort = properties.getProperty(beanName + PROTOCOL_PORT_PROPERTY_NAME_SUFFIX);
- break;
- }
- }
- }
- }
-
- return restPort;
- }
-
- private String resolveBeanName(String propertyName) {
- int index = propertyName.indexOf(DOT);
- return index > -1 ? propertyName.substring(0, index) : null;
- }
-
- private void setServerPort(ConfigurableEnvironment environment, String serverPort,
- Map defaultProperties) {
- if (serverPort == null) {
- return;
- }
-
- defaultProperties.put(SERVER_PORT_PROPERTY_NAME, serverPort);
-
- }
-
- /**
- * Copy from BusEnvironmentPostProcessor#addOrReplace(MutablePropertySources, Map)
- *
- * @param propertySources {@link MutablePropertySources}
- * @param map Default Dubbo Properties
- */
- private void addOrReplace(MutablePropertySources propertySources,
- Map map) {
- MapPropertySource target = null;
- if (propertySources.contains(PROPERTY_SOURCE_NAME)) {
- PropertySource> source = propertySources.get(PROPERTY_SOURCE_NAME);
- if (source instanceof MapPropertySource) {
- target = (MapPropertySource) source;
- for (String key : map.keySet()) {
- if (!target.containsProperty(key)) {
- target.getSource().put(key, map.get(key));
- }
- }
- }
- }
- if (target == null) {
- target = new MapPropertySource(PROPERTY_SOURCE_NAME, map);
- }
- if (!propertySources.contains(PROPERTY_SOURCE_NAME)) {
- propertySources.addLast(target);
- }
- }
-
- @Override
- public int getOrder() { // Keep LOWEST_PRECEDENCE
- return LOWEST_PRECEDENCE;
- }
+ MutablePropertySources propertySources = environment.getPropertySources();
+ Map defaultProperties = createDefaultProperties(environment);
+ if (!CollectionUtils.isEmpty(defaultProperties)) {
+ addOrReplace(propertySources, defaultProperties);
+ }
+ }
+
+ private Map createDefaultProperties(
+ ConfigurableEnvironment environment) {
+ Map defaultProperties = new HashMap();
+ resetServerPort(environment, defaultProperties);
+ return defaultProperties;
+ }
+
+ /**
+ * Reset server port property if it's absent, whose value is configured by
+ * "dubbbo.protocol.port" or "dubbo.protcols.rest.port"
+ *
+ * @param environment
+ * @param defaultProperties
+ */
+ private void resetServerPort(ConfigurableEnvironment environment,
+ Map defaultProperties) {
+
+ String serverPort = environment.getProperty(SERVER_PORT_PROPERTY_NAME,
+ environment.getProperty(PORT_PROPERTY_NAME));
+
+ if (serverPort != null) {
+ return;
+ }
+
+ serverPort = getRestPortFromProtocolProperty(environment);
+
+ if (serverPort == null) {
+ serverPort = getRestPortFromProtocolsProperties(environment);
+ }
+
+ setServerPort(environment, serverPort, defaultProperties);
+ }
+
+ private String getRestPortFromProtocolProperty(ConfigurableEnvironment environment) {
+
+ String protocol = environment.getProperty(PROTOCOL_NAME_PROPERTY_NAME,
+ DEFAULT_PROTOCOL);
+
+ return isRestProtocol(protocol)
+ ? environment.getProperty(PROTOCOL_PORT_PROPERTY_NAME)
+ : null;
+ }
+
+ private String getRestPortFromProtocolsProperties(
+ ConfigurableEnvironment environment) {
+
+ String restPort = null;
+
+ Map subProperties = getSubProperties(environment,
+ PROTOCOLS_PROPERTY_NAME_PREFIX);
+
+ Properties properties = new Properties();
+
+ properties.putAll(subProperties);
+
+ for (String propertyName : properties.stringPropertyNames()) {
+ if (propertyName.endsWith(PROTOCOL_NAME_PROPERTY_NAME_SUFFIX)) { // protocol
+ // name
+ // property
+ String protocol = properties.getProperty(propertyName);
+ if (isRestProtocol(protocol)) {
+ String beanName = resolveBeanName(propertyName);
+ if (StringUtils.hasText(beanName)) {
+ restPort = properties.getProperty(
+ beanName + PROTOCOL_PORT_PROPERTY_NAME_SUFFIX);
+ break;
+ }
+ }
+ }
+ }
+
+ return restPort;
+ }
+
+ private String resolveBeanName(String propertyName) {
+ int index = propertyName.indexOf(DOT);
+ return index > -1 ? propertyName.substring(0, index) : null;
+ }
+
+ private void setServerPort(ConfigurableEnvironment environment, String serverPort,
+ Map defaultProperties) {
+ if (serverPort == null) {
+ return;
+ }
+
+ defaultProperties.put(SERVER_PORT_PROPERTY_NAME, serverPort);
+
+ }
+
+ /**
+ * Copy from BusEnvironmentPostProcessor#addOrReplace(MutablePropertySources, Map)
+ *
+ * @param propertySources {@link MutablePropertySources}
+ * @param map Default Dubbo Properties
+ */
+ private void addOrReplace(MutablePropertySources propertySources,
+ Map map) {
+ MapPropertySource target = null;
+ if (propertySources.contains(PROPERTY_SOURCE_NAME)) {
+ PropertySource> source = propertySources.get(PROPERTY_SOURCE_NAME);
+ if (source instanceof MapPropertySource) {
+ target = (MapPropertySource) source;
+ for (String key : map.keySet()) {
+ if (!target.containsProperty(key)) {
+ target.getSource().put(key, map.get(key));
+ }
+ }
+ }
+ }
+ if (target == null) {
+ target = new MapPropertySource(PROPERTY_SOURCE_NAME, map);
+ }
+ if (!propertySources.contains(PROPERTY_SOURCE_NAME)) {
+ propertySources.addLast(target);
+ }
+ }
+
+ @Override
+ public int getOrder() { // Keep LOWEST_PRECEDENCE
+ return LOWEST_PRECEDENCE;
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/ByteArrayHttpInputMessage.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/ByteArrayHttpInputMessage.java
index 4b2b12b22..4484a5805 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/ByteArrayHttpInputMessage.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/ByteArrayHttpInputMessage.java
@@ -16,14 +16,14 @@
*/
package com.alibaba.cloud.dubbo.http;
+import java.io.IOException;
+import java.io.InputStream;
+
import org.apache.dubbo.common.io.UnsafeByteArrayInputStream;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpInputMessage;
-import java.io.IOException;
-import java.io.InputStream;
-
/**
* Byte array {@link HttpInputMessage} implementation
*
@@ -31,26 +31,26 @@ import java.io.InputStream;
*/
class ByteArrayHttpInputMessage implements HttpInputMessage {
- private final HttpHeaders httpHeaders;
+ private final HttpHeaders httpHeaders;
- private final InputStream inputStream;
+ private final InputStream inputStream;
- public ByteArrayHttpInputMessage(byte[] body) {
- this(new HttpHeaders(), body);
- }
+ public ByteArrayHttpInputMessage(byte[] body) {
+ this(new HttpHeaders(), body);
+ }
- public ByteArrayHttpInputMessage(HttpHeaders httpHeaders, byte[] body) {
- this.httpHeaders = httpHeaders;
- this.inputStream = new UnsafeByteArrayInputStream(body);
- }
+ public ByteArrayHttpInputMessage(HttpHeaders httpHeaders, byte[] body) {
+ this.httpHeaders = httpHeaders;
+ this.inputStream = new UnsafeByteArrayInputStream(body);
+ }
- @Override
- public InputStream getBody() throws IOException {
- return inputStream;
- }
+ @Override
+ public InputStream getBody() throws IOException {
+ return inputStream;
+ }
- @Override
- public HttpHeaders getHeaders() {
- return httpHeaders;
- }
+ @Override
+ public HttpHeaders getHeaders() {
+ return httpHeaders;
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/DefaultHttpRequest.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/DefaultHttpRequest.java
index 4c1e26fe3..183c40966 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/DefaultHttpRequest.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/DefaultHttpRequest.java
@@ -16,6 +16,12 @@
*/
package com.alibaba.cloud.dubbo.http;
+import static org.springframework.web.util.UriComponentsBuilder.fromPath;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpRequest;
@@ -23,12 +29,6 @@ import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.UriComponentsBuilder;
-import java.net.URI;
-import java.util.List;
-import java.util.Map;
-
-import static org.springframework.web.util.UriComponentsBuilder.fromPath;
-
/**
* Default {@link HttpRequest} implementation
*
@@ -36,96 +36,95 @@ import static org.springframework.web.util.UriComponentsBuilder.fromPath;
*/
public class DefaultHttpRequest implements HttpRequest {
- private final String method;
-
- private final URI uri;
+ private final String method;
- private final HttpHeaders headers = new HttpHeaders();
+ private final URI uri;
- public DefaultHttpRequest(String method, String path, Map> params,
- Map> headers) {
- this.method = method == null ? HttpMethod.GET.name() : method.toUpperCase();
- this.uri = buildURI(path, params);
- this.headers.putAll(headers);
- }
+ private final HttpHeaders headers = new HttpHeaders();
- public static Builder builder() {
- return new Builder();
- }
+ public DefaultHttpRequest(String method, String path,
+ Map> params, Map> headers) {
+ this.method = method == null ? HttpMethod.GET.name() : method.toUpperCase();
+ this.uri = buildURI(path, params);
+ this.headers.putAll(headers);
+ }
- private URI buildURI(String path, Map> params) {
- UriComponentsBuilder builder = fromPath(path)
- .queryParams(new LinkedMultiValueMap<>(params));
- return builder.build().toUri();
- }
+ public static Builder builder() {
+ return new Builder();
+ }
- @Override
- public HttpMethod getMethod() {
- return HttpMethod.resolve(getMethodValue());
- }
+ private URI buildURI(String path, Map> params) {
+ UriComponentsBuilder builder = fromPath(path)
+ .queryParams(new LinkedMultiValueMap<>(params));
+ return builder.build().toUri();
+ }
- @Override
- public String getMethodValue() {
- return method;
- }
+ @Override
+ public HttpMethod getMethod() {
+ return HttpMethod.resolve(getMethodValue());
+ }
- @Override
- public URI getURI() {
- return uri;
- }
+ @Override
+ public String getMethodValue() {
+ return method;
+ }
- @Override
- public HttpHeaders getHeaders() {
- return headers;
- }
+ @Override
+ public URI getURI() {
+ return uri;
+ }
- /**
- * {@link HttpRequest} Builder
- */
- public static class Builder {
+ @Override
+ public HttpHeaders getHeaders() {
+ return headers;
+ }
- String method;
+ /**
+ * {@link HttpRequest} Builder
+ */
+ public static class Builder {
- String path;
+ String method;
- MultiValueMap params = new LinkedMultiValueMap<>();
+ String path;
- MultiValueMap headers = new LinkedMultiValueMap<>();
+ MultiValueMap params = new LinkedMultiValueMap<>();
- public Builder method(String method) {
- this.method = method;
- return this;
- }
+ MultiValueMap headers = new LinkedMultiValueMap<>();
- public Builder path(String path) {
- this.path = path;
- return this;
- }
+ public Builder method(String method) {
+ this.method = method;
+ return this;
+ }
- public Builder param(String name, String value) {
- this.params.add(name, value);
- return this;
- }
+ public Builder path(String path) {
+ this.path = path;
+ return this;
+ }
- public Builder header(String name, String value) {
- this.headers.add(name, value);
- return this;
- }
+ public Builder param(String name, String value) {
+ this.params.add(name, value);
+ return this;
+ }
- public Builder params(Map> params) {
- this.params.putAll(params);
- return this;
- }
+ public Builder header(String name, String value) {
+ this.headers.add(name, value);
+ return this;
+ }
- public Builder headers(Map> headers) {
- this.headers.putAll(headers);
- return this;
- }
+ public Builder params(Map> params) {
+ this.params.putAll(params);
+ return this;
+ }
- public HttpRequest build() {
- return new DefaultHttpRequest(method, path, params, headers);
- }
- }
+ public Builder headers(Map> headers) {
+ this.headers.putAll(headers);
+ return this;
+ }
+ public HttpRequest build() {
+ return new DefaultHttpRequest(method, path, params, headers);
+ }
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/HttpServerRequest.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/HttpServerRequest.java
index 00bcbf40a..11af67672 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/HttpServerRequest.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/HttpServerRequest.java
@@ -27,16 +27,16 @@ import org.springframework.util.MultiValueMap;
*/
public interface HttpServerRequest extends HttpRequest, HttpInputMessage {
- /**
- * Return a path of current HTTP request
- *
- * @return
- */
- String getPath();
+ /**
+ * Return a path of current HTTP request
+ *
+ * @return
+ */
+ String getPath();
- /**
- * Return a map with parsed and decoded query parameter values.
- */
- MultiValueMap getQueryParams();
+ /**
+ * Return a map with parsed and decoded query parameter values.
+ */
+ MultiValueMap getQueryParams();
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/MutableHttpServerRequest.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/MutableHttpServerRequest.java
index 602c685a3..3348bd69c 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/MutableHttpServerRequest.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/MutableHttpServerRequest.java
@@ -16,18 +16,18 @@
*/
package com.alibaba.cloud.dubbo.http;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpInputMessage;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.HttpRequest;
-import org.springframework.util.MultiValueMap;
+import static com.alibaba.cloud.dubbo.http.util.HttpUtils.getParameters;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.Map;
-import static com.alibaba.cloud.dubbo.http.util.HttpUtils.getParameters;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpInputMessage;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpRequest;
+import org.springframework.util.MultiValueMap;
/**
* Mutable {@link HttpServerRequest} implementation
@@ -36,65 +36,65 @@ import static com.alibaba.cloud.dubbo.http.util.HttpUtils.getParameters;
*/
public class MutableHttpServerRequest implements HttpServerRequest {
- private final HttpMethod httpMethod;
+ private final HttpMethod httpMethod;
- private final URI uri;
+ private final URI uri;
- private final String path;
+ private final String path;
- private final MultiValueMap queryParams;
+ private final MultiValueMap queryParams;
- private final HttpHeaders httpHeaders;
+ private final HttpHeaders httpHeaders;
- private final HttpInputMessage httpInputMessage;
+ private final HttpInputMessage httpInputMessage;
- public MutableHttpServerRequest(HttpRequest httpRequest, byte[] body) {
- this.httpMethod = httpRequest.getMethod();
- this.uri = httpRequest.getURI();
- this.path = uri.getPath();
- this.httpHeaders = httpRequest.getHeaders();
- this.queryParams = getParameters(httpRequest);
- this.httpInputMessage = new ByteArrayHttpInputMessage(body);
- }
+ public MutableHttpServerRequest(HttpRequest httpRequest, byte[] body) {
+ this.httpMethod = httpRequest.getMethod();
+ this.uri = httpRequest.getURI();
+ this.path = uri.getPath();
+ this.httpHeaders = httpRequest.getHeaders();
+ this.queryParams = getParameters(httpRequest);
+ this.httpInputMessage = new ByteArrayHttpInputMessage(body);
+ }
- public MutableHttpServerRequest params(Map params) {
- queryParams.setAll(params);
- return this;
- }
+ public MutableHttpServerRequest params(Map params) {
+ queryParams.setAll(params);
+ return this;
+ }
- @Override
- public InputStream getBody() throws IOException {
- return httpInputMessage.getBody();
- }
+ @Override
+ public InputStream getBody() throws IOException {
+ return httpInputMessage.getBody();
+ }
- @Override
- public HttpMethod getMethod() {
- return httpMethod;
- }
+ @Override
+ public HttpMethod getMethod() {
+ return httpMethod;
+ }
- // Override method since Spring Framework 5.0
- @Override
- public String getMethodValue() {
- return httpMethod.name();
- }
+ // Override method since Spring Framework 5.0
+ @Override
+ public String getMethodValue() {
+ return httpMethod.name();
+ }
- @Override
- public URI getURI() {
- return uri;
- }
+ @Override
+ public URI getURI() {
+ return uri;
+ }
- @Override
- public HttpHeaders getHeaders() {
- return httpHeaders;
- }
+ @Override
+ public HttpHeaders getHeaders() {
+ return httpHeaders;
+ }
- @Override
- public String getPath() {
- return path;
- }
+ @Override
+ public String getPath() {
+ return path;
+ }
- @Override
- public MultiValueMap getQueryParams() {
- return queryParams;
- }
+ @Override
+ public MultiValueMap getQueryParams() {
+ return queryParams;
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/converter/HttpMessageConverterHolder.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/converter/HttpMessageConverterHolder.java
index 2a2423863..67d2f30b7 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/converter/HttpMessageConverterHolder.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/converter/HttpMessageConverterHolder.java
@@ -26,20 +26,21 @@ import org.springframework.http.converter.HttpMessageConverter;
*/
public class HttpMessageConverterHolder {
- private final MediaType mediaType;
+ private final MediaType mediaType;
- private final HttpMessageConverter> converter;
+ private final HttpMessageConverter> converter;
- public HttpMessageConverterHolder(MediaType mediaType, HttpMessageConverter> converter) {
- this.mediaType = mediaType;
- this.converter = converter;
- }
+ public HttpMessageConverterHolder(MediaType mediaType,
+ HttpMessageConverter> converter) {
+ this.mediaType = mediaType;
+ this.converter = converter;
+ }
- public MediaType getMediaType() {
- return mediaType;
- }
+ public MediaType getMediaType() {
+ return mediaType;
+ }
- public HttpMessageConverter> getConverter() {
- return converter;
- }
+ public HttpMessageConverter> getConverter() {
+ return converter;
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractHttpRequestMatcher.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractHttpRequestMatcher.java
index c823de4fd..4bc1c2817 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractHttpRequestMatcher.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractHttpRequestMatcher.java
@@ -27,50 +27,50 @@ import java.util.Iterator;
*/
public abstract class AbstractHttpRequestMatcher implements HttpRequestMatcher {
- /**
- * Return the discrete items a request condition is composed of.
- *
- * For example URL patterns, HTTP request methods, param expressions, etc.
- *
- * @return a collection of objects, never {@code null}
- */
- protected abstract Collection> getContent();
+ /**
+ * Return the discrete items a request condition is composed of.
+ *
+ * For example URL patterns, HTTP request methods, param expressions, etc.
+ *
+ * @return a collection of objects, never {@code null}
+ */
+ protected abstract Collection> getContent();
- /**
- * The notation to use when printing discrete items of content.
- *
- * For example {@code " || "} for URL patterns or {@code " && "} for param
- * expressions.
- */
- protected abstract String getToStringInfix();
+ /**
+ * The notation to use when printing discrete items of content.
+ *
+ * For example {@code " || "} for URL patterns or {@code " && "} for param
+ * expressions.
+ */
+ protected abstract String getToStringInfix();
- @Override
- public boolean equals(Object other) {
- if (this == other) {
- return true;
- }
- if (other == null || getClass() != other.getClass()) {
- return false;
- }
- return getContent().equals(((AbstractHttpRequestMatcher) other).getContent());
- }
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (other == null || getClass() != other.getClass()) {
+ return false;
+ }
+ return getContent().equals(((AbstractHttpRequestMatcher) other).getContent());
+ }
- @Override
- public int hashCode() {
- return getContent().hashCode();
- }
+ @Override
+ public int hashCode() {
+ return getContent().hashCode();
+ }
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder("[");
- for (Iterator> iterator = getContent().iterator(); iterator.hasNext(); ) {
- Object expression = iterator.next();
- builder.append(expression.toString());
- if (iterator.hasNext()) {
- builder.append(getToStringInfix());
- }
- }
- builder.append("]");
- return builder.toString();
- }
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder("[");
+ for (Iterator> iterator = getContent().iterator(); iterator.hasNext();) {
+ Object expression = iterator.next();
+ builder.append(expression.toString());
+ if (iterator.hasNext()) {
+ builder.append(getToStringInfix());
+ }
+ }
+ builder.append("]");
+ return builder.toString();
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractMediaTypeExpression.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractMediaTypeExpression.java
index 5f47f1bc0..60e8939f5 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractMediaTypeExpression.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractMediaTypeExpression.java
@@ -19,73 +19,77 @@ package com.alibaba.cloud.dubbo.http.matcher;
import org.springframework.http.MediaType;
/**
- * The some source code is scratched from org.springframework.web.servlet.mvc.condition.AbstractMediaTypeExpression
+ * The some source code is scratched from
+ * org.springframework.web.servlet.mvc.condition.AbstractMediaTypeExpression
*
* @author Arjen Poutsma
* @author Rossen Stoyanchev
* @author Mercy
*/
-public class AbstractMediaTypeExpression implements MediaTypeExpression, Comparable {
+public class AbstractMediaTypeExpression
+ implements MediaTypeExpression, Comparable {
- private final MediaType mediaType;
+ private final MediaType mediaType;
- private final boolean negated;
+ private final boolean negated;
- AbstractMediaTypeExpression(String expression) {
- if (expression.startsWith("!")) {
- this.negated = true;
- expression = expression.substring(1);
- } else {
- this.negated = false;
- }
- this.mediaType = MediaType.parseMediaType(expression);
- }
+ AbstractMediaTypeExpression(String expression) {
+ if (expression.startsWith("!")) {
+ this.negated = true;
+ expression = expression.substring(1);
+ }
+ else {
+ this.negated = false;
+ }
+ this.mediaType = MediaType.parseMediaType(expression);
+ }
- AbstractMediaTypeExpression(MediaType mediaType, boolean negated) {
- this.mediaType = mediaType;
- this.negated = negated;
- }
+ AbstractMediaTypeExpression(MediaType mediaType, boolean negated) {
+ this.mediaType = mediaType;
+ this.negated = negated;
+ }
- @Override
- public MediaType getMediaType() {
- return this.mediaType;
- }
+ @Override
+ public MediaType getMediaType() {
+ return this.mediaType;
+ }
- @Override
- public boolean isNegated() {
- return this.negated;
- }
+ @Override
+ public boolean isNegated() {
+ return this.negated;
+ }
+ @Override
+ public int compareTo(AbstractMediaTypeExpression other) {
+ return MediaType.SPECIFICITY_COMPARATOR.compare(this.getMediaType(),
+ other.getMediaType());
+ }
- @Override
- public int compareTo(AbstractMediaTypeExpression other) {
- return MediaType.SPECIFICITY_COMPARATOR.compare(this.getMediaType(), other.getMediaType());
- }
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (other == null || getClass() != other.getClass()) {
+ return false;
+ }
+ AbstractMediaTypeExpression otherExpr = (AbstractMediaTypeExpression) other;
+ return (this.mediaType.equals(otherExpr.mediaType)
+ && this.negated == otherExpr.negated);
+ }
- @Override
- public boolean equals(Object other) {
- if (this == other) {
- return true;
- }
- if (other == null || getClass() != other.getClass()) {
- return false;
- }
- AbstractMediaTypeExpression otherExpr = (AbstractMediaTypeExpression) other;
- return (this.mediaType.equals(otherExpr.mediaType) && this.negated == otherExpr.negated);
- }
+ @Override
+ public int hashCode() {
+ return this.mediaType.hashCode();
+ }
- @Override
- public int hashCode() {
- return this.mediaType.hashCode();
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- if (this.negated) {
- builder.append('!');
- }
- builder.append(this.mediaType.toString());
- return builder.toString();
- }
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ if (this.negated) {
+ builder.append('!');
+ }
+ builder.append(this.mediaType.toString());
+ return builder.toString();
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractNameValueExpression.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractNameValueExpression.java
index 877a7aa08..fe50e187c 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractNameValueExpression.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/AbstractNameValueExpression.java
@@ -16,14 +16,15 @@
*/
package com.alibaba.cloud.dubbo.http.matcher;
+import static org.springframework.util.StringUtils.trimWhitespace;
+
import org.springframework.http.HttpRequest;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
-import static org.springframework.util.StringUtils.trimWhitespace;
-
/**
- * The some source code is scratched from org.springframework.web.servlet.mvc.condition.AbstractNameValueExpression
+ * The some source code is scratched from
+ * org.springframework.web.servlet.mvc.condition.AbstractNameValueExpression
*
* @author Rossen Stoyanchev
* @author Arjen Poutsma
@@ -31,116 +32,123 @@ import static org.springframework.util.StringUtils.trimWhitespace;
*/
abstract class AbstractNameValueExpression implements NameValueExpression {
- protected final String name;
-
- protected final T value;
-
- protected final boolean negated;
-
- AbstractNameValueExpression(String expression) {
- int separator = expression.indexOf('=');
- if (separator == -1) {
- this.negated = expression.startsWith("!");
- this.name = trimWhitespace((this.negated ? expression.substring(1) : expression));
- this.value = null;
- } else {
- this.negated = (separator > 0) && (expression.charAt(separator - 1) == '!');
- this.name = trimWhitespace((this.negated ? expression.substring(0, separator - 1)
- : expression.substring(0, separator)));
- String valueExpression = getValueExpression(expression, separator);
- this.value = isExcludedValue(valueExpression) ? null : parseValue(valueExpression);
- }
- }
-
- private String getValueExpression(String expression, int separator) {
- return trimWhitespace(expression.substring(separator + 1));
- }
-
- /**
- * Exclude the pattern value Expression: "{value}", subclass could override this method.
- *
- * @param valueExpression
- * @return
- */
- protected boolean isExcludedValue(String valueExpression) {
- return StringUtils.hasText(valueExpression) &&
- valueExpression.startsWith("{")
- && valueExpression.endsWith("}");
- }
-
- @Override
- public String getName() {
- return this.name;
- }
-
- @Override
- public T getValue() {
- return this.value;
- }
-
- @Override
- public boolean isNegated() {
- return this.negated;
- }
-
- public final boolean match(HttpRequest request) {
- boolean isMatch;
- if (this.value != null) {
- isMatch = matchValue(request);
- } else {
- isMatch = matchName(request);
- }
- return (this.negated ? !isMatch : isMatch);
- }
-
-
- protected abstract boolean isCaseSensitiveName();
-
- protected abstract T parseValue(String valueExpression);
-
- protected abstract boolean matchName(HttpRequest request);
-
- protected abstract boolean matchValue(HttpRequest request);
-
-
- @Override
- public boolean equals(Object other) {
- if (this == other) {
- return true;
- }
- if (other == null || getClass() != other.getClass()) {
- return false;
- }
- AbstractNameValueExpression> that = (AbstractNameValueExpression>) other;
- return ((isCaseSensitiveName() ? this.name.equals(that.name) : this.name.equalsIgnoreCase(that.name)) &&
- ObjectUtils.nullSafeEquals(this.value, that.value) && this.negated == that.negated);
- }
-
- @Override
- public int hashCode() {
- int result = (isCaseSensitiveName() ? this.name.hashCode() : this.name.toLowerCase().hashCode());
- result = 31 * result + (this.value != null ? this.value.hashCode() : 0);
- result = 31 * result + (this.negated ? 1 : 0);
- return result;
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- if (this.value != null) {
- builder.append(this.name);
- if (this.negated) {
- builder.append('!');
- }
- builder.append('=');
- builder.append(this.value);
- } else {
- if (this.negated) {
- builder.append('!');
- }
- builder.append(this.name);
- }
- return builder.toString();
- }
+ protected final String name;
+
+ protected final T value;
+
+ protected final boolean negated;
+
+ AbstractNameValueExpression(String expression) {
+ int separator = expression.indexOf('=');
+ if (separator == -1) {
+ this.negated = expression.startsWith("!");
+ this.name = trimWhitespace(
+ (this.negated ? expression.substring(1) : expression));
+ this.value = null;
+ }
+ else {
+ this.negated = (separator > 0) && (expression.charAt(separator - 1) == '!');
+ this.name = trimWhitespace(
+ (this.negated ? expression.substring(0, separator - 1)
+ : expression.substring(0, separator)));
+ String valueExpression = getValueExpression(expression, separator);
+ this.value = isExcludedValue(valueExpression) ? null
+ : parseValue(valueExpression);
+ }
+ }
+
+ private String getValueExpression(String expression, int separator) {
+ return trimWhitespace(expression.substring(separator + 1));
+ }
+
+ /**
+ * Exclude the pattern value Expression: "{value}", subclass could override this
+ * method.
+ *
+ * @param valueExpression
+ * @return
+ */
+ protected boolean isExcludedValue(String valueExpression) {
+ return StringUtils.hasText(valueExpression) && valueExpression.startsWith("{")
+ && valueExpression.endsWith("}");
+ }
+
+ @Override
+ public String getName() {
+ return this.name;
+ }
+
+ @Override
+ public T getValue() {
+ return this.value;
+ }
+
+ @Override
+ public boolean isNegated() {
+ return this.negated;
+ }
+
+ public final boolean match(HttpRequest request) {
+ boolean isMatch;
+ if (this.value != null) {
+ isMatch = matchValue(request);
+ }
+ else {
+ isMatch = matchName(request);
+ }
+ return (this.negated ? !isMatch : isMatch);
+ }
+
+ protected abstract boolean isCaseSensitiveName();
+
+ protected abstract T parseValue(String valueExpression);
+
+ protected abstract boolean matchName(HttpRequest request);
+
+ protected abstract boolean matchValue(HttpRequest request);
+
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (other == null || getClass() != other.getClass()) {
+ return false;
+ }
+ AbstractNameValueExpression> that = (AbstractNameValueExpression>) other;
+ return ((isCaseSensitiveName() ? this.name.equals(that.name)
+ : this.name.equalsIgnoreCase(that.name))
+ && ObjectUtils.nullSafeEquals(this.value, that.value)
+ && this.negated == that.negated);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = (isCaseSensitiveName() ? this.name.hashCode()
+ : this.name.toLowerCase().hashCode());
+ result = 31 * result + (this.value != null ? this.value.hashCode() : 0);
+ result = 31 * result + (this.negated ? 1 : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ if (this.value != null) {
+ builder.append(this.name);
+ if (this.negated) {
+ builder.append('!');
+ }
+ builder.append('=');
+ builder.append(this.value);
+ }
+ else {
+ if (this.negated) {
+ builder.append('!');
+ }
+ builder.append(this.name);
+ }
+ return builder.toString();
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/CompositeHttpRequestMatcher.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/CompositeHttpRequestMatcher.java
index 255a8829a..2e6347320 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/CompositeHttpRequestMatcher.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/CompositeHttpRequestMatcher.java
@@ -16,13 +16,13 @@
*/
package com.alibaba.cloud.dubbo.http.matcher;
-import org.springframework.http.HttpRequest;
-
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
+import org.springframework.http.HttpRequest;
+
/**
* Composite {@link HttpRequestMatcher} implementation
*
@@ -30,44 +30,44 @@ import java.util.List;
*/
public abstract class CompositeHttpRequestMatcher extends AbstractHttpRequestMatcher {
- private final List matchers = new LinkedList<>();
+ private final List matchers = new LinkedList<>();
- public CompositeHttpRequestMatcher(HttpRequestMatcher... matchers) {
- this.matchers.addAll(Arrays.asList(matchers));
- }
+ public CompositeHttpRequestMatcher(HttpRequestMatcher... matchers) {
+ this.matchers.addAll(Arrays.asList(matchers));
+ }
- public CompositeHttpRequestMatcher and(HttpRequestMatcher matcher) {
- this.matchers.add(matcher);
- return this;
- }
+ public CompositeHttpRequestMatcher and(HttpRequestMatcher matcher) {
+ this.matchers.add(matcher);
+ return this;
+ }
- @Override
- public boolean match(HttpRequest request) {
- for (HttpRequestMatcher matcher : matchers) {
- if (!matcher.match(request)) {
- return false;
- }
- }
- return true;
- }
+ @Override
+ public boolean match(HttpRequest request) {
+ for (HttpRequestMatcher matcher : matchers) {
+ if (!matcher.match(request)) {
+ return false;
+ }
+ }
+ return true;
+ }
- protected List getMatchers() {
- return this.matchers;
- }
+ protected List getMatchers() {
+ return this.matchers;
+ }
- @Override
- protected Collection> getContent() {
- List content = new LinkedList<>();
- for (HttpRequestMatcher matcher : getMatchers()) {
- if (matcher instanceof AbstractHttpRequestMatcher) {
- content.addAll(((AbstractHttpRequestMatcher) matcher).getContent());
- }
- }
- return content;
- }
+ @Override
+ protected Collection> getContent() {
+ List content = new LinkedList<>();
+ for (HttpRequestMatcher matcher : getMatchers()) {
+ if (matcher instanceof AbstractHttpRequestMatcher) {
+ content.addAll(((AbstractHttpRequestMatcher) matcher).getContent());
+ }
+ }
+ return content;
+ }
- @Override
- protected String getToStringInfix() {
- return " && ";
- }
+ @Override
+ protected String getToStringInfix() {
+ return " && ";
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/ConsumeMediaTypeExpression.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/ConsumeMediaTypeExpression.java
index 33f39a2ac..e34c394a8 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/ConsumeMediaTypeExpression.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/ConsumeMediaTypeExpression.java
@@ -29,16 +29,16 @@ import org.springframework.http.MediaType;
*/
class ConsumeMediaTypeExpression extends AbstractMediaTypeExpression {
- ConsumeMediaTypeExpression(String expression) {
- super(expression);
- }
+ ConsumeMediaTypeExpression(String expression) {
+ super(expression);
+ }
- ConsumeMediaTypeExpression(MediaType mediaType, boolean negated) {
- super(mediaType, negated);
- }
+ ConsumeMediaTypeExpression(MediaType mediaType, boolean negated) {
+ super(mediaType, negated);
+ }
- public final boolean match(MediaType contentType) {
- boolean match = getMediaType().includes(contentType);
- return (!isNegated() ? match : !match);
- }
+ public final boolean match(MediaType contentType) {
+ boolean match = getMediaType().includes(contentType);
+ return (!isNegated() ? match : !match);
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HeaderExpression.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HeaderExpression.java
index 12a85bc07..1f2e80cfb 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HeaderExpression.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HeaderExpression.java
@@ -23,7 +23,8 @@ import org.springframework.util.ObjectUtils;
/**
* Parses and matches a single header expression to a request.
*
- * The some source code is scratched from org.springframework.web.servlet.mvc.condition.HeadersRequestCondition.HeaderExpression
+ * The some source code is scratched from
+ * org.springframework.web.servlet.mvc.condition.HeadersRequestCondition.HeaderExpression
*
* @author Arjen Poutsma
* @author Rossen Stoyanchev
@@ -31,30 +32,30 @@ import org.springframework.util.ObjectUtils;
*/
class HeaderExpression extends AbstractNameValueExpression {
- HeaderExpression(String expression) {
- super(expression);
- }
+ HeaderExpression(String expression) {
+ super(expression);
+ }
- @Override
- protected boolean isCaseSensitiveName() {
- return false;
- }
+ @Override
+ protected boolean isCaseSensitiveName() {
+ return false;
+ }
- @Override
- protected String parseValue(String valueExpression) {
- return valueExpression;
- }
+ @Override
+ protected String parseValue(String valueExpression) {
+ return valueExpression;
+ }
- @Override
- protected boolean matchName(HttpRequest request) {
- HttpHeaders httpHeaders = request.getHeaders();
- return httpHeaders.containsKey(this.name);
- }
+ @Override
+ protected boolean matchName(HttpRequest request) {
+ HttpHeaders httpHeaders = request.getHeaders();
+ return httpHeaders.containsKey(this.name);
+ }
- @Override
- protected boolean matchValue(HttpRequest request) {
- HttpHeaders httpHeaders = request.getHeaders();
- String headerValue = httpHeaders.getFirst(this.name);
- return ObjectUtils.nullSafeEquals(this.value, headerValue);
- }
+ @Override
+ protected boolean matchValue(HttpRequest request) {
+ HttpHeaders httpHeaders = request.getHeaders();
+ String headerValue = httpHeaders.getFirst(this.name);
+ return ObjectUtils.nullSafeEquals(this.value, headerValue);
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestConsumersMatcher.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestConsumersMatcher.java
index 35f58a9bc..aa160e295 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestConsumersMatcher.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestConsumersMatcher.java
@@ -16,10 +16,6 @@
*/
package com.alibaba.cloud.dubbo.http.matcher;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpRequest;
-import org.springframework.http.MediaType;
-
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -27,6 +23,10 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpRequest;
+import org.springframework.http.MediaType;
+
/**
* {@link HttpRequest} 'Content-Type' header {@link HttpRequestMatcher matcher}
*
@@ -36,88 +36,91 @@ import java.util.Set;
*/
public class HttpRequestConsumersMatcher extends AbstractHttpRequestMatcher {
- private final List expressions;
-
- /**
- * Creates a new instance from 0 or more "consumes" expressions.
- *
- * @param consumes consumes expressions if 0 expressions are provided,
- * the condition will match to every request
- */
- public HttpRequestConsumersMatcher(String... consumes) {
- this(consumes, null);
- }
-
- /**
- * Creates a new instance with "consumes" and "header" expressions.
- * "Header" expressions where the header name is not 'Content-Type' or have
- * no header value defined are ignored. If 0 expressions are provided in
- * total, the condition will match to every request
- *
- * @param consumes consumes expressions
- * @param headers headers expressions
- */
- public HttpRequestConsumersMatcher(String[] consumes, String[] headers) {
- this(parseExpressions(consumes, headers));
- }
-
- /**
- * Private constructor accepting parsed media type expressions.
- */
- private HttpRequestConsumersMatcher(Collection expressions) {
- this.expressions = new ArrayList<>(expressions);
- Collections.sort(this.expressions);
- }
-
- private static Set parseExpressions(String[] consumes, String[] headers) {
- Set result = new LinkedHashSet<>();
- if (headers != null) {
- for (String header : headers) {
- HeaderExpression expr = new HeaderExpression(header);
- if ("Content-Type".equalsIgnoreCase(expr.name) && expr.value != null) {
- for (MediaType mediaType : MediaType.parseMediaTypes(expr.value)) {
- result.add(new ConsumeMediaTypeExpression(mediaType, expr.negated));
- }
- }
- }
- }
- for (String consume : consumes) {
- result.add(new ConsumeMediaTypeExpression(consume));
- }
- return result;
- }
-
- @Override
- public boolean match(HttpRequest request) {
-
- if (expressions.isEmpty()) {
- return true;
- }
-
- HttpHeaders httpHeaders = request.getHeaders();
-
- MediaType contentType = httpHeaders.getContentType();
-
- if (contentType == null) {
- contentType = MediaType.APPLICATION_OCTET_STREAM;
- }
-
- for (ConsumeMediaTypeExpression expression : expressions) {
- if (!expression.match(contentType)) {
- return false;
- }
- }
-
- return true;
- }
-
- @Override
- protected Collection getContent() {
- return this.expressions;
- }
-
- @Override
- protected String getToStringInfix() {
- return " || ";
- }
+ private final List expressions;
+
+ /**
+ * Creates a new instance from 0 or more "consumes" expressions.
+ *
+ * @param consumes consumes expressions if 0 expressions are provided, the condition
+ * will match to every request
+ */
+ public HttpRequestConsumersMatcher(String... consumes) {
+ this(consumes, null);
+ }
+
+ /**
+ * Creates a new instance with "consumes" and "header" expressions. "Header"
+ * expressions where the header name is not 'Content-Type' or have no header value
+ * defined are ignored. If 0 expressions are provided in total, the condition will
+ * match to every request
+ *
+ * @param consumes consumes expressions
+ * @param headers headers expressions
+ */
+ public HttpRequestConsumersMatcher(String[] consumes, String[] headers) {
+ this(parseExpressions(consumes, headers));
+ }
+
+ /**
+ * Private constructor accepting parsed media type expressions.
+ */
+ private HttpRequestConsumersMatcher(
+ Collection expressions) {
+ this.expressions = new ArrayList<>(expressions);
+ Collections.sort(this.expressions);
+ }
+
+ private static Set parseExpressions(String[] consumes,
+ String[] headers) {
+ Set result = new LinkedHashSet<>();
+ if (headers != null) {
+ for (String header : headers) {
+ HeaderExpression expr = new HeaderExpression(header);
+ if ("Content-Type".equalsIgnoreCase(expr.name) && expr.value != null) {
+ for (MediaType mediaType : MediaType.parseMediaTypes(expr.value)) {
+ result.add(
+ new ConsumeMediaTypeExpression(mediaType, expr.negated));
+ }
+ }
+ }
+ }
+ for (String consume : consumes) {
+ result.add(new ConsumeMediaTypeExpression(consume));
+ }
+ return result;
+ }
+
+ @Override
+ public boolean match(HttpRequest request) {
+
+ if (expressions.isEmpty()) {
+ return true;
+ }
+
+ HttpHeaders httpHeaders = request.getHeaders();
+
+ MediaType contentType = httpHeaders.getContentType();
+
+ if (contentType == null) {
+ contentType = MediaType.APPLICATION_OCTET_STREAM;
+ }
+
+ for (ConsumeMediaTypeExpression expression : expressions) {
+ if (!expression.match(contentType)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ protected Collection getContent() {
+ return this.expressions;
+ }
+
+ @Override
+ protected String getToStringInfix() {
+ return " || ";
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestHeadersMatcher.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestHeadersMatcher.java
index b83a02b04..8ad427e49 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestHeadersMatcher.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestHeadersMatcher.java
@@ -16,13 +16,13 @@
*/
package com.alibaba.cloud.dubbo.http.matcher;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpRequest;
-
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpRequest;
+
/**
* {@link HttpRequest} headers {@link HttpRequestMatcher matcher}
*
@@ -30,42 +30,42 @@ import java.util.Set;
*/
public class HttpRequestHeadersMatcher extends AbstractHttpRequestMatcher {
- private final Set expressions;
+ private final Set expressions;
- public HttpRequestHeadersMatcher(String... headers) {
- this.expressions = parseExpressions(headers);
- }
+ public HttpRequestHeadersMatcher(String... headers) {
+ this.expressions = parseExpressions(headers);
+ }
- private static Set parseExpressions(String... headers) {
- Set expressions = new LinkedHashSet<>();
- for (String header : headers) {
- HeaderExpression expr = new HeaderExpression(header);
- if (HttpHeaders.ACCEPT.equalsIgnoreCase(expr.name) ||
- HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(expr.name)) {
- continue;
- }
- expressions.add(expr);
- }
- return expressions;
- }
+ private static Set parseExpressions(String... headers) {
+ Set expressions = new LinkedHashSet<>();
+ for (String header : headers) {
+ HeaderExpression expr = new HeaderExpression(header);
+ if (HttpHeaders.ACCEPT.equalsIgnoreCase(expr.name)
+ || HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(expr.name)) {
+ continue;
+ }
+ expressions.add(expr);
+ }
+ return expressions;
+ }
- @Override
- public boolean match(HttpRequest request) {
- for (HeaderExpression expression : this.expressions) {
- if (!expression.match(request)) {
- return false;
- }
- }
- return true;
- }
+ @Override
+ public boolean match(HttpRequest request) {
+ for (HeaderExpression expression : this.expressions) {
+ if (!expression.match(request)) {
+ return false;
+ }
+ }
+ return true;
+ }
- @Override
- protected Collection getContent() {
- return this.expressions;
- }
+ @Override
+ protected Collection getContent() {
+ return this.expressions;
+ }
- @Override
- protected String getToStringInfix() {
- return " && ";
- }
+ @Override
+ protected String getToStringInfix() {
+ return " && ";
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestMatcher.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestMatcher.java
index 85606f2a5..d53536b92 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestMatcher.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestMatcher.java
@@ -25,11 +25,11 @@ import org.springframework.http.HttpRequest;
*/
public interface HttpRequestMatcher {
- /**
- * Match {@link HttpRequest} or not
- *
- * @param request The {@link HttpRequest} instance
- * @return if matched, return true
, or false
.
- */
- boolean match(HttpRequest request);
+ /**
+ * Match {@link HttpRequest} or not
+ *
+ * @param request The {@link HttpRequest} instance
+ * @return if matched, return true
, or false
.
+ */
+ boolean match(HttpRequest request);
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestMethodsMatcher.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestMethodsMatcher.java
index 88a323942..d520f792d 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestMethodsMatcher.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestMethodsMatcher.java
@@ -16,15 +16,15 @@
*/
package com.alibaba.cloud.dubbo.http.matcher;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.HttpRequest;
-import org.springframework.util.StringUtils;
+import static org.springframework.http.HttpMethod.resolve;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;
-import static org.springframework.http.HttpMethod.resolve;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpRequest;
+import org.springframework.util.StringUtils;
/**
* {@link HttpRequest} {@link HttpMethod methods} {@link HttpRequestMatcher matcher}
@@ -33,50 +33,50 @@ import static org.springframework.http.HttpMethod.resolve;
*/
public class HttpRequestMethodsMatcher extends AbstractHttpRequestMatcher {
- private final Set methods;
+ private final Set methods;
- public HttpRequestMethodsMatcher(String... methods) {
- this.methods = resolveHttpMethods(methods);
- }
+ public HttpRequestMethodsMatcher(String... methods) {
+ this.methods = resolveHttpMethods(methods);
+ }
- private Set resolveHttpMethods(String[] methods) {
- Set httpMethods = new LinkedHashSet<>(methods.length);
- for (String method : methods) {
- if (!StringUtils.hasText(method)) {
- continue;
- }
- HttpMethod httpMethod = resolve(method);
- httpMethods.add(httpMethod);
- }
- return httpMethods;
- }
+ private Set resolveHttpMethods(String[] methods) {
+ Set httpMethods = new LinkedHashSet<>(methods.length);
+ for (String method : methods) {
+ if (!StringUtils.hasText(method)) {
+ continue;
+ }
+ HttpMethod httpMethod = resolve(method);
+ httpMethods.add(httpMethod);
+ }
+ return httpMethods;
+ }
- public Set getMethods() {
- return methods;
- }
+ public Set getMethods() {
+ return methods;
+ }
- @Override
- public boolean match(HttpRequest request) {
- boolean matched = false;
- HttpMethod httpMethod = request.getMethod();
- if (httpMethod != null) {
- for (HttpMethod method : getMethods()) {
- if (httpMethod.equals(method)) {
- matched = true;
- break;
- }
- }
- }
- return matched;
- }
+ @Override
+ public boolean match(HttpRequest request) {
+ boolean matched = false;
+ HttpMethod httpMethod = request.getMethod();
+ if (httpMethod != null) {
+ for (HttpMethod method : getMethods()) {
+ if (httpMethod.equals(method)) {
+ matched = true;
+ break;
+ }
+ }
+ }
+ return matched;
+ }
- @Override
- protected Collection getContent() {
- return methods;
- }
+ @Override
+ protected Collection getContent() {
+ return methods;
+ }
- @Override
- protected String getToStringInfix() {
- return " || ";
- }
+ @Override
+ protected String getToStringInfix() {
+ return " || ";
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestParamsMatcher.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestParamsMatcher.java
index 234431435..01cafdfd0 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestParamsMatcher.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestParamsMatcher.java
@@ -16,13 +16,13 @@
*/
package com.alibaba.cloud.dubbo.http.matcher;
-import org.springframework.http.HttpRequest;
-import org.springframework.util.CollectionUtils;
-
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;
+import org.springframework.http.HttpRequest;
+import org.springframework.util.CollectionUtils;
+
/**
* {@link HttpRequest} parameters {@link HttpRequestMatcher matcher}
*
@@ -30,47 +30,47 @@ import java.util.Set;
*/
public class HttpRequestParamsMatcher extends AbstractHttpRequestMatcher {
- private final Set expressions;
+ private final Set expressions;
- /**
- * @param params The pattern of params :
- *
- * name=value
- * name
- *
- */
- public HttpRequestParamsMatcher(String... params) {
- this.expressions = parseExpressions(params);
- }
+ /**
+ * @param params The pattern of params :
+ *
+ * name=value
+ * name
+ *
+ */
+ public HttpRequestParamsMatcher(String... params) {
+ this.expressions = parseExpressions(params);
+ }
- private static Set parseExpressions(String... params) {
- Set expressions = new LinkedHashSet<>();
- for (String param : params) {
- expressions.add(new ParamExpression(param));
- }
- return expressions;
- }
+ private static Set parseExpressions(String... params) {
+ Set expressions = new LinkedHashSet<>();
+ for (String param : params) {
+ expressions.add(new ParamExpression(param));
+ }
+ return expressions;
+ }
- @Override
- public boolean match(HttpRequest request) {
- if (CollectionUtils.isEmpty(expressions)) {
- return true;
- }
- for (ParamExpression paramExpression : expressions) {
- if (paramExpression.match(request)) {
- return true;
- }
- }
- return false;
- }
+ @Override
+ public boolean match(HttpRequest request) {
+ if (CollectionUtils.isEmpty(expressions)) {
+ return true;
+ }
+ for (ParamExpression paramExpression : expressions) {
+ if (paramExpression.match(request)) {
+ return true;
+ }
+ }
+ return false;
+ }
- @Override
- protected Collection getContent() {
- return this.expressions;
- }
+ @Override
+ protected Collection getContent() {
+ return this.expressions;
+ }
- @Override
- protected String getToStringInfix() {
- return " && ";
- }
+ @Override
+ protected String getToStringInfix() {
+ return " && ";
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestPathMatcher.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestPathMatcher.java
index 64443511c..1d2a2264e 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestPathMatcher.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestPathMatcher.java
@@ -16,11 +16,6 @@
*/
package com.alibaba.cloud.dubbo.http.matcher;
-import org.springframework.http.HttpRequest;
-import org.springframework.util.AntPathMatcher;
-import org.springframework.util.PathMatcher;
-import org.springframework.util.StringUtils;
-
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
@@ -29,6 +24,11 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
+import org.springframework.http.HttpRequest;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.util.PathMatcher;
+import org.springframework.util.StringUtils;
+
/**
* {@link HttpRequest} {@link URI} {@link HttpRequestMatcher matcher}
*
@@ -36,82 +36,82 @@ import java.util.Set;
*/
public class HttpRequestPathMatcher extends AbstractHttpRequestMatcher {
- private final Set patterns;
+ private final Set patterns;
- private final PathMatcher pathMatcher;
+ private final PathMatcher pathMatcher;
- public HttpRequestPathMatcher(String... patterns) {
- this.patterns = Collections.unmodifiableSet(prependLeadingSlash(patterns));
- this.pathMatcher = new AntPathMatcher();
- }
+ public HttpRequestPathMatcher(String... patterns) {
+ this.patterns = Collections.unmodifiableSet(prependLeadingSlash(patterns));
+ this.pathMatcher = new AntPathMatcher();
+ }
- private static Set prependLeadingSlash(String[] patterns) {
- Set result = new LinkedHashSet<>(patterns.length);
- for (String pattern : patterns) {
- if (StringUtils.hasLength(pattern) && !pattern.startsWith("/")) {
- pattern = "/" + pattern;
- }
- result.add(pattern);
- }
- return result;
- }
+ private static Set prependLeadingSlash(String[] patterns) {
+ Set result = new LinkedHashSet<>(patterns.length);
+ for (String pattern : patterns) {
+ if (StringUtils.hasLength(pattern) && !pattern.startsWith("/")) {
+ pattern = "/" + pattern;
+ }
+ result.add(pattern);
+ }
+ return result;
+ }
- @Override
- public boolean match(HttpRequest request) {
- List matches = getMatchingPatterns(request);
- return !matches.isEmpty();
- }
+ @Override
+ public boolean match(HttpRequest request) {
+ List matches = getMatchingPatterns(request);
+ return !matches.isEmpty();
+ }
- public List getMatchingPatterns(HttpRequest request) {
- String path = getPath(request);
- List matches = getMatchingPatterns(path);
- return matches;
- }
+ public List getMatchingPatterns(HttpRequest request) {
+ String path = getPath(request);
+ List matches = getMatchingPatterns(path);
+ return matches;
+ }
- public List getMatchingPatterns(String lookupPath) {
- List matches = new ArrayList<>();
- for (String pattern : this.patterns) {
- String match = getMatchingPattern(pattern, lookupPath);
- if (match != null) {
- matches.add(match);
- }
- }
- if (matches.size() > 1) {
- matches.sort(this.pathMatcher.getPatternComparator(lookupPath));
- }
- return matches;
- }
+ public List getMatchingPatterns(String lookupPath) {
+ List matches = new ArrayList<>();
+ for (String pattern : this.patterns) {
+ String match = getMatchingPattern(pattern, lookupPath);
+ if (match != null) {
+ matches.add(match);
+ }
+ }
+ if (matches.size() > 1) {
+ matches.sort(this.pathMatcher.getPatternComparator(lookupPath));
+ }
+ return matches;
+ }
- private String getMatchingPattern(String pattern, String lookupPath) {
- if (pattern.equals(lookupPath)) {
- return pattern;
- }
- boolean hasSuffix = pattern.indexOf('.') != -1;
- if (!hasSuffix && this.pathMatcher.match(pattern + ".*", lookupPath)) {
- return pattern + ".*";
- }
- if (this.pathMatcher.match(pattern, lookupPath)) {
- return pattern;
- }
+ private String getMatchingPattern(String pattern, String lookupPath) {
+ if (pattern.equals(lookupPath)) {
+ return pattern;
+ }
+ boolean hasSuffix = pattern.indexOf('.') != -1;
+ if (!hasSuffix && this.pathMatcher.match(pattern + ".*", lookupPath)) {
+ return pattern + ".*";
+ }
+ if (this.pathMatcher.match(pattern, lookupPath)) {
+ return pattern;
+ }
- if (!pattern.endsWith("/") && this.pathMatcher.match(pattern + "/", lookupPath)) {
- return pattern + "/";
- }
- return null;
- }
+ if (!pattern.endsWith("/") && this.pathMatcher.match(pattern + "/", lookupPath)) {
+ return pattern + "/";
+ }
+ return null;
+ }
- private String getPath(HttpRequest request) {
- URI uri = request.getURI();
- return uri.getPath();
- }
+ private String getPath(HttpRequest request) {
+ URI uri = request.getURI();
+ return uri.getPath();
+ }
- @Override
- protected Collection getContent() {
- return this.patterns;
- }
+ @Override
+ protected Collection getContent() {
+ return this.patterns;
+ }
- @Override
- protected String getToStringInfix() {
- return " || ";
- }
+ @Override
+ protected String getToStringInfix() {
+ return " || ";
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestProducesMatcher.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestProducesMatcher.java
index f99297778..ea949aed9 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestProducesMatcher.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/HttpRequestProducesMatcher.java
@@ -16,10 +16,6 @@
*/
package com.alibaba.cloud.dubbo.http.matcher;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpRequest;
-import org.springframework.http.MediaType;
-
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -27,6 +23,10 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpRequest;
+import org.springframework.http.MediaType;
+
/**
* {@link HttpRequest} 'Accept' header {@link HttpRequestMatcher matcher}
*
@@ -36,84 +36,88 @@ import java.util.Set;
*/
public class HttpRequestProducesMatcher extends AbstractHttpRequestMatcher {
- private final List expressions;
-
- /**
- * Creates a new instance from "produces" expressions. If 0 expressions
- * are provided in total, this condition will match to any request.
- *
- * @param produces produces expressions
- */
- public HttpRequestProducesMatcher(String... produces) {
- this(produces, null);
- }
-
- /**
- * Creates a new instance with "produces" and "header" expressions. "Header"
- * expressions where the header name is not 'Accept' or have no header value
- * defined are ignored. If 0 expressions are provided in total, this condition
- * will match to any request.
- *
- * @param produces produces expressions
- * @param headers headers expressions
- */
- public HttpRequestProducesMatcher(String[] produces, String[] headers) {
- this(parseExpressions(produces, headers));
- }
-
- /**
- * Private constructor accepting parsed media type expressions.
- */
- private HttpRequestProducesMatcher(Collection expressions) {
- this.expressions = new ArrayList<>(expressions);
- Collections.sort(this.expressions);
- }
-
- private static Set parseExpressions(String[] produces, String[] headers) {
- Set result = new LinkedHashSet<>();
- if (headers != null) {
- for (String header : headers) {
- HeaderExpression expr = new HeaderExpression(header);
- if (HttpHeaders.ACCEPT.equalsIgnoreCase(expr.name) && expr.value != null) {
- for (MediaType mediaType : MediaType.parseMediaTypes(expr.value)) {
- result.add(new ProduceMediaTypeExpression(mediaType, expr.negated));
- }
- }
- }
- }
- for (String produce : produces) {
- result.add(new ProduceMediaTypeExpression(produce));
- }
- return result;
- }
-
- @Override
- public boolean match(HttpRequest request) {
-
- if (expressions.isEmpty()) {
- return true;
- }
-
- HttpHeaders httpHeaders = request.getHeaders();
-
- List acceptedMediaTypes = httpHeaders.getAccept();
-
- for (ProduceMediaTypeExpression expression : expressions) {
- if (!expression.match(acceptedMediaTypes)) {
- return false;
- }
- }
-
- return true;
- }
-
- @Override
- protected Collection getContent() {
- return expressions;
- }
-
- @Override
- protected String getToStringInfix() {
- return " || ";
- }
+ private final List expressions;
+
+ /**
+ * Creates a new instance from "produces" expressions. If 0 expressions are provided
+ * in total, this condition will match to any request.
+ *
+ * @param produces produces expressions
+ */
+ public HttpRequestProducesMatcher(String... produces) {
+ this(produces, null);
+ }
+
+ /**
+ * Creates a new instance with "produces" and "header" expressions. "Header"
+ * expressions where the header name is not 'Accept' or have no header value defined
+ * are ignored. If 0 expressions are provided in total, this condition will match to
+ * any request.
+ *
+ * @param produces produces expressions
+ * @param headers headers expressions
+ */
+ public HttpRequestProducesMatcher(String[] produces, String[] headers) {
+ this(parseExpressions(produces, headers));
+ }
+
+ /**
+ * Private constructor accepting parsed media type expressions.
+ */
+ private HttpRequestProducesMatcher(
+ Collection expressions) {
+ this.expressions = new ArrayList<>(expressions);
+ Collections.sort(this.expressions);
+ }
+
+ private static Set parseExpressions(String[] produces,
+ String[] headers) {
+ Set result = new LinkedHashSet<>();
+ if (headers != null) {
+ for (String header : headers) {
+ HeaderExpression expr = new HeaderExpression(header);
+ if (HttpHeaders.ACCEPT.equalsIgnoreCase(expr.name)
+ && expr.value != null) {
+ for (MediaType mediaType : MediaType.parseMediaTypes(expr.value)) {
+ result.add(
+ new ProduceMediaTypeExpression(mediaType, expr.negated));
+ }
+ }
+ }
+ }
+ for (String produce : produces) {
+ result.add(new ProduceMediaTypeExpression(produce));
+ }
+ return result;
+ }
+
+ @Override
+ public boolean match(HttpRequest request) {
+
+ if (expressions.isEmpty()) {
+ return true;
+ }
+
+ HttpHeaders httpHeaders = request.getHeaders();
+
+ List acceptedMediaTypes = httpHeaders.getAccept();
+
+ for (ProduceMediaTypeExpression expression : expressions) {
+ if (!expression.match(acceptedMediaTypes)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ protected Collection getContent() {
+ return expressions;
+ }
+
+ @Override
+ protected String getToStringInfix() {
+ return " || ";
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/MediaTypeExpression.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/MediaTypeExpression.java
index 61244f0ad..5f33de347 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/MediaTypeExpression.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/MediaTypeExpression.java
@@ -19,17 +19,18 @@ package com.alibaba.cloud.dubbo.http.matcher;
import org.springframework.http.MediaType;
/**
- * A contract for media type expressions (e.g. "text/plain", "!text/plain") as
- * defined in the for "consumes" and "produces".
+ * A contract for media type expressions (e.g. "text/plain", "!text/plain") as defined in
+ * the for "consumes" and "produces".
*
- * The source code is scratched from org.springframework.web.servlet.mvc.condition.MediaTypeExpression
+ * The source code is scratched from
+ * org.springframework.web.servlet.mvc.condition.MediaTypeExpression
*
* @author Rossen Stoyanchev
*/
interface MediaTypeExpression {
- MediaType getMediaType();
+ MediaType getMediaType();
- boolean isNegated();
+ boolean isNegated();
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/NameValueExpression.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/NameValueExpression.java
index 1da0b2fab..bbf3a96af 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/NameValueExpression.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/NameValueExpression.java
@@ -16,12 +16,12 @@
*/
package com.alibaba.cloud.dubbo.http.matcher;
-
/**
* A contract for {@code "name!=value"} style expression used to specify request
* parameters and request header in HTTP request
*
- * The some source code is scratched from org.springframework.web.servlet.mvc.condition.NameValueExpression
+ * The some source code is scratched from
+ * org.springframework.web.servlet.mvc.condition.NameValueExpression
*
* @param the value type
* @author Rossen Stoyanchev
@@ -29,10 +29,10 @@ package com.alibaba.cloud.dubbo.http.matcher;
*/
interface NameValueExpression {
- String getName();
+ String getName();
- T getValue();
+ T getValue();
- boolean isNegated();
+ boolean isNegated();
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/ParamExpression.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/ParamExpression.java
index 8d14cd7ba..555d1d577 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/ParamExpression.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/ParamExpression.java
@@ -16,16 +16,17 @@
*/
package com.alibaba.cloud.dubbo.http.matcher;
+import static com.alibaba.cloud.dubbo.http.util.HttpUtils.getParameters;
+
import org.springframework.http.HttpRequest;
import org.springframework.util.MultiValueMap;
import org.springframework.util.ObjectUtils;
-import static com.alibaba.cloud.dubbo.http.util.HttpUtils.getParameters;
-
/**
* Parses and matches a single param expression to a request.
*
- * The some source code is scratched from org.springframework.web.servlet.mvc.condition.ParamsRequestCondition.ParamExpression
+ * The some source code is scratched from
+ * org.springframework.web.servlet.mvc.condition.ParamsRequestCondition.ParamExpression
*
* @author Arjen Poutsma
* @author Rossen Stoyanchev
@@ -33,30 +34,30 @@ import static com.alibaba.cloud.dubbo.http.util.HttpUtils.getParameters;
*/
class ParamExpression extends AbstractNameValueExpression {
- ParamExpression(String expression) {
- super(expression);
- }
-
- @Override
- protected boolean isCaseSensitiveName() {
- return true;
- }
-
- @Override
- protected String parseValue(String valueExpression) {
- return valueExpression;
- }
-
- @Override
- protected boolean matchName(HttpRequest request) {
- MultiValueMap parametersMap = getParameters(request);
- return parametersMap.containsKey(this.name);
- }
-
- @Override
- protected boolean matchValue(HttpRequest request) {
- MultiValueMap parametersMap = getParameters(request);
- String parameterValue = parametersMap.getFirst(this.name);
- return ObjectUtils.nullSafeEquals(this.value, parameterValue);
- }
+ ParamExpression(String expression) {
+ super(expression);
+ }
+
+ @Override
+ protected boolean isCaseSensitiveName() {
+ return true;
+ }
+
+ @Override
+ protected String parseValue(String valueExpression) {
+ return valueExpression;
+ }
+
+ @Override
+ protected boolean matchName(HttpRequest request) {
+ MultiValueMap parametersMap = getParameters(request);
+ return parametersMap.containsKey(this.name);
+ }
+
+ @Override
+ protected boolean matchValue(HttpRequest request) {
+ MultiValueMap parametersMap = getParameters(request);
+ String parameterValue = parametersMap.getFirst(this.name);
+ return ObjectUtils.nullSafeEquals(this.value, parameterValue);
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/ProduceMediaTypeExpression.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/ProduceMediaTypeExpression.java
index d9830695b..7b9cfe3fc 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/ProduceMediaTypeExpression.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/ProduceMediaTypeExpression.java
@@ -16,10 +16,10 @@
*/
package com.alibaba.cloud.dubbo.http.matcher;
-import org.springframework.http.MediaType;
-
import java.util.List;
+import org.springframework.http.MediaType;
+
/**
* Parses and matches a single media type expression to a request's 'Accept' header.
*
@@ -31,25 +31,25 @@ import java.util.List;
*/
class ProduceMediaTypeExpression extends AbstractMediaTypeExpression {
- ProduceMediaTypeExpression(String expression) {
- super(expression);
- }
+ ProduceMediaTypeExpression(String expression) {
+ super(expression);
+ }
- ProduceMediaTypeExpression(MediaType mediaType, boolean negated) {
- super(mediaType, negated);
- }
+ ProduceMediaTypeExpression(MediaType mediaType, boolean negated) {
+ super(mediaType, negated);
+ }
- public final boolean match(List acceptedMediaTypes) {
- boolean match = matchMediaType(acceptedMediaTypes);
- return (!isNegated() ? match : !match);
- }
+ public final boolean match(List acceptedMediaTypes) {
+ boolean match = matchMediaType(acceptedMediaTypes);
+ return (!isNegated() ? match : !match);
+ }
- private boolean matchMediaType(List acceptedMediaTypes) {
- for (MediaType acceptedMediaType : acceptedMediaTypes) {
- if (getMediaType().isCompatibleWith(acceptedMediaType)) {
- return true;
- }
- }
- return false;
- }
+ private boolean matchMediaType(List acceptedMediaTypes) {
+ for (MediaType acceptedMediaType : acceptedMediaTypes) {
+ if (getMediaType().isCompatibleWith(acceptedMediaType)) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/RequestMetadataMatcher.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/RequestMetadataMatcher.java
index 1f1b5b8e3..0385bd34b 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/RequestMetadataMatcher.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/matcher/RequestMetadataMatcher.java
@@ -16,10 +16,10 @@
*/
package com.alibaba.cloud.dubbo.http.matcher;
-import com.alibaba.cloud.dubbo.metadata.RequestMetadata;
-
import static com.alibaba.cloud.dubbo.http.util.HttpUtils.toNameAndValues;
+import com.alibaba.cloud.dubbo.metadata.RequestMetadata;
+
/**
* {@link RequestMetadata} {@link HttpRequestMatcher} implementation
*
@@ -27,20 +27,21 @@ import static com.alibaba.cloud.dubbo.http.util.HttpUtils.toNameAndValues;
*/
public class RequestMetadataMatcher extends CompositeHttpRequestMatcher {
- public RequestMetadataMatcher(RequestMetadata metadata) {
- super(
- // method
- new HttpRequestMethodsMatcher(metadata.getMethod()),
- // url
- new HttpRequestPathMatcher(metadata.getPath()),
- // params
- new HttpRequestParamsMatcher(toNameAndValues(metadata.getParams())),
- // headers
- new HttpRequestHeadersMatcher(toNameAndValues(metadata.getHeaders())),
- // consumes
- new HttpRequestConsumersMatcher(metadata.getConsumes().toArray(new String[0])),
- // produces
- new HttpRequestProducesMatcher(metadata.getProduces().toArray(new String[0]))
- );
- }
+ public RequestMetadataMatcher(RequestMetadata metadata) {
+ super(
+ // method
+ new HttpRequestMethodsMatcher(metadata.getMethod()),
+ // url
+ new HttpRequestPathMatcher(metadata.getPath()),
+ // params
+ new HttpRequestParamsMatcher(toNameAndValues(metadata.getParams())),
+ // headers
+ new HttpRequestHeadersMatcher(toNameAndValues(metadata.getHeaders())),
+ // consumes
+ new HttpRequestConsumersMatcher(
+ metadata.getConsumes().toArray(new String[0])),
+ // produces
+ new HttpRequestProducesMatcher(
+ metadata.getProduces().toArray(new String[0])));
+ }
}
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/util/HttpMessageConverterResolver.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/util/HttpMessageConverterResolver.java
index a5488f625..e27b0df60 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/util/HttpMessageConverterResolver.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/http/util/HttpMessageConverterResolver.java
@@ -16,9 +16,14 @@
*/
package com.alibaba.cloud.dubbo.http.util;
-import com.alibaba.cloud.dubbo.http.converter.HttpMessageConverterHolder;
-import com.alibaba.cloud.dubbo.metadata.RequestMetadata;
-import com.alibaba.cloud.dubbo.metadata.RestMethodMetadata;
+import static java.util.Collections.unmodifiableList;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
@@ -30,13 +35,9 @@ import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.util.ClassUtils;
import org.springframework.util.CollectionUtils;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-import static java.util.Collections.unmodifiableList;
+import com.alibaba.cloud.dubbo.http.converter.HttpMessageConverterHolder;
+import com.alibaba.cloud.dubbo.metadata.RequestMetadata;
+import com.alibaba.cloud.dubbo.metadata.RestMethodMetadata;
/**
* {@link HttpMessageConverter} Resolver
@@ -45,184 +46,202 @@ import static java.util.Collections.unmodifiableList;
*/
public class HttpMessageConverterResolver {
- private static final MediaType MEDIA_TYPE_APPLICATION = new MediaType("application");
-
- private final List> messageConverters;
-
- private final List allSupportedMediaTypes;
-
- private final ClassLoader classLoader;
-
- public HttpMessageConverterResolver(List> messageConverters, ClassLoader classLoader) {
- this.messageConverters = messageConverters;
- this.allSupportedMediaTypes = getAllSupportedMediaTypes(messageConverters);
- this.classLoader = classLoader;
- }
-
- public HttpMessageConverterHolder resolve(HttpRequest request, Class> parameterType) {
-
- HttpMessageConverterHolder httpMessageConverterHolder = null;
-
- HttpHeaders httpHeaders = request.getHeaders();
-
- MediaType contentType = httpHeaders.getContentType();
-
- if (contentType == null) {
- contentType = MediaType.APPLICATION_OCTET_STREAM;
- }
-
- for (HttpMessageConverter> converter : this.messageConverters) {
- if (converter instanceof GenericHttpMessageConverter) {
- GenericHttpMessageConverter genericConverter = (GenericHttpMessageConverter) converter;
- if (genericConverter.canRead(parameterType, parameterType, contentType)) {
- httpMessageConverterHolder = new HttpMessageConverterHolder(contentType, converter);
- break;
- }
- } else {
- if (converter.canRead(parameterType, contentType)) {
- httpMessageConverterHolder = new HttpMessageConverterHolder(contentType, converter);
- break;
- }
- }
-
- }
-
- return httpMessageConverterHolder;
- }
-
- /**
- * Resolve the most match {@link HttpMessageConverter} from {@link RequestMetadata}
- *
- * @param requestMetadata {@link RequestMetadata}
- * @param restMethodMetadata {@link RestMethodMetadata}
- * @return
- */
- public HttpMessageConverterHolder resolve(RequestMetadata requestMetadata, RestMethodMetadata
- restMethodMetadata) {
-
- HttpMessageConverterHolder httpMessageConverterHolder = null;
-
- Class> returnValueClass = resolveReturnValueClass(restMethodMetadata);
-
- /**
- * @see AbstractMessageConverterMethodProcessor#writeWithMessageConverters(Object, MethodParameter, ServletServerHttpRequest, ServletServerHttpResponse)
- */
- List requestedMediaTypes = getAcceptableMediaTypes(requestMetadata);
- List producibleMediaTypes = getProducibleMediaTypes(restMethodMetadata, returnValueClass);
-
- Set compatibleMediaTypes = new LinkedHashSet();
- for (MediaType requestedType : requestedMediaTypes) {
- for (MediaType producibleType : producibleMediaTypes) {
- if (requestedType.isCompatibleWith(producibleType)) {
- compatibleMediaTypes.add(getMostSpecificMediaType(requestedType, producibleType));
- }
- }
- }
-
- if (compatibleMediaTypes.isEmpty()) {
- return httpMessageConverterHolder;
- }
-
- List mediaTypes = new ArrayList<>(compatibleMediaTypes);
-
- MediaType.sortBySpecificityAndQuality(mediaTypes);
-
- MediaType selectedMediaType = null;
- for (MediaType mediaType : mediaTypes) {
- if (mediaType.isConcrete()) {
- selectedMediaType = mediaType;
- break;
- } else if (mediaType.equals(MediaType.ALL) || mediaType.equals(MEDIA_TYPE_APPLICATION)) {
- selectedMediaType = MediaType.APPLICATION_OCTET_STREAM;
- break;
- }
- }
-
- if (selectedMediaType != null) {
- selectedMediaType = selectedMediaType.removeQualityValue();
- for (HttpMessageConverter> messageConverter : this.messageConverters) {
- if (messageConverter.canWrite(returnValueClass, selectedMediaType)) {
- httpMessageConverterHolder = new HttpMessageConverterHolder(selectedMediaType, messageConverter);
- break;
- }
- }
- }
-
- return httpMessageConverterHolder;
- }
-
- public List getAllSupportedMediaTypes() {
- return unmodifiableList(allSupportedMediaTypes);
- }
-
- private Class> resolveReturnValueClass(RestMethodMetadata restMethodMetadata) {
- String returnClassName = restMethodMetadata.getMethod().getReturnType();
- return ClassUtils.resolveClassName(returnClassName, classLoader);
- }
-
- /**
- * Resolve the {@link MediaType media-types}
- *
- * @param requestMetadata {@link RequestMetadata} from client side
- * @return non-null {@link List}
- */
- private List getAcceptableMediaTypes(RequestMetadata requestMetadata) {
- return requestMetadata.getProduceMediaTypes();
- }
-
- /**
- * Returns
- * the media types that can be produced: The producible media types specified in the request mappings, or
- * Media types of configured converters that can write the specific return value, or {@link MediaType#ALL}
- *
- *
- * @param restMethodMetadata {@link RestMethodMetadata} from server side
- * @param returnValueClass the class of return value
- * @return non-null {@link List}
- */
- private List getProducibleMediaTypes(RestMethodMetadata restMethodMetadata, Class>
- returnValueClass) {
- RequestMetadata serverRequestMetadata = restMethodMetadata.getRequest();
- List mediaTypes = serverRequestMetadata.getProduceMediaTypes();
- if (!CollectionUtils.isEmpty(mediaTypes)) { // Empty
- return mediaTypes;
- } else if (!this.allSupportedMediaTypes.isEmpty()) {
- List result = new ArrayList<>();
- for (HttpMessageConverter> converter : this.messageConverters) {
- if (converter.canWrite(returnValueClass, null)) {
- result.addAll(converter.getSupportedMediaTypes());
- }
- }
- return result;
- } else {
- return Collections.singletonList(MediaType.ALL);
- }
- }
-
- /**
- * Return the media types
- * supported by all provided message converters sorted by specificity via {@link
- * MediaType#sortBySpecificity(List)}.
- *
- * @param messageConverters
- * @return
- */
- private List getAllSupportedMediaTypes(List> messageConverters) {
- Set