dubbo spring cloud dynamic service discovery

pull/813/head
fangjian0423 6 years ago
parent 26a05fad61
commit 9ae8082d06

@ -43,7 +43,6 @@ import java.util.stream.Stream;
import javax.annotation.PostConstruct;
import org.apache.dubbo.common.URL;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.SmartInitializingSingleton;
@ -70,6 +69,7 @@ import com.alibaba.cloud.dubbo.service.DubboMetadataService;
import com.alibaba.cloud.dubbo.service.DubboMetadataServiceExporter;
import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy;
import com.alibaba.cloud.dubbo.util.JSONUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
@ -291,6 +291,16 @@ public class DubboServiceMetadataRepository
}
}
/**
* Remove the metadata of Dubbo Services if no there is no service instance
* @param serviceName the service name
*/
public void removeInitializedService(String serviceName) {
synchronized (monitor) {
initializedServices.remove(serviceName);
}
}
/**
* Get the metadata {@link Map} of {@link DubboMetadataService}
*
@ -565,7 +575,7 @@ public class DubboServiceMetadataRepository
if (object == null) {
if (logger.isWarnEnabled()) {
logger.warn(
"DubboServiceMetadata can't be found in the Spring application [%s] and %s",
"DubboServiceMetadata can't be found in the Spring application [{}] and {}",
serviceName, requestMetadata);
}
}
@ -640,6 +650,10 @@ public class DubboServiceMetadataRepository
dubboMetadataConfigServiceProxy.initProxy(serviceName, version);
}
public void removeServiceMetadata(String serviceName) {
dubboRestServiceMetadataRepository.remove(serviceName);
}
@Override
public void setApplicationEventPublisher(
ApplicationEventPublisher applicationEventPublisher) {

@ -40,7 +40,6 @@ import org.apache.dubbo.common.URL;
import org.apache.dubbo.registry.NotifyListener;
import org.apache.dubbo.registry.RegistryFactory;
import org.apache.dubbo.registry.support.FailbackRegistry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.client.ServiceInstance;
@ -215,6 +214,33 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry {
generateId(url), serviceName);
}
List<URL> allSubscribedURLs = new LinkedList<>();
Collection<ServiceInstance> serviceInstances = serviceInstancesFunction
.apply(serviceName);
if (CollectionUtils.isEmpty(serviceInstances)) {
dubboMetadataConfigServiceProxy.removeProxy(serviceName);
repository.removeInitializedService(serviceName);
repository.removeServiceMetadata(serviceName);
if (logger.isWarnEnabled()) {
logger.warn(
"There is no instance from service[name : {}], and then Dubbo Service[key : {}] will not be "
+ "available , please make sure the further impact",
serviceName, url.getServiceKey());
}
/**
* URLs with {@link RegistryConstants#EMPTY_PROTOCOL}
*/
allSubscribedURLs.addAll(emptyURLs(url));
if (logger.isDebugEnabled()) {
logger.debug("The subscribed URL[{}] will notify all URLs : {}", url,
allSubscribedURLs);
}
listener.notify(allSubscribedURLs);
return;
}
DubboMetadataService dubboMetadataService = dubboMetadataConfigServiceProxy
.getProxy(serviceName);
@ -239,32 +265,13 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry {
return;
}
Collection<ServiceInstance> serviceInstances = serviceInstancesFunction
.apply(serviceName);
List<URL> allSubscribedURLs = new LinkedList<>();
if (CollectionUtils.isEmpty(serviceInstances)) {
if (logger.isWarnEnabled()) {
logger.warn(
"There is no instance from service[name : {}], and then Dubbo Service[key : {}] will not be "
+ "available , please make sure the further impact",
serviceName, url.getServiceKey());
}
/**
* URLs with {@link RegistryConstants#EMPTY_PROTOCOL}
*/
allSubscribedURLs.addAll(emptyURLs(url));
}
else {
List<URL> exportedURLs = getExportedURLs(dubboMetadataService, url);
for (URL exportedURL : exportedURLs) {
String protocol = exportedURL.getProtocol();
List<URL> subscribedURLs = new LinkedList<>();
serviceInstances.forEach(serviceInstance -> {
Integer port = repository.getDubboProtocolPort(serviceInstance,
protocol);
Integer port = repository.getDubboProtocolPort(serviceInstance, protocol);
String host = serviceInstance.getHost();
if (port == null) {
if (logger.isWarnEnabled()) {
@ -283,7 +290,6 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry {
allSubscribedURLs.addAll(subscribedURLs);
}
}
if (logger.isDebugEnabled()) {
logger.debug("The subscribed URL[{}] will notify all URLs : {}", url,

@ -52,6 +52,14 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab
name -> newProxy(name, version));
}
/**
* Remove {@link DubboMetadataService}'s Proxy by service name
* @param serviceName the service name
*/
public void removeProxy(String serviceName) {
dubboMetadataServiceCache.remove(serviceName);
}
/**
* Get a proxy instance of {@link DubboMetadataService} via the specified service name
*

Loading…
Cancel
Save