From 82ee081ae670887b38c5811d5c43d9a937d95f21 Mon Sep 17 00:00:00 2001 From: fangjian0423 Date: Mon, 4 Nov 2019 00:10:31 +0800 Subject: [PATCH] do some enhancements about dubbo spring cloud --- .../DubboMetadataAutoConfiguration.java | 6 +++- .../cloud/dubbo/env/DubboCloudProperties.java | 28 +++++++++++++++++++ ...DubboMetadataServiceInvocationHandler.java | 25 +++++++++++------ .../service/DubboMetadataServiceProxy.java | 10 +++++-- 4 files changed, 58 insertions(+), 11 deletions(-) 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 0ebbbdf3..d3aaa4c5 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 @@ -19,6 +19,7 @@ import java.util.Collection; import java.util.Optional; import java.util.function.Supplier; +import com.alibaba.cloud.dubbo.env.DubboCloudProperties; import com.alibaba.cloud.dubbo.metadata.DubboProtocolConfigSupplier; import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; import com.alibaba.cloud.dubbo.metadata.repository.MetadataServiceInstanceSelector; @@ -65,6 +66,9 @@ public class DubboMetadataAutoConfiguration { @Autowired private DubboMetadataServiceExporter dubboMetadataConfigServiceExporter; + @Autowired + private DubboCloudProperties dubboCloudProperties; + @Bean @ConditionalOnMissingBean public MetadataResolver metadataJsonResolver(ObjectProvider contract) { @@ -89,7 +93,7 @@ public class DubboMetadataAutoConfiguration { @ConditionalOnMissingBean public DubboMetadataServiceProxy dubboMetadataConfigServiceProxy( DubboGenericServiceFactory factory) { - return new DubboMetadataServiceProxy(factory); + return new DubboMetadataServiceProxy(factory, dubboCloudProperties); } // Event-Handling 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 c93a656a..4c39084d 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 @@ -46,6 +46,18 @@ public class DubboCloudProperties { */ private String subscribedServices = ALL_DUBBO_SERVICES; + /** + * The Service Instance changed do not means Dubbo service ready, need retry + * mechanism. Retry count of Generic Invoke. + */ + private int retryCount = 5; + + /** + * The Service Instance changed do not means Dubbo service ready, need retry + * mechanism. Retry interval of Generic Invoke, milliseconds unit. + */ + private int interval = 10000; + public String getSubscribedServices() { return subscribedServices; } @@ -54,6 +66,22 @@ public class DubboCloudProperties { this.subscribedServices = subscribedServices; } + public int getRetryCount() { + return retryCount; + } + + public void setRetryCount(int retryCount) { + this.retryCount = retryCount; + } + + public int getInterval() { + return interval; + } + + public void setInterval(int interval) { + this.interval = interval; + } + /** * Get the subscribed services as a {@link Set} with configuration order. * diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceInvocationHandler.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceInvocationHandler.java index d9bc957e..f908e8f7 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceInvocationHandler.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceInvocationHandler.java @@ -19,6 +19,8 @@ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.stream.Stream; +import com.alibaba.cloud.dubbo.env.DubboCloudProperties; + import org.apache.dubbo.rpc.service.GenericService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,8 +36,12 @@ class DubboMetadataServiceInvocationHandler implements InvocationHandler { private final GenericService genericService; + private final DubboCloudProperties dubboCloudProperties; + DubboMetadataServiceInvocationHandler(String serviceName, String version, - DubboGenericServiceFactory dubboGenericServiceFactory) { + DubboGenericServiceFactory dubboGenericServiceFactory, + DubboCloudProperties dubboCloudProperties) { + this.dubboCloudProperties = dubboCloudProperties; this.genericService = dubboGenericServiceFactory.create(serviceName, DubboMetadataService.class, version); } @@ -43,13 +49,16 @@ class DubboMetadataServiceInvocationHandler implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object returnValue = null; - try { - returnValue = genericService.$invoke(method.getName(), - getParameterTypes(method), args); - } - catch (Throwable e) { - if (logger.isErrorEnabled()) { - logger.error(e.getMessage(), e); + for (int i = 1; i <= dubboCloudProperties.getRetryCount(); i++) { + try { + returnValue = genericService.$invoke(method.getName(), + getParameterTypes(method), args); + } + catch (Throwable e) { + if (logger.isErrorEnabled()) { + logger.error("[failed " + i + " times] " + e.getMessage(), e); + } + Thread.sleep(dubboCloudProperties.getInterval() * i); } } return returnValue; diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java index fbe283f2..5a86b9d9 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java @@ -18,6 +18,8 @@ package com.alibaba.cloud.dubbo.service; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import com.alibaba.cloud.dubbo.env.DubboCloudProperties; + import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.DisposableBean; @@ -32,13 +34,17 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab private final DubboGenericServiceFactory dubboGenericServiceFactory; + private final DubboCloudProperties dubboCloudProperties; + private final Map dubboMetadataServiceCache = new ConcurrentHashMap<>(); private ClassLoader classLoader; public DubboMetadataServiceProxy( - DubboGenericServiceFactory dubboGenericServiceFactory) { + DubboGenericServiceFactory dubboGenericServiceFactory, + DubboCloudProperties dubboCloudProperties) { this.dubboGenericServiceFactory = dubboGenericServiceFactory; + this.dubboCloudProperties = dubboCloudProperties; } /** @@ -91,7 +97,7 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab return (DubboMetadataService) newProxyInstance(classLoader, new Class[] { DubboMetadataService.class }, new DubboMetadataServiceInvocationHandler(serviceName, version, - dubboGenericServiceFactory)); + dubboGenericServiceFactory, dubboCloudProperties)); } }