From aef27e885e99ac32d71e3f3668d1c01cb60a99a8 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Wed, 17 Apr 2019 11:32:23 +0800 Subject: [PATCH] Polish spring-cloud-incubator/spring-cloud-alibaba#559 : Refactor and filter protocol --- .../DubboServiceMetadataRepository.java | 4 ++-- .../registry/AbstractSpringCloudRegistry.java | 23 ++++++++++++++----- .../dubbo/service/DubboMetadataService.java | 6 ++--- ...DubboMetadataServiceInvocationHandler.java | 22 ++++++++++-------- .../IntrospectiveDubboMetadataService.java | 4 ++-- 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/metadata/repository/DubboServiceMetadataRepository.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/metadata/repository/DubboServiceMetadataRepository.java index 3965ece0..cf32659e 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/metadata/repository/DubboServiceMetadataRepository.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/metadata/repository/DubboServiceMetadataRepository.java @@ -322,8 +322,8 @@ public class DubboServiceMetadataRepository { return hasText(protocolPort) ? Integer.valueOf(protocolPort) : null; } - public List getExportedURLs(String serviceInstance, String group, String version) { - String serviceKey = URL.buildKey(serviceInstance, group, version); + public List getExportedURLs(String serviceInterface, String group, String version) { + String serviceKey = URL.buildKey(serviceInterface, group, version); return allExportedURLs.getOrDefault(serviceKey, Collections.emptyList()); } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/AbstractSpringCloudRegistry.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/AbstractSpringCloudRegistry.java index d2842bcc..06855d02 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/AbstractSpringCloudRegistry.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/AbstractSpringCloudRegistry.java @@ -172,15 +172,11 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { .map(dubboMetadataConfigServiceProxy::getProxy) .filter(Objects::nonNull) .forEach(dubboMetadataService -> { - String serviceInterface = url.getServiceInterface(); - String group = url.getParameter(GROUP_KEY); - String version = url.getParameter(VERSION_KEY); - String exportedURLsJSON = dubboMetadataService.getExportedURLs(serviceInterface, group, version); - List exportedURLs = jsonUtils.toURLs(exportedURLsJSON); + List exportedURLs = getExportedURLs(dubboMetadataService, url); List allSubscribedURLs = new LinkedList<>(); for (URL exportedURL : exportedURLs) { String serviceName = exportedURL.getParameter(APPLICATION_KEY); - List serviceInstances = discoveryClient.getInstances(serviceName); + List serviceInstances = getServiceInstances(serviceName); String protocol = exportedURL.getProtocol(); List subscribedURLs = new LinkedList<>(); serviceInstances.forEach(serviceInstance -> { @@ -209,6 +205,21 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { }); } + private List getExportedURLs(DubboMetadataService dubboMetadataService, URL url) { + String serviceInterface = url.getServiceInterface(); + String group = url.getParameter(GROUP_KEY); + String version = url.getParameter(VERSION_KEY); + // The subscribed protocol may be null + String subscribedProtocol = url.getParameter(PROTOCOL_KEY); + String exportedURLsJSON = dubboMetadataService.getExportedURLs(serviceInterface, group, version); + return jsonUtils + .toURLs(exportedURLsJSON) + .stream() + .filter(exportedURL -> + subscribedProtocol == null || subscribedProtocol.equalsIgnoreCase(exportedURL.getProtocol()) + ).collect(Collectors.toList()); + } + private void subscribeDubboMetadataServiceURLs(URL url, NotifyListener listener) { String serviceInterface = url.getServiceInterface(); diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/DubboMetadataService.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/DubboMetadataService.java index fd99e2c4..131a0c1a 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/DubboMetadataService.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/DubboMetadataService.java @@ -64,13 +64,13 @@ public interface DubboMetadataService { Map getAllExportedURLs(); /** - * Get the json content of an exported List of {@link URL URLs} by the serviceInstance , group and version + * Get the json content of an exported List of {@link URL URLs} by the serviceInterface , group and version * - * @param serviceInstance The class name of service interface + * @param serviceInterface The class name of service interface * @param group {@link Service#group() the service group} (optional) * @param version {@link Service#version() the service version} (optional) * @return non-null read-only {@link List} * @see URL */ - String getExportedURLs(String serviceInstance, String group, String version); + String getExportedURLs(String serviceInterface, String group, String version); } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/DubboMetadataServiceInvocationHandler.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/DubboMetadataServiceInvocationHandler.java index 4138b3b8..db95179f 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/DubboMetadataServiceInvocationHandler.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/DubboMetadataServiceInvocationHandler.java @@ -18,6 +18,9 @@ package org.springframework.cloud.alibaba.dubbo.service; import org.apache.dubbo.rpc.service.GenericService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.stream.Stream; @@ -29,14 +32,7 @@ import java.util.stream.Stream; */ class DubboMetadataServiceInvocationHandler implements InvocationHandler { - /** - * The method name of {@link DubboMetadataService#getServiceRestMetadata()} - */ - private static final String METHOD_NAME = "getServiceRestMetadata"; - - private static final String[] PARAMETER_TYPES = new String[0]; - - private static final String[] PARAMETER_VALUES = new String[0]; + private final Logger logger = LoggerFactory.getLogger(getClass()); private final GenericService genericService; @@ -46,7 +42,15 @@ class DubboMetadataServiceInvocationHandler implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - return genericService.$invoke(method.getName(), getParameterTypes(method), args); + Object returnValue = null; + try { + returnValue = genericService.$invoke(method.getName(), getParameterTypes(method), args); + } catch (Throwable e) { + if (logger.isErrorEnabled()) { + logger.error(e.getMessage(), e); + } + } + return returnValue; } private String[] getParameterTypes(Method method) { diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/IntrospectiveDubboMetadataService.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/IntrospectiveDubboMetadataService.java index 672f0617..b409db98 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/IntrospectiveDubboMetadataService.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/IntrospectiveDubboMetadataService.java @@ -84,8 +84,8 @@ public class IntrospectiveDubboMetadataService implements DubboMetadataService { } @Override - public String getExportedURLs(String serviceInstance, String group, String version) { - List urls = dubboServiceMetadataRepository.getExportedURLs(serviceInstance, group, version); + public String getExportedURLs(String serviceInterface, String group, String version) { + List urls = dubboServiceMetadataRepository.getExportedURLs(serviceInterface, group, version); return jsonUtils.toJSON(urls); } }