From dfa77475793e94d9c9dd8800852741c8b3cd79fa Mon Sep 17 00:00:00 2001 From: theonefx Date: Wed, 27 Jan 2021 23:52:31 +0800 Subject: [PATCH] add dubbo and nacos endpoint --- .../cloud/nacos/utils/NacosConfigUtils.java | 2 +- .../endpoint/NacosDiscoveryEndpoint.java | 6 ++ ...ubboMetadataEndpointAutoConfiguration.java | 19 ++++- .../endpoint/DubboDiscoveryEndpoint.java | 74 +++++++++++++++++++ .../endpoint/DubboRegistryEndpoint.java | 42 +++++++++++ .../service/DubboMetadataServiceProxy.java | 7 +- .../main/resources/META-INF/spring.factories | 3 +- 7 files changed, 144 insertions(+), 9 deletions(-) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboDiscoveryEndpoint.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboRegistryEndpoint.java diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/utils/NacosConfigUtils.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/utils/NacosConfigUtils.java index 386d160e8..f9e06dfc9 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/utils/NacosConfigUtils.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/utils/NacosConfigUtils.java @@ -21,7 +21,7 @@ package com.alibaba.cloud.nacos.utils; */ public final class NacosConfigUtils { - private NacosConfigUtils(){ + private NacosConfigUtils() { } /** diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java index b1aea4179..ad2e762e0 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java @@ -24,6 +24,7 @@ import java.util.Map; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.nacos.api.naming.NamingService; +import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.api.naming.pojo.ServiceInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -66,6 +67,11 @@ public class NacosDiscoveryEndpoint { try { subscribe = namingService.getSubscribeServices(); + for (ServiceInfo serviceInfo : subscribe) { + List instances = namingService.getAllInstances( + serviceInfo.getName(), serviceInfo.getGroupName()); + serviceInfo.setHosts(instances); + } } catch (Exception e) { log.error("get subscribe services from nacos fail,", e); 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 bfcc87c72..16867eee6 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 @@ -16,10 +16,11 @@ package com.alibaba.cloud.dubbo.actuate; +import com.alibaba.cloud.dubbo.actuate.endpoint.DubboDiscoveryEndpoint; +import com.alibaba.cloud.dubbo.actuate.endpoint.DubboRegistryEndpoint; import com.alibaba.cloud.dubbo.actuate.endpoint.DubboRestMetadataEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; -import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; @@ -34,7 +35,7 @@ import org.springframework.context.annotation.PropertySource; @ConditionalOnClass( name = "org.springframework.boot.actuate.endpoint.annotation.Endpoint") @PropertySource("classpath:/META-INF/dubbo/default/actuator-endpoints.properties") -@ManagementContextConfiguration +@Configuration(proxyBeanMethods = false) public class DubboMetadataEndpointAutoConfiguration { @Bean @@ -44,4 +45,18 @@ public class DubboMetadataEndpointAutoConfiguration { return new DubboRestMetadataEndpoint(); } + @Bean + @ConditionalOnMissingBean + @ConditionalOnAvailableEndpoint + public DubboDiscoveryEndpoint dubboDiscoveryEndpoint() { + return new DubboDiscoveryEndpoint(); + } + + @Bean + @ConditionalOnMissingBean + @ConditionalOnAvailableEndpoint + public DubboRegistryEndpoint dubboRegistryEndpoint() { + return new DubboRegistryEndpoint(); + } + } 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 new file mode 100644 index 000000000..c8d818f66 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboDiscoveryEndpoint.java @@ -0,0 +1,74 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.dubbo.actuate.endpoint; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import com.alibaba.cloud.dubbo.registry.DubboCloudRegistry; +import com.alibaba.cloud.dubbo.registry.SpringCloudRegistryFactory; +import org.apache.dubbo.common.URL; +import org.apache.dubbo.registry.NotifyListener; +import org.apache.dubbo.registry.integration.RegistryDirectory; +import org.apache.dubbo.rpc.Invoker; + +import org.springframework.boot.actuate.endpoint.annotation.Endpoint; +import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; + +import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE; +import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY; +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +/** + * Dubbo Rest Metadata {@link Endpoint}. + * + * @author Mercy + */ +@Endpoint(id = "dubbodiscovery") +public class DubboDiscoveryEndpoint { + + @ReadOperation(produces = APPLICATION_JSON_VALUE) + public Object get() { + DubboCloudRegistry registry = (DubboCloudRegistry) SpringCloudRegistryFactory + .getRegistries().stream().filter(o -> o instanceof DubboCloudRegistry) + .findFirst().orElse(null); + + Map> map = registry.getSubscribed(); + + Map> result = new HashMap<>(); + map.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()); + + result.put(url.getServiceKey(), list); + }); + return result; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboRegistryEndpoint.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboRegistryEndpoint.java new file mode 100644 index 000000000..03ac3c95e --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboRegistryEndpoint.java @@ -0,0 +1,42 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.dubbo.actuate.endpoint; + +import com.alibaba.cloud.dubbo.registry.DubboCloudRegistry; + +import org.springframework.boot.actuate.endpoint.annotation.Endpoint; +import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; + +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +/** + * Dubbo Rest Metadata {@link Endpoint}. + * + * @author Mercy + */ +@Endpoint(id = "dubboregistry") +public class DubboRegistryEndpoint { + + // @Autowired + private DubboCloudRegistry dubboCloudRegistry; + + @ReadOperation(produces = APPLICATION_JSON_VALUE) + public Object get() { + return dubboCloudRegistry; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java index ff70950d6..b6f65fa67 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java @@ -84,8 +84,6 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab */ public DubboMetadataService getProxy(List serviceInstances) { - DubboMetadataService dubboMetadataService = null; - // attempt to get the proxy of DubboMetadataService in maximum times int attempts = serviceInstances.size(); @@ -98,7 +96,8 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab serviceInstance.get()); for (URL dubboMetadataServiceURL : dubboMetadataServiceURLs) { - dubboMetadataService = createProxyIfAbsent(dubboMetadataServiceURL); + DubboMetadataService dubboMetadataService = createProxyIfAbsent( + dubboMetadataServiceURL); if (dubboMetadataService != null) { return dubboMetadataService; } @@ -106,7 +105,7 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab } } - return dubboMetadataService; + return null; } /** diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/resources/META-INF/spring.factories index 06c5b5921..3cf51ce58 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/resources/META-INF/spring.factories @@ -5,8 +5,7 @@ com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration, com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationNonWebApplicationAutoConfiguration,\ com.alibaba.cloud.dubbo.autoconfigure.DubboLoadBalancedRestTemplateAutoConfiguration,\ com.alibaba.cloud.dubbo.autoconfigure.DubboServiceAutoConfiguration,\ -com.alibaba.cloud.dubbo.autoconfigure.DubboServiceDiscoveryAutoConfiguration -org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration=\ +com.alibaba.cloud.dubbo.autoconfigure.DubboServiceDiscoveryAutoConfiguration,\ com.alibaba.cloud.dubbo.actuate.DubboMetadataEndpointAutoConfiguration org.springframework.context.ApplicationContextInitializer=\ com.alibaba.cloud.dubbo.context.DubboServiceRegistrationApplicationContextInitializer