diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/DubboMetadataEndpointAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/DubboMetadataEndpointAutoConfiguration.java index 2e2a13c1..5640f241 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/DubboMetadataEndpointAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/DubboMetadataEndpointAutoConfiguration.java @@ -32,7 +32,8 @@ import org.springframework.context.annotation.PropertySource; * * @author Mercy */ -@ConditionalOnClass(name = "org.springframework.boot.actuate.endpoint.annotation.Endpoint") +@ConditionalOnClass( + name = "org.springframework.boot.actuate.endpoint.annotation.Endpoint") @PropertySource("classpath:/META-INF/dubbo/default/actuator-endpoints.properties") @Configuration(proxyBeanMethods = false) public class DubboMetadataEndpointAutoConfiguration { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboDiscoveryEndpoint.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboDiscoveryEndpoint.java index 68bbcc20..2333e27c 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboDiscoveryEndpoint.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboDiscoveryEndpoint.java @@ -16,6 +16,7 @@ package com.alibaba.cloud.dubbo.actuate.endpoint; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -38,7 +39,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; /** - * Dubbo Rest Metadata {@link Endpoint}. + * Dubbo Registry Directory Metadata {@link DubboCloudRegistry}. * * @author Theonefx */ @@ -55,23 +56,36 @@ public class DubboDiscoveryEndpoint { return Collections.emptyMap(); } - Map> map = registry.getSubscribed(); + Map> subscribeMap = registry.getSubscribed(); - Map> result = new HashMap<>(); - map.forEach((url, listeners) -> { + Map>> result = new HashMap<>(); + subscribeMap.forEach((url, listeners) -> { String side = url.getParameter(SIDE_KEY); if (!CONSUMER_SIDE.equals(side)) { return; } - List list = listeners.stream() - .filter(l -> l instanceof RegistryDirectory) - .map(l -> (RegistryDirectory) l) - .map(RegistryDirectory::getAllInvokers).flatMap(List::stream) - .map(Invoker::getUrl).map(URL::toServiceString).distinct().sorted() - .collect(Collectors.toList()); + List> pairs = result.computeIfAbsent(url.getServiceKey(), + o -> new ArrayList<>()); - result.put(url.getServiceKey(), list); + Map pair = new HashMap<>(); + List invokerServices = new ArrayList<>(); + for (NotifyListener listener : listeners) { + if (!(listener instanceof RegistryDirectory)) { + continue; + } + RegistryDirectory directory = (RegistryDirectory) listener; + List> invokers = directory.getAllInvokers(); + if (invokers == null) { + continue; + } + invokerServices.addAll(invokers.stream().map(Invoker::getUrl) + .map(URL::toServiceString).collect(Collectors.toList())); + } + pair.put("invokers", invokerServices); + pair.put("subscribeUrl", url.toMap()); + + pairs.add(pair); }); return result; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java index be24b11f..2101a217 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java @@ -44,6 +44,8 @@ import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; import org.springframework.util.CollectionUtils; import static java.lang.String.format; @@ -184,16 +186,30 @@ public class DubboCloudRegistry extends FailbackRegistry { subscribeURLs(url, getServices(url), listener); // Async subscription - registerServiceInstancesChangedListener(url, event -> { + registerServiceInstancesChangedListener(url, - Set serviceNames = getServices(url); + new ApplicationListener() { - String serviceName = event.getServiceName(); + private final URL url2subscribe = url; - if (serviceNames.contains(serviceName)) { - subscribeURLs(url, serviceNames, listener); - } - }); + @Override + @Order + public void onApplicationEvent(ServiceInstancesChangedEvent event) { + Set serviceNames = getServices(url); + + String serviceName = event.getServiceName(); + + if (serviceNames.contains(serviceName)) { + subscribeURLs(url, serviceNames, listener); + } + } + + @Override + public String toString() { + return "ServiceInstancesChangedEventListener:" + + url.getServiceKey(); + } + }); } private void subscribeURLs(URL url, Set serviceNames, @@ -375,12 +391,12 @@ public class DubboCloudRegistry extends FailbackRegistry { // Add the EMPTY_PROTOCOL URL subscribedURLs.add(emptyURL(url)); - if (isDubboMetadataServiceURL(url)) { - // if meta service change, and serviceInstances is zero, will clean up - // information about this client - String serviceName = url.getParameter(GROUP_KEY); - repository.removeMetadataAndInitializedService(serviceName, url); - } + // if (isDubboMetadataServiceURL(url)) { + // if meta service change, and serviceInstances is zero, will clean up + // information about this client + // String serviceName = url.getParameter(GROUP_KEY); + // repository.removeMetadataAndInitializedService(serviceName, url); + // } } if (logger.isDebugEnabled()) { @@ -415,7 +431,7 @@ public class DubboCloudRegistry extends FailbackRegistry { } private String generateId(URL url) { - return url.getServiceKey(); + return url.toString(); } private URL emptyURL(URL url) { @@ -450,16 +466,30 @@ public class DubboCloudRegistry extends FailbackRegistry { // Sync subscription if (containsProviderCategory(subscribedURL)) { - registerServiceInstancesChangedListener(subscribedURL, event -> { + registerServiceInstancesChangedListener(subscribedURL, + new ApplicationListener() { - String sourceServiceName = event.getServiceName(); - String serviceName = getServiceName(subscribedURL); + private final URL url2subscribe = subscribedURL; - if (Objects.equals(sourceServiceName, serviceName)) { - subscribeDubboMetadataServiceURLs(subscribedURL, listener, - sourceServiceName); - } - }); + @Override + @Order(Ordered.LOWEST_PRECEDENCE - 1) + public void onApplicationEvent( + ServiceInstancesChangedEvent event) { + String sourceServiceName = event.getServiceName(); + String serviceName = getServiceName(subscribedURL); + + if (Objects.equals(sourceServiceName, serviceName)) { + subscribeDubboMetadataServiceURLs(subscribedURL, listener, + sourceServiceName); + } + } + + @Override + public String toString() { + return "ServiceInstancesChangedEventListener:" + + subscribedURL.getServiceKey(); + } + }); } }