From 5a381ad2788b25d8f93d44def6b1db676d8bb169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE=E6=98=AF=E7=84=B6?= <38133602+ranpro@users.noreply.github.com> Date: Sun, 24 Jan 2021 23:12:16 +0800 Subject: [PATCH 1/8] Update README-zh.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove duplicate '。' --- README-zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README-zh.md b/README-zh.md index e275e787..70a6101f 100644 --- a/README-zh.md +++ b/README-zh.md @@ -19,7 +19,7 @@ Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。 * **服务注册与发现**:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。 * **分布式配置管理**:支持分布式系统中的外部化配置,配置更改时自动刷新。 * **消息驱动能力**:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。 -* **分布式事务**:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。 +* **分布式事务**:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。 * **阿里云对象存储**:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。 * **分布式任务调度**:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。 * **阿里云短信服务**:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。 From 62398e1bc264718991c97b2517565a802e46379a Mon Sep 17 00:00:00 2001 From: zkzlx Date: Mon, 25 Jan 2021 18:13:19 +0800 Subject: [PATCH 2/8] fixed - Unicode encoding , exclude base latin letter. --- .../cloud/nacos/utils/NacosConfigUtils.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) 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 386d160e..b8a448dd 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() { } /** @@ -33,16 +33,26 @@ public final class NacosConfigUtils { StringBuilder sb = new StringBuilder(); char[] chars = configValue.toCharArray(); for (char aChar : chars) { - if (isChinese(aChar)) { - sb.append("\\u").append(Integer.toHexString(aChar)); + if (isBaseLetter(aChar)) { + sb.append(aChar); } else { - sb.append(aChar); + sb.append(String.format("\\u%04x", (int) aChar)); } } return sb.toString(); } + /** + * char is base latin or whitespace? + * @param ch a character + * @return true or false + */ + public static boolean isBaseLetter(char ch) { + Character.UnicodeBlock ub = Character.UnicodeBlock.of(ch); + return ub == Character.UnicodeBlock.BASIC_LATIN || Character.isWhitespace(ch); + } + /** * char is chinese? * @param c a character From dfa77475793e94d9c9dd8800852741c8b3cd79fa Mon Sep 17 00:00:00 2001 From: theonefx Date: Wed, 27 Jan 2021 23:52:31 +0800 Subject: [PATCH 3/8] 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 386d160e..f9e06dfc 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 b1aea417..ad2e762e 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 bfcc87c7..16867eee 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 00000000..c8d818f6 --- /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 00000000..03ac3c95 --- /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 ff70950d..b6f65fa6 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 06c5b592..3cf51ce5 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 From 4a2f90f13e78d1a5dc8863f97c88a304b397a8ea Mon Sep 17 00:00:00 2001 From: theonefx Date: Thu, 28 Jan 2021 09:11:33 +0800 Subject: [PATCH 4/8] dubbo endpoint --- ...ubboMetadataEndpointAutoConfiguration.java | 8 ---- .../endpoint/DubboDiscoveryEndpoint.java | 5 +++ .../endpoint/DubboRegistryEndpoint.java | 42 ------------------- 3 files changed, 5 insertions(+), 50 deletions(-) delete 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-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 16867eee..e95acddc 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 @@ -17,7 +17,6 @@ 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; @@ -52,11 +51,4 @@ public class DubboMetadataEndpointAutoConfiguration { 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 index c8d818f6..9954b28a 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.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -50,6 +51,10 @@ public class DubboDiscoveryEndpoint { .getRegistries().stream().filter(o -> o instanceof DubboCloudRegistry) .findFirst().orElse(null); + if (registry == null) { + return Collections.emptyMap(); + } + Map> map = registry.getSubscribed(); Map> result = new HashMap<>(); 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 deleted file mode 100644 index 03ac3c95..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboRegistryEndpoint.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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; - } - -} From 8542756d90e448262c3e2ba00639429c3266455d Mon Sep 17 00:00:00 2001 From: theonefx Date: Thu, 28 Jan 2021 10:08:42 +0800 Subject: [PATCH 5/8] dubbo endpoint --- pom.xml | 2 +- spring-cloud-alibaba-dependencies/pom.xml | 2 +- .../examples/RocketMQConsumerApplication.java | 5 ++- ...ubboMetadataEndpointAutoConfiguration.java | 12 ++++- .../endpoint/DubboDiscoveryEndpoint.java | 4 +- .../endpoint/DubboExportedURLsEndpoint.java | 44 +++++++++++++++++++ 6 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboExportedURLsEndpoint.java diff --git a/pom.xml b/pom.xml index 86b77994..7f9f0f88 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ - 2.2.4.RELEASE + 2.2.5.RC2 2.2.5.RELEASE diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index acf3b9c7..1fdaf869 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -18,7 +18,7 @@ Spring Cloud Alibaba Dependencies - 2.2.4.RELEASE + 2.2.5.RC2 1.8.0 1.3.0 1.4.1 diff --git a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-consume-example/src/main/java/com/alibaba/cloud/examples/RocketMQConsumerApplication.java b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-consume-example/src/main/java/com/alibaba/cloud/examples/RocketMQConsumerApplication.java index 0458e9ef..8634b8ca 100644 --- a/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-consume-example/src/main/java/com/alibaba/cloud/examples/RocketMQConsumerApplication.java +++ b/spring-cloud-alibaba-examples/rocketmq-example/rocketmq-consume-example/src/main/java/com/alibaba/cloud/examples/RocketMQConsumerApplication.java @@ -74,8 +74,9 @@ public class RocketMQConsumerApplication { while (true) { mySink.input5().poll(m -> { String payload = (String) m.getPayload(); - if(payload.contains("0")){ - throw new IllegalArgumentException("111111111111111111111111111111111111111111"); + if (payload.contains("0")) { + throw new IllegalArgumentException( + "111111111111111111111111111111111111111111"); } System.out.println("pull msg: " + payload); }, new ParameterizedTypeReference() { 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 e95acddc..2e2a13c1 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 @@ -17,6 +17,7 @@ package com.alibaba.cloud.dubbo.actuate; import com.alibaba.cloud.dubbo.actuate.endpoint.DubboDiscoveryEndpoint; +import com.alibaba.cloud.dubbo.actuate.endpoint.DubboExportedURLsEndpoint; import com.alibaba.cloud.dubbo.actuate.endpoint.DubboRestMetadataEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; @@ -31,8 +32,7 @@ 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 { @@ -48,7 +48,15 @@ public class DubboMetadataEndpointAutoConfiguration { @ConditionalOnMissingBean @ConditionalOnAvailableEndpoint public DubboDiscoveryEndpoint dubboDiscoveryEndpoint() { + return new DubboDiscoveryEndpoint(); } + @Bean + @ConditionalOnMissingBean + @ConditionalOnAvailableEndpoint + public DubboExportedURLsEndpoint dubboServiceMetadataEndpoint() { + return new DubboExportedURLsEndpoint(); + } + } 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 9954b28a..68bbcc20 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 @@ -40,9 +40,9 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; /** * Dubbo Rest Metadata {@link Endpoint}. * - * @author Mercy + * @author Theonefx */ -@Endpoint(id = "dubbodiscovery") +@Endpoint(id = "dubboRegistryDirectory") public class DubboDiscoveryEndpoint { @ReadOperation(produces = APPLICATION_JSON_VALUE) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboExportedURLsEndpoint.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboExportedURLsEndpoint.java new file mode 100644 index 00000000..d13a8042 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/endpoint/DubboExportedURLsEndpoint.java @@ -0,0 +1,44 @@ +/* + * 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.service.DubboMetadataService; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.endpoint.annotation.Endpoint; +import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; + +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; + +/** + * Dubbo exported URLs. + * {@link org.springframework.boot.actuate.endpoint.annotation.Endpoint}. + * + * @author Theonefx + */ +@Endpoint(id = "dubboExportedURLs") +public class DubboExportedURLsEndpoint { + + @Autowired + private DubboMetadataService dubboMetadataService; + + @ReadOperation(produces = APPLICATION_JSON_UTF8_VALUE) + public Object get() { + return dubboMetadataService.getAllExportedURLs(); + } + +} From 6924f0c3bede6fedf0ba37b042dd1e31704a72f7 Mon Sep 17 00:00:00 2001 From: theonefx Date: Thu, 28 Jan 2021 19:41:55 +0800 Subject: [PATCH 6/8] add service instance change event listener order --- ...ubboMetadataEndpointAutoConfiguration.java | 3 +- .../endpoint/DubboDiscoveryEndpoint.java | 36 ++++++--- .../dubbo/registry/DubboCloudRegistry.java | 74 +++++++++++++------ 3 files changed, 79 insertions(+), 34 deletions(-) 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(); + } + }); } } From b2b9401d2b1caa8b1e0aecdbf393f688ca8b2140 Mon Sep 17 00:00:00 2001 From: TheoneFx Date: Mon, 1 Feb 2021 10:10:35 +0800 Subject: [PATCH 7/8] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index af71f00c..2e2d66ef 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ These artifacts are available from Maven Central and Spring Release repository v com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.2.4.RELEASE + 2.2.5.RELEASE pom import From 5a9347a6833051a87a6733cddfd6c1865bdec779 Mon Sep 17 00:00:00 2001 From: TheoneFx Date: Mon, 1 Feb 2021 10:11:10 +0800 Subject: [PATCH 8/8] Update README-zh.md --- README-zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README-zh.md b/README-zh.md index 70a6101f..a52b26ff 100644 --- a/README-zh.md +++ b/README-zh.md @@ -70,7 +70,7 @@ Spring Cloud 使用 Maven 来构建,最快的使用方式是将本项目 clone com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.2.4.RELEASE + 2.2.5.RELEASE pom import