1
0
mirror of https://gitee.com/mirrors/Spring-Cloud-Alibaba.git synced 2021-06-26 13:25:11 +08:00

do some enhancements about dubbo spring cloud

This commit is contained in:
fangjian0423 2019-11-04 00:10:31 +08:00
parent a939bb3047
commit 82ee081ae6
4 changed files with 58 additions and 11 deletions

View File

@ -19,6 +19,7 @@ import java.util.Collection;
import java.util.Optional; import java.util.Optional;
import java.util.function.Supplier; 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.DubboProtocolConfigSupplier;
import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
import com.alibaba.cloud.dubbo.metadata.repository.MetadataServiceInstanceSelector; import com.alibaba.cloud.dubbo.metadata.repository.MetadataServiceInstanceSelector;
@ -65,6 +66,9 @@ public class DubboMetadataAutoConfiguration {
@Autowired @Autowired
private DubboMetadataServiceExporter dubboMetadataConfigServiceExporter; private DubboMetadataServiceExporter dubboMetadataConfigServiceExporter;
@Autowired
private DubboCloudProperties dubboCloudProperties;
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public MetadataResolver metadataJsonResolver(ObjectProvider<Contract> contract) { public MetadataResolver metadataJsonResolver(ObjectProvider<Contract> contract) {
@ -89,7 +93,7 @@ public class DubboMetadataAutoConfiguration {
@ConditionalOnMissingBean @ConditionalOnMissingBean
public DubboMetadataServiceProxy dubboMetadataConfigServiceProxy( public DubboMetadataServiceProxy dubboMetadataConfigServiceProxy(
DubboGenericServiceFactory factory) { DubboGenericServiceFactory factory) {
return new DubboMetadataServiceProxy(factory); return new DubboMetadataServiceProxy(factory, dubboCloudProperties);
} }
// Event-Handling // Event-Handling

View File

@ -46,6 +46,18 @@ public class DubboCloudProperties {
*/ */
private String subscribedServices = ALL_DUBBO_SERVICES; 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() { public String getSubscribedServices() {
return subscribedServices; return subscribedServices;
} }
@ -54,6 +66,22 @@ public class DubboCloudProperties {
this.subscribedServices = subscribedServices; 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. * Get the subscribed services as a {@link Set} with configuration order.
* *

View File

@ -19,6 +19,8 @@ import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.stream.Stream; import java.util.stream.Stream;
import com.alibaba.cloud.dubbo.env.DubboCloudProperties;
import org.apache.dubbo.rpc.service.GenericService; import org.apache.dubbo.rpc.service.GenericService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -34,8 +36,12 @@ class DubboMetadataServiceInvocationHandler implements InvocationHandler {
private final GenericService genericService; private final GenericService genericService;
private final DubboCloudProperties dubboCloudProperties;
DubboMetadataServiceInvocationHandler(String serviceName, String version, DubboMetadataServiceInvocationHandler(String serviceName, String version,
DubboGenericServiceFactory dubboGenericServiceFactory) { DubboGenericServiceFactory dubboGenericServiceFactory,
DubboCloudProperties dubboCloudProperties) {
this.dubboCloudProperties = dubboCloudProperties;
this.genericService = dubboGenericServiceFactory.create(serviceName, this.genericService = dubboGenericServiceFactory.create(serviceName,
DubboMetadataService.class, version); DubboMetadataService.class, version);
} }
@ -43,13 +49,16 @@ class DubboMetadataServiceInvocationHandler implements InvocationHandler {
@Override @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnValue = null; Object returnValue = null;
try { for (int i = 1; i <= dubboCloudProperties.getRetryCount(); i++) {
returnValue = genericService.$invoke(method.getName(), try {
getParameterTypes(method), args); returnValue = genericService.$invoke(method.getName(),
} getParameterTypes(method), args);
catch (Throwable e) { }
if (logger.isErrorEnabled()) { catch (Throwable e) {
logger.error(e.getMessage(), e); if (logger.isErrorEnabled()) {
logger.error("[failed " + i + " times] " + e.getMessage(), e);
}
Thread.sleep(dubboCloudProperties.getInterval() * i);
} }
} }
return returnValue; return returnValue;

View File

@ -18,6 +18,8 @@ package com.alibaba.cloud.dubbo.service;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import com.alibaba.cloud.dubbo.env.DubboCloudProperties;
import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.DisposableBean;
@ -32,13 +34,17 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab
private final DubboGenericServiceFactory dubboGenericServiceFactory; private final DubboGenericServiceFactory dubboGenericServiceFactory;
private final DubboCloudProperties dubboCloudProperties;
private final Map<String, DubboMetadataService> dubboMetadataServiceCache = new ConcurrentHashMap<>(); private final Map<String, DubboMetadataService> dubboMetadataServiceCache = new ConcurrentHashMap<>();
private ClassLoader classLoader; private ClassLoader classLoader;
public DubboMetadataServiceProxy( public DubboMetadataServiceProxy(
DubboGenericServiceFactory dubboGenericServiceFactory) { DubboGenericServiceFactory dubboGenericServiceFactory,
DubboCloudProperties dubboCloudProperties) {
this.dubboGenericServiceFactory = dubboGenericServiceFactory; this.dubboGenericServiceFactory = dubboGenericServiceFactory;
this.dubboCloudProperties = dubboCloudProperties;
} }
/** /**
@ -91,7 +97,7 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab
return (DubboMetadataService) newProxyInstance(classLoader, return (DubboMetadataService) newProxyInstance(classLoader,
new Class[] { DubboMetadataService.class }, new Class[] { DubboMetadataService.class },
new DubboMetadataServiceInvocationHandler(serviceName, version, new DubboMetadataServiceInvocationHandler(serviceName, version,
dubboGenericServiceFactory)); dubboGenericServiceFactory, dubboCloudProperties));
} }
} }