From 33e7cd6930d7b11895e5597024ac515cf1938f0b Mon Sep 17 00:00:00 2001 From: yunzheng1228 Date: Wed, 20 Feb 2019 20:39:59 +0800 Subject: [PATCH 01/33] Adding yunzheng to developers --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index bffa398f..411de843 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,10 @@ mercyblitz@gmail.com Alibaba https://github.com/mercyblitz + + + yunzheng + yunzheng1228@gmail.com From 46e5cb8acb411b8be15a155075e752a38dd92033 Mon Sep 17 00:00:00 2001 From: gaoyunpeng Date: Wed, 20 Feb 2019 20:53:16 +0800 Subject: [PATCH 02/33] aggregate multi report --- pom.xml | 36 ++---- spring-cloud-alibaba-coverage/pom.xml | 109 ++++++++++++++++++ spring-cloud-alibaba-dubbo/pom.xml | 25 ++++ spring-cloud-alibaba-fescar/pom.xml | 24 ++++ .../pom.xml | 24 ++++ spring-cloud-alibaba-nacos-config/pom.xml | 24 ++++ spring-cloud-alibaba-nacos-discovery/pom.xml | 26 ++++- .../pom.xml | 25 ++++ spring-cloud-alibaba-sentinel/pom.xml | 24 ++++ spring-cloud-alicloud-acm/pom.xml | 24 ++++ spring-cloud-alicloud-ans/pom.xml | 24 ++++ spring-cloud-alicloud-context/pom.xml | 25 +++- spring-cloud-alicloud-oss/pom.xml | 24 ++++ spring-cloud-alicloud-schedulerx/pom.xml | 25 +++- spring-cloud-alicloud-sms/pom.xml | 24 ++++ spring-cloud-stream-binder-rocketmq/pom.xml | 24 ++++ 16 files changed, 459 insertions(+), 28 deletions(-) create mode 100644 spring-cloud-alibaba-coverage/pom.xml diff --git a/pom.xml b/pom.xml index bffa398f..6e1c97f7 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 2.8.2 2.21.0 1.6 - 0.7.9 + 0.8.3 @@ -105,6 +105,7 @@ spring-cloud-alicloud-ans spring-cloud-alicloud-schedulerx spring-cloud-alicloud-sms + spring-cloud-alibaba-coverage @@ -169,6 +170,15 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + org.apache.maven.plugins @@ -191,30 +201,6 @@ false - - org.jacoco - jacoco-maven-plugin - ${jacoco.version} - - target/coverage-reports/jacoco-unit.exec - target/coverage-reports/jacoco-unit.exec - - - - jacoco-initialize - - prepare-agent - - - - jacoco-site - test - - report - - - - diff --git a/spring-cloud-alibaba-coverage/pom.xml b/spring-cloud-alibaba-coverage/pom.xml new file mode 100644 index 00000000..cf5a4c1e --- /dev/null +++ b/spring-cloud-alibaba-coverage/pom.xml @@ -0,0 +1,109 @@ + + + + spring-cloud-alibaba + org.springframework.cloud + 0.2.2.BUILD-SNAPSHOT + + 4.0.0 + + spring-cloud-alibaba-coverage + spring-cloud-alibaba-coverage + + + 0.2.2.BUILD-SNAPSHOT + + + + org.springframework.cloud + spring-cloud-alibaba-dubbo + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alibaba-nacos-config + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alibaba-nacos-config-server + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alibaba-nacos-discovery + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alibaba-sentinel + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alibaba-sentinel-datasource + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alicloud-acm + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alicloud-ans + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alicloud-context + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alicloud-oss + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alicloud-schedulerx + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alicloud-sms + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-stream-binder-rocketmq + ${spring.cloud.alibaba.version} + + + + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + report-aggregate + test + + report-aggregate + + + ${basedir}/../target/site/jacoco + + + + + + + + \ No newline at end of file diff --git a/spring-cloud-alibaba-dubbo/pom.xml b/spring-cloud-alibaba-dubbo/pom.xml index 94467a24..ac21e2ee 100644 --- a/spring-cloud-alibaba-dubbo/pom.xml +++ b/spring-cloud-alibaba-dubbo/pom.xml @@ -176,4 +176,29 @@ + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + \ No newline at end of file diff --git a/spring-cloud-alibaba-fescar/pom.xml b/spring-cloud-alibaba-fescar/pom.xml index 15613f57..dbdf4063 100644 --- a/spring-cloud-alibaba-fescar/pom.xml +++ b/spring-cloud-alibaba-fescar/pom.xml @@ -114,4 +114,28 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alibaba-nacos-config-server/pom.xml b/spring-cloud-alibaba-nacos-config-server/pom.xml index 32b097e2..4ec0478f 100644 --- a/spring-cloud-alibaba-nacos-config-server/pom.xml +++ b/spring-cloud-alibaba-nacos-config-server/pom.xml @@ -61,4 +61,28 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alibaba-nacos-config/pom.xml b/spring-cloud-alibaba-nacos-config/pom.xml index 8096c713..2c85a841 100644 --- a/spring-cloud-alibaba-nacos-config/pom.xml +++ b/spring-cloud-alibaba-nacos-config/pom.xml @@ -96,4 +96,28 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alibaba-nacos-discovery/pom.xml b/spring-cloud-alibaba-nacos-discovery/pom.xml index fd2dbb80..c775c097 100644 --- a/spring-cloud-alibaba-nacos-discovery/pom.xml +++ b/spring-cloud-alibaba-nacos-discovery/pom.xml @@ -80,6 +80,30 @@ spring-cloud-test-support test - + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alibaba-sentinel-datasource/pom.xml b/spring-cloud-alibaba-sentinel-datasource/pom.xml index 47ca7798..e75033f1 100644 --- a/spring-cloud-alibaba-sentinel-datasource/pom.xml +++ b/spring-cloud-alibaba-sentinel-datasource/pom.xml @@ -98,4 +98,29 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + + diff --git a/spring-cloud-alibaba-sentinel/pom.xml b/spring-cloud-alibaba-sentinel/pom.xml index 9410a293..7f4354a8 100644 --- a/spring-cloud-alibaba-sentinel/pom.xml +++ b/spring-cloud-alibaba-sentinel/pom.xml @@ -137,4 +137,28 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alicloud-acm/pom.xml b/spring-cloud-alicloud-acm/pom.xml index 0d9e3f5e..045812b3 100644 --- a/spring-cloud-alicloud-acm/pom.xml +++ b/spring-cloud-alicloud-acm/pom.xml @@ -69,5 +69,29 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alicloud-ans/pom.xml b/spring-cloud-alicloud-ans/pom.xml index 3aa33c0b..ac784829 100644 --- a/spring-cloud-alicloud-ans/pom.xml +++ b/spring-cloud-alicloud-ans/pom.xml @@ -118,4 +118,28 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + \ No newline at end of file diff --git a/spring-cloud-alicloud-context/pom.xml b/spring-cloud-alicloud-context/pom.xml index b87d920d..4b798458 100644 --- a/spring-cloud-alicloud-context/pom.xml +++ b/spring-cloud-alicloud-context/pom.xml @@ -128,5 +128,28 @@ - + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alicloud-oss/pom.xml b/spring-cloud-alicloud-oss/pom.xml index eb5c5adf..0596e451 100644 --- a/spring-cloud-alicloud-oss/pom.xml +++ b/spring-cloud-alicloud-oss/pom.xml @@ -61,4 +61,28 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alicloud-schedulerx/pom.xml b/spring-cloud-alicloud-schedulerx/pom.xml index 04b948a5..db58050a 100644 --- a/spring-cloud-alicloud-schedulerx/pom.xml +++ b/spring-cloud-alicloud-schedulerx/pom.xml @@ -50,5 +50,28 @@ true - + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + \ No newline at end of file diff --git a/spring-cloud-alicloud-sms/pom.xml b/spring-cloud-alicloud-sms/pom.xml index 001a46ad..2b9b500e 100644 --- a/spring-cloud-alicloud-sms/pom.xml +++ b/spring-cloud-alicloud-sms/pom.xml @@ -79,5 +79,29 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-stream-binder-rocketmq/pom.xml b/spring-cloud-stream-binder-rocketmq/pom.xml index 49ae2579..fad85417 100644 --- a/spring-cloud-stream-binder-rocketmq/pom.xml +++ b/spring-cloud-stream-binder-rocketmq/pom.xml @@ -77,5 +77,29 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + From 03bd2c3c1d8785470301821d8b69bea42be28843 Mon Sep 17 00:00:00 2001 From: xiaolongzuo <150349407@qq.com> Date: Thu, 21 Feb 2019 15:09:20 +0800 Subject: [PATCH 03/33] Add statistics for nacos discovery and test case --- .../NacosDiscoveryParameterInitListener.java | 9 +-- .../statistics/StatisticsTaskStarter.java | 10 +++- .../NacosDiscoveryAutoConfiguration.java | 23 ++++++++ ...osDiscoveryParameterInitListenerTests.java | 57 ++++++++++--------- 4 files changed, 66 insertions(+), 33 deletions(-) create mode 100644 spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryAutoConfiguration.java diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/nacos/NacosDiscoveryParameterInitListener.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/nacos/NacosDiscoveryParameterInitListener.java index 757f2b50..b8db4d31 100644 --- a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/nacos/NacosDiscoveryParameterInitListener.java +++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/nacos/NacosDiscoveryParameterInitListener.java @@ -15,14 +15,15 @@ */ package org.springframework.cloud.alicloud.context.nacos; -import com.alibaba.cloud.context.edas.EdasChangeOrderConfiguration; -import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory; +import java.util.Properties; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; import org.springframework.cloud.alicloud.context.listener.AbstractOnceApplicationListener; -import java.util.Properties; +import com.alibaba.cloud.context.edas.EdasChangeOrderConfiguration; +import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory; /** * @author pbting @@ -53,7 +54,7 @@ public class NacosDiscoveryParameterInitListener } // initialize nacos configuration Properties properties = System.getProperties(); - + properties.setProperty("spring.cloud.nacos.discovery.server-mode", "EDAS"); // step 1: set some properties for spring cloud alibaba nacos discovery properties.setProperty("spring.cloud.nacos.discovery.server-addr", ""); properties.setProperty("spring.cloud.nacos.discovery.endpoint", diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/statistics/StatisticsTaskStarter.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/statistics/StatisticsTaskStarter.java index 709315d8..e820d4a9 100644 --- a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/statistics/StatisticsTaskStarter.java +++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/statistics/StatisticsTaskStarter.java @@ -48,7 +48,9 @@ public class StatisticsTaskStarter implements InitializingBean { private static final String NACOS_CONFIG_SERVER_MODE_KEY = "spring.cloud.nacos.config.server-mode"; - private static final String NACOS_CONFIG_SERVER_MODE_VALUE = "EDAS"; + private static final String NACOS_DISCOVERY_SERVER_MODE_KEY = "spring.cloud.nacos.discovery.server-mode"; + + private static final String NACOS_SERVER_MODE_VALUE = "EDAS"; @Autowired(required = false) private AliCloudEdasSdk aliCloudEdasSdk; @@ -106,10 +108,14 @@ public class StatisticsTaskStarter implements InitializingBean { if (acmContextBootstrapConfiguration != null && acmEnableEdas) { components.add("SC-ACM"); } - if (NACOS_CONFIG_SERVER_MODE_VALUE + if (NACOS_SERVER_MODE_VALUE .equals(System.getProperty(NACOS_CONFIG_SERVER_MODE_KEY))) { components.add("SC-NACOS-CONFIG"); } + if (NACOS_SERVER_MODE_VALUE + .equals(System.getProperty(NACOS_DISCOVERY_SERVER_MODE_KEY))) { + components.add("SC-NACOS-DISCOVERY"); + } return components; } diff --git a/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryAutoConfiguration.java b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryAutoConfiguration.java new file mode 100644 index 00000000..74ac28bc --- /dev/null +++ b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryAutoConfiguration.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 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 + * + * http://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 org.springframework.cloud.alibaba.nacos; + +/** + * @author xiaolongzuo + */ +public class NacosDiscoveryAutoConfiguration { +} diff --git a/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/nacos/NacosDiscoveryParameterInitListenerTests.java b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/nacos/NacosDiscoveryParameterInitListenerTests.java index 39398001..ce425350 100644 --- a/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/nacos/NacosDiscoveryParameterInitListenerTests.java +++ b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/nacos/NacosDiscoveryParameterInitListenerTests.java @@ -16,43 +16,46 @@ package org.springframework.cloud.alicloud.context.nacos; -import com.alibaba.cloud.context.ans.AliCloudAnsInitializer; -import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + import org.junit.BeforeClass; import org.junit.Test; import org.powermock.core.classloader.annotations.PrepareForTest; import org.springframework.cloud.alicloud.context.BaseAliCloudSpringApplication; import org.springframework.cloud.alicloud.utils.ChangeOrderUtils; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import com.alibaba.cloud.context.ans.AliCloudAnsInitializer; +import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory; /** * @author xiaolongzuo */ -@PrepareForTest({EdasChangeOrderConfigurationFactory.class, - NacosConfigParameterInitListener.class, AliCloudAnsInitializer.class}) -public class NacosDiscoveryParameterInitListenerTests extends BaseAliCloudSpringApplication { +@PrepareForTest({ EdasChangeOrderConfigurationFactory.class, + NacosDiscoveryParameterInitListener.class, AliCloudAnsInitializer.class }) +public class NacosDiscoveryParameterInitListenerTests + extends BaseAliCloudSpringApplication { - @BeforeClass - public static void setUp() { - ChangeOrderUtils.mockChangeOrder(); - System.getProperties().setProperty("webContext", "/vipserver"); - System.getProperties().setProperty("serverPort", "80"); - } + @BeforeClass + public static void setUp() { + ChangeOrderUtils.mockChangeOrder(); + } - @Test - public void testNacosParameterInitListener() { - assertThat(System.getProperty("spring.cloud.nacos.config.server-addr")) - .isEqualTo(""); - assertThat(System.getProperty("spring.cloud.nacos.config.endpoint")) - .isEqualTo("testDomain"); - assertThat(System.getProperty("spring.cloud.nacos.config.namespace")) - .isEqualTo("testTenantId"); - assertThat(System.getProperty("spring.cloud.nacos.config.access-key")) - .isEqualTo("testAK"); - assertThat(System.getProperty("spring.cloud.nacos.config.secret-key")) - .isEqualTo("testSK"); - assertThat(System.getProperties().getProperty("webContext")).isEqualTo("/vipserver"); - assertThat(System.getProperties().getProperty("serverPort")).isEqualTo("80"); - } + @Test + public void testNacosParameterInitListener() { + assertThat(System.getProperty("spring.cloud.nacos.discovery.server-mode")) + .isEqualTo("EDAS"); + assertThat(System.getProperty("spring.cloud.nacos.discovery.server-addr")) + .isEqualTo(""); + assertThat(System.getProperty("spring.cloud.nacos.discovery.endpoint")) + .isEqualTo("testDomain"); + assertThat(System.getProperty("spring.cloud.nacos.discovery.namespace")) + .isEqualTo("testTenantId"); + assertThat(System.getProperty("spring.cloud.nacos.discovery.access-key")) + .isEqualTo("testAK"); + assertThat(System.getProperty("spring.cloud.nacos.discovery.secret-key")) + .isEqualTo("testSK"); + assertThat(System.getProperties().getProperty("webContext")) + .isEqualTo("/vipserver"); + assertThat(System.getProperties().getProperty("serverPort")).isEqualTo("80"); + } } From 1c759ec8d5717b935e0faf3d05ae61e8d7e23c0c Mon Sep 17 00:00:00 2001 From: tiger Date: Thu, 21 Feb 2019 15:18:34 +0800 Subject: [PATCH 04/33] add spring-cloud-alibaba-sentinel-zuul module --- pom.xml | 2 + spring-cloud-alibaba-sentinel-zuul/README.md | 141 ++++++++++++++++++ spring-cloud-alibaba-sentinel-zuul/pom.xml | 43 ++++++ .../zuul/SentinelZuulAutoConfiguration.java | 116 ++++++++++++++ .../listener/FallBackProviderListener.java | 38 +++++ .../main/resources/META-INF/spring.factories | 2 + 6 files changed, 342 insertions(+) create mode 100755 spring-cloud-alibaba-sentinel-zuul/README.md create mode 100644 spring-cloud-alibaba-sentinel-zuul/pom.xml create mode 100644 spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/SentinelZuulAutoConfiguration.java create mode 100644 spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/listener/FallBackProviderListener.java create mode 100644 spring-cloud-alibaba-sentinel-zuul/src/main/resources/META-INF/spring.factories diff --git a/pom.xml b/pom.xml index 94a52385..ac6ae996 100644 --- a/pom.xml +++ b/pom.xml @@ -59,6 +59,7 @@ 2.0.0.RELEASE 2.0.0.RELEASE + 4.12 3.0 1.7.25 @@ -82,6 +83,7 @@ spring-cloud-starter-alibaba spring-cloud-starter-alicloud spring-cloud-alicloud-oss + spring-cloud-alibaba-sentinel-zuul diff --git a/spring-cloud-alibaba-sentinel-zuul/README.md b/spring-cloud-alibaba-sentinel-zuul/README.md new file mode 100755 index 00000000..2d0d2fd1 --- /dev/null +++ b/spring-cloud-alibaba-sentinel-zuul/README.md @@ -0,0 +1,141 @@ +# Sentinel Spring Cloud Zuul Adapter + +Zuul does not provide rateLimit function, If use default `SentinelRibbonFilter` route filter. it wrapped by Hystrix Command. so only provide Service level +circuit protect. + +Sentinel can provide `ServiceId` level and `API Path` level flow control for spring cloud zuul gateway service. + +*Note*: this project is for zuul 1. + +## How to use + +1. Add maven dependency + +```xml + + org.springframework.cloud + spring-cloud-alibaba-sentinel-zuul + x.y.z + + +``` + +2. Set application.property + +``` +// default value is false +spring.cloud.sentinel.zuul.enabled=true +``` + +## How it works + +As Zuul run as per thread per connection block model, we add filters around `route Filter` to trace sentinel statistics. + +- `SentinelPreFilter`: Get an entry of resource,the first order is **ServiceId**, then **API Path**. +- `SentinelPostFilter`: When success response,exit entry. +- `SentinelErrorFilter`: When get an `Exception`, trace the exception and exit context. + + +the order of Filter can be changed by configuration: + +``` +spring.cloud.sentinel.zuul.order.post=0 +spring.cloud.sentinel.zuul.order.pre=10000 +spring.cloud.sentinel.zuul.order.error=-1 +``` + + +Filters create structure like: + + +```bash + +EntranceNode: machine-root(t:3 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) +-EntranceNode: coke(t:2 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) +--coke(t:2 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) +---/coke/uri(t:0 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) +-EntranceNode: sentinel_default_context(t:0 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) +-EntranceNode: book(t:1 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) +--book(t:1 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) +---/book/uri(t:0 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) + +``` + +`book` and `coke` are serviceId. + +`---/book/uri` is api path, the real uri is `/uri`. + + +## Integration with Sentinel DashBord + +Start [Sentinel DashBord](https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0). + +## Rule config with dataSource + +Sentinel has full rule config features. see [Dynamic-Rule-Configuration](https://github.com/alibaba/Sentinel/wiki/Dynamic-Rule-Configuration) + + +## Custom Fallbacks + +Implements `SentinelFallbackProvider` to define your own Fallback Provider when Sentinel Block Exception throwing for different rout. the default +Fallback Provider is `DefaultBlockFallbackProvider`. + +By default Fallback route is `ServiveId + URI PATH`, example `/book/coke`, first `book` is serviceId, `/uri` is URI PATH, so both +can be needed. + +Here is an example: + +```java + +// custom provider +public class MyCokeServiceBlockFallbackProvider implements SentinelFallbackProvider { + + private Logger logger = LoggerFactory.getLogger(DefaultBlockFallbackProvider.class); + + // you can define root as service level + @Override + public String getRoute() { + return "/coke/uri"; + } + + @Override + public ClientHttpResponse fallbackResponse(String route, Throwable cause) { + if (cause instanceof BlockException) { + logger.info("get in fallback block exception:{}", cause); + return response(HttpStatus.TOO_MANY_REQUESTS, route); + } else { + return response(HttpStatus.INTERNAL_SERVER_ERROR, route); + } + } + } + +``` + +## Custom Request Origin Parser +By default this adapter use `DefaultRequestOriginParser` to parse sentinel origin. + +```java + +public class CustomRequestOriginParser implements RequestOriginParser { + @Override + public String parseOrigin(HttpServletRequest request) { + // do custom logic. + return ""; + } +} + +``` + +## Custom UrlCleaner +By default this adapter use `DefaultUrlCleaner` to define uri resource. + +```java +public class CustomUrlCleaner implements UrlCleaner { + + @Override + public String clean(String originUrl) { + // do custom logic. + return originUrl; + } +} +``` \ No newline at end of file diff --git a/spring-cloud-alibaba-sentinel-zuul/pom.xml b/spring-cloud-alibaba-sentinel-zuul/pom.xml new file mode 100644 index 00000000..60ae2dff --- /dev/null +++ b/spring-cloud-alibaba-sentinel-zuul/pom.xml @@ -0,0 +1,43 @@ + + + + spring-cloud-alibaba + org.springframework.cloud + 0.2.0.BUILD-SNAPSHOT + + 4.0.0 + + spring-cloud-alibaba-sentinel-zuul + + + + org.springframework.cloud + spring-cloud-starter-netflix-zuul + provided + + + com.alibaba.csp + sentinel-zuul-adapter + 1.4.2 + + + org.springframework.boot + spring-boot-configuration-processor + provided + true + + + junit + junit + test + + + org.mockito + mockito-core + test + + + + \ No newline at end of file diff --git a/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/SentinelZuulAutoConfiguration.java b/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/SentinelZuulAutoConfiguration.java new file mode 100644 index 00000000..9fc77637 --- /dev/null +++ b/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/SentinelZuulAutoConfiguration.java @@ -0,0 +1,116 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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 + * + * http://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 org.springframework.cloud.alibaba.sentinel.zuul; + +import com.alibaba.csp.sentinel.adapter.zuul.fallback.DefaultRequestOriginParser; +import com.alibaba.csp.sentinel.adapter.zuul.fallback.DefaultUrlCleaner; +import com.alibaba.csp.sentinel.adapter.zuul.fallback.RequestOriginParser; +import com.alibaba.csp.sentinel.adapter.zuul.fallback.UrlCleaner; +import com.alibaba.csp.sentinel.adapter.zuul.filters.SentinelErrorFilter; +import com.alibaba.csp.sentinel.adapter.zuul.filters.SentinelPostFilter; +import com.alibaba.csp.sentinel.adapter.zuul.filters.SentinelPreFilter; +import com.alibaba.csp.sentinel.adapter.zuul.properties.SentinelZuulProperties; +import com.alibaba.csp.sentinel.util.StringUtil; +import com.netflix.zuul.ZuulFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.alibaba.sentinel.zuul.listener.FallBackProviderListener; +import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; + +import static org.springframework.cloud.alibaba.sentinel.zuul.SentinelZuulAutoConfiguration.PREFIX; + +/** + * Sentinel Spring Cloud Zuul AutoConfiguration + * + * @author tiger + */ +@Configuration +@ConditionalOnProperty(prefix = PREFIX, name = "enabled", havingValue = "true") +public class SentinelZuulAutoConfiguration { + + @Autowired + private Environment environment; + + public static final String PREFIX = "spring.cloud.alibaba.sentinel.zuul"; + + @Bean + public SentinelZuulProperties sentinelZuulProperties() { + SentinelZuulProperties properties = new SentinelZuulProperties(); + String enabledStr = environment.getProperty(PREFIX + "." + "enabled"); + String preOrderStr = environment.getProperty(PREFIX + "." + "order.pre"); + String postOrderStr = environment.getProperty(PREFIX + "." + "order.post"); + String errorOrderStr = environment.getProperty(PREFIX + "." + "order.error"); + if (StringUtil.isNotEmpty(enabledStr)) { + Boolean enabled = Boolean.valueOf(enabledStr); + properties.setEnabled(enabled); + } + if (StringUtil.isNotEmpty(preOrderStr)) { + properties.getOrder().setPre(Integer.parseInt(preOrderStr)); + } + if (StringUtil.isNotEmpty(postOrderStr)) { + properties.getOrder().setPost(Integer.parseInt(postOrderStr)); + } + if (StringUtil.isNotEmpty(errorOrderStr)) { + properties.getOrder().setError(Integer.parseInt(errorOrderStr)); + } + return properties; + } + + @Bean + @ConditionalOnMissingBean(ProxyRequestHelper.class) + public ProxyRequestHelper proxyRequestHelper() { + return new ProxyRequestHelper(); + } + + @Bean + @ConditionalOnMissingBean(UrlCleaner.class) + public UrlCleaner urlCleaner(){ + return new DefaultUrlCleaner(); + } + + @Bean + @ConditionalOnMissingBean(RequestOriginParser.class) + public RequestOriginParser requestOriginParser(){ + return new DefaultRequestOriginParser(); + } + + @Bean + public ZuulFilter preFilter(SentinelZuulProperties sentinelZuulProperties,UrlCleaner urlCleaner, + RequestOriginParser requestOriginParser) { + return new SentinelPreFilter(sentinelZuulProperties,urlCleaner,requestOriginParser); + } + + @Bean + public ZuulFilter postFilter(SentinelZuulProperties sentinelZuulProperties) { + return new SentinelPostFilter(sentinelZuulProperties); + } + + @Bean + public ZuulFilter errorFilter(SentinelZuulProperties sentinelZuulProperties) { + return new SentinelErrorFilter(sentinelZuulProperties); + } + + @Bean + public FallBackProviderListener fallBackProviderListener() { + return new FallBackProviderListener(); + } + +} diff --git a/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/listener/FallBackProviderListener.java b/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/listener/FallBackProviderListener.java new file mode 100644 index 00000000..d4d19bdf --- /dev/null +++ b/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/listener/FallBackProviderListener.java @@ -0,0 +1,38 @@ +package org.springframework.cloud.alibaba.sentinel.zuul.listener; + +import com.alibaba.csp.sentinel.adapter.zuul.fallback.DefaultBlockFallbackProvider; +import com.alibaba.csp.sentinel.adapter.zuul.fallback.ZuulBlockFallbackManager; +import com.alibaba.csp.sentinel.adapter.zuul.fallback.ZuulBlockFallbackProvider; +import org.apache.commons.collections.MapUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.context.event.ApplicationStartedEvent; +import org.springframework.context.event.EventListener; + +import java.util.Map; + + +/** + * @author tiger + */ +public class FallBackProviderListener { + + private static final Logger logger = LoggerFactory.getLogger(FallBackProviderListener.class); + + @EventListener(classes = ApplicationStartedEvent.class) + public void appStartedListener(ApplicationStartedEvent event) throws Exception { + Map providerMap = event.getApplicationContext().getBeansOfType( + ZuulBlockFallbackProvider.class); + if (MapUtils.isNotEmpty(providerMap)) { + providerMap.forEach((k, v) -> { + logger.info("[Sentinel] Register provider name: {}, instance: {}", k, v); + ZuulBlockFallbackManager.registerProvider(v); + }); + } else { + logger.info("[Sentinel] Register default fallback provider. "); + ZuulBlockFallbackManager.registerProvider(new DefaultBlockFallbackProvider()); + } + } + + +} diff --git a/spring-cloud-alibaba-sentinel-zuul/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-sentinel-zuul/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..b4ced151 --- /dev/null +++ b/spring-cloud-alibaba-sentinel-zuul/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +org.springframework.cloud.alibaba.sentinel.zuul.SentinelZuulAutoConfiguration \ No newline at end of file From 356f07a5092359a9c59f330a9823ac94a33b806c Mon Sep 17 00:00:00 2001 From: tiger Date: Thu, 21 Feb 2019 15:34:21 +0800 Subject: [PATCH 05/33] remove version and format code --- pom.xml | 2 +- spring-cloud-alibaba-sentinel-zuul/pom.xml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1079f292..5ad92ead 100644 --- a/pom.xml +++ b/pom.xml @@ -88,6 +88,7 @@ spring-cloud-alibaba-dependencies spring-cloud-alibaba-sentinel spring-cloud-alibaba-sentinel-datasource + spring-cloud-alibaba-sentinel-zuul spring-cloud-alibaba-nacos-config spring-cloud-alibaba-nacos-discovery spring-cloud-alibaba-fescar @@ -105,7 +106,6 @@ spring-cloud-alicloud-ans spring-cloud-alicloud-schedulerx spring-cloud-alicloud-sms - spring-cloud-alibaba-sentinel-zuul diff --git a/spring-cloud-alibaba-sentinel-zuul/pom.xml b/spring-cloud-alibaba-sentinel-zuul/pom.xml index 60ae2dff..50065b45 100644 --- a/spring-cloud-alibaba-sentinel-zuul/pom.xml +++ b/spring-cloud-alibaba-sentinel-zuul/pom.xml @@ -20,7 +20,6 @@ com.alibaba.csp sentinel-zuul-adapter - 1.4.2 org.springframework.boot From 19af00793161f88ae8cdff2085181ca19f73ea9b Mon Sep 17 00:00:00 2001 From: tiger Date: Thu, 21 Feb 2019 15:51:01 +0800 Subject: [PATCH 06/33] update spring cloud version --- spring-cloud-alibaba-sentinel-zuul/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-sentinel-zuul/pom.xml b/spring-cloud-alibaba-sentinel-zuul/pom.xml index 50065b45..3524212a 100644 --- a/spring-cloud-alibaba-sentinel-zuul/pom.xml +++ b/spring-cloud-alibaba-sentinel-zuul/pom.xml @@ -5,7 +5,7 @@ spring-cloud-alibaba org.springframework.cloud - 0.2.0.BUILD-SNAPSHOT + 0.2.2.BUILD-SNAPSHOT 4.0.0 From 9dac4efd376c934e16cdb52838f2cfb3ad10aa58 Mon Sep 17 00:00:00 2001 From: gaoyunpeng Date: Wed, 20 Feb 2019 20:53:16 +0800 Subject: [PATCH 07/33] aggregate multi report --- pom.xml | 36 ++---- spring-cloud-alibaba-coverage/pom.xml | 109 ++++++++++++++++++ spring-cloud-alibaba-dubbo/pom.xml | 25 ++++ spring-cloud-alibaba-fescar/pom.xml | 24 ++++ .../pom.xml | 24 ++++ spring-cloud-alibaba-nacos-config/pom.xml | 24 ++++ spring-cloud-alibaba-nacos-discovery/pom.xml | 26 ++++- .../pom.xml | 25 ++++ spring-cloud-alibaba-sentinel/pom.xml | 24 ++++ spring-cloud-alicloud-acm/pom.xml | 24 ++++ spring-cloud-alicloud-ans/pom.xml | 24 ++++ spring-cloud-alicloud-context/pom.xml | 25 +++- spring-cloud-alicloud-oss/pom.xml | 24 ++++ spring-cloud-alicloud-schedulerx/pom.xml | 25 +++- spring-cloud-alicloud-sms/pom.xml | 24 ++++ spring-cloud-stream-binder-rocketmq/pom.xml | 24 ++++ 16 files changed, 459 insertions(+), 28 deletions(-) create mode 100644 spring-cloud-alibaba-coverage/pom.xml diff --git a/pom.xml b/pom.xml index bffa398f..6e1c97f7 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 2.8.2 2.21.0 1.6 - 0.7.9 + 0.8.3 @@ -105,6 +105,7 @@ spring-cloud-alicloud-ans spring-cloud-alicloud-schedulerx spring-cloud-alicloud-sms + spring-cloud-alibaba-coverage @@ -169,6 +170,15 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + org.apache.maven.plugins @@ -191,30 +201,6 @@ false - - org.jacoco - jacoco-maven-plugin - ${jacoco.version} - - target/coverage-reports/jacoco-unit.exec - target/coverage-reports/jacoco-unit.exec - - - - jacoco-initialize - - prepare-agent - - - - jacoco-site - test - - report - - - - diff --git a/spring-cloud-alibaba-coverage/pom.xml b/spring-cloud-alibaba-coverage/pom.xml new file mode 100644 index 00000000..cf5a4c1e --- /dev/null +++ b/spring-cloud-alibaba-coverage/pom.xml @@ -0,0 +1,109 @@ + + + + spring-cloud-alibaba + org.springframework.cloud + 0.2.2.BUILD-SNAPSHOT + + 4.0.0 + + spring-cloud-alibaba-coverage + spring-cloud-alibaba-coverage + + + 0.2.2.BUILD-SNAPSHOT + + + + org.springframework.cloud + spring-cloud-alibaba-dubbo + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alibaba-nacos-config + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alibaba-nacos-config-server + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alibaba-nacos-discovery + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alibaba-sentinel + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alibaba-sentinel-datasource + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alicloud-acm + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alicloud-ans + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alicloud-context + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alicloud-oss + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alicloud-schedulerx + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-alicloud-sms + ${spring.cloud.alibaba.version} + + + org.springframework.cloud + spring-cloud-stream-binder-rocketmq + ${spring.cloud.alibaba.version} + + + + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + report-aggregate + test + + report-aggregate + + + ${basedir}/../target/site/jacoco + + + + + + + + \ No newline at end of file diff --git a/spring-cloud-alibaba-dubbo/pom.xml b/spring-cloud-alibaba-dubbo/pom.xml index 94467a24..ac21e2ee 100644 --- a/spring-cloud-alibaba-dubbo/pom.xml +++ b/spring-cloud-alibaba-dubbo/pom.xml @@ -176,4 +176,29 @@ + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + \ No newline at end of file diff --git a/spring-cloud-alibaba-fescar/pom.xml b/spring-cloud-alibaba-fescar/pom.xml index 15613f57..dbdf4063 100644 --- a/spring-cloud-alibaba-fescar/pom.xml +++ b/spring-cloud-alibaba-fescar/pom.xml @@ -114,4 +114,28 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alibaba-nacos-config-server/pom.xml b/spring-cloud-alibaba-nacos-config-server/pom.xml index 32b097e2..4ec0478f 100644 --- a/spring-cloud-alibaba-nacos-config-server/pom.xml +++ b/spring-cloud-alibaba-nacos-config-server/pom.xml @@ -61,4 +61,28 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alibaba-nacos-config/pom.xml b/spring-cloud-alibaba-nacos-config/pom.xml index 8096c713..2c85a841 100644 --- a/spring-cloud-alibaba-nacos-config/pom.xml +++ b/spring-cloud-alibaba-nacos-config/pom.xml @@ -96,4 +96,28 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alibaba-nacos-discovery/pom.xml b/spring-cloud-alibaba-nacos-discovery/pom.xml index fd2dbb80..c775c097 100644 --- a/spring-cloud-alibaba-nacos-discovery/pom.xml +++ b/spring-cloud-alibaba-nacos-discovery/pom.xml @@ -80,6 +80,30 @@ spring-cloud-test-support test - + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alibaba-sentinel-datasource/pom.xml b/spring-cloud-alibaba-sentinel-datasource/pom.xml index 47ca7798..e75033f1 100644 --- a/spring-cloud-alibaba-sentinel-datasource/pom.xml +++ b/spring-cloud-alibaba-sentinel-datasource/pom.xml @@ -98,4 +98,29 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + + diff --git a/spring-cloud-alibaba-sentinel/pom.xml b/spring-cloud-alibaba-sentinel/pom.xml index 9410a293..7f4354a8 100644 --- a/spring-cloud-alibaba-sentinel/pom.xml +++ b/spring-cloud-alibaba-sentinel/pom.xml @@ -137,4 +137,28 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alicloud-acm/pom.xml b/spring-cloud-alicloud-acm/pom.xml index 0d9e3f5e..045812b3 100644 --- a/spring-cloud-alicloud-acm/pom.xml +++ b/spring-cloud-alicloud-acm/pom.xml @@ -69,5 +69,29 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alicloud-ans/pom.xml b/spring-cloud-alicloud-ans/pom.xml index 3aa33c0b..ac784829 100644 --- a/spring-cloud-alicloud-ans/pom.xml +++ b/spring-cloud-alicloud-ans/pom.xml @@ -118,4 +118,28 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + \ No newline at end of file diff --git a/spring-cloud-alicloud-context/pom.xml b/spring-cloud-alicloud-context/pom.xml index b87d920d..4b798458 100644 --- a/spring-cloud-alicloud-context/pom.xml +++ b/spring-cloud-alicloud-context/pom.xml @@ -128,5 +128,28 @@ - + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alicloud-oss/pom.xml b/spring-cloud-alicloud-oss/pom.xml index eb5c5adf..0596e451 100644 --- a/spring-cloud-alicloud-oss/pom.xml +++ b/spring-cloud-alicloud-oss/pom.xml @@ -61,4 +61,28 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-alicloud-schedulerx/pom.xml b/spring-cloud-alicloud-schedulerx/pom.xml index 04b948a5..db58050a 100644 --- a/spring-cloud-alicloud-schedulerx/pom.xml +++ b/spring-cloud-alicloud-schedulerx/pom.xml @@ -50,5 +50,28 @@ true - + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + \ No newline at end of file diff --git a/spring-cloud-alicloud-sms/pom.xml b/spring-cloud-alicloud-sms/pom.xml index 001a46ad..2b9b500e 100644 --- a/spring-cloud-alicloud-sms/pom.xml +++ b/spring-cloud-alicloud-sms/pom.xml @@ -79,5 +79,29 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + diff --git a/spring-cloud-stream-binder-rocketmq/pom.xml b/spring-cloud-stream-binder-rocketmq/pom.xml index 49ae2579..fad85417 100644 --- a/spring-cloud-stream-binder-rocketmq/pom.xml +++ b/spring-cloud-stream-binder-rocketmq/pom.xml @@ -77,5 +77,29 @@ + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + jacoco-initialize + + prepare-agent + + + + jacoco-site + test + + report + + + + + + From 2db3677f20e883e70f3094377913f2a923449c94 Mon Sep 17 00:00:00 2001 From: gaoyunpeng Date: Thu, 21 Feb 2019 15:50:17 +0800 Subject: [PATCH 08/33] fix #369 remove superfluous settings in fescar example --- .../fescar-example/account-service/pom.xml | 26 ------------------- .../fescar-example/business-service/pom.xml | 21 --------------- .../fescar-example/storage-service/pom.xml | 26 ------------------- 3 files changed, 73 deletions(-) diff --git a/spring-cloud-alibaba-examples/fescar-example/account-service/pom.xml b/spring-cloud-alibaba-examples/fescar-example/account-service/pom.xml index 219187bc..8d93a588 100644 --- a/spring-cloud-alibaba-examples/fescar-example/account-service/pom.xml +++ b/spring-cloud-alibaba-examples/fescar-example/account-service/pom.xml @@ -34,30 +34,4 @@ mysql-connector-java - - - - - - org.codehaus.mojo - cobertura-maven-plugin - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.codehaus.mojo - cobertura-maven-plugin - false - - true - - - - - \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/fescar-example/business-service/pom.xml b/spring-cloud-alibaba-examples/fescar-example/business-service/pom.xml index 6d77872a..53340dfb 100644 --- a/spring-cloud-alibaba-examples/fescar-example/business-service/pom.xml +++ b/spring-cloud-alibaba-examples/fescar-example/business-service/pom.xml @@ -38,25 +38,4 @@ - - - - - org.codehaus.mojo - cobertura-maven-plugin - - - - - - org.codehaus.mojo - cobertura-maven-plugin - false - - true - - - - - \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/fescar-example/storage-service/pom.xml b/spring-cloud-alibaba-examples/fescar-example/storage-service/pom.xml index bcdca22c..fdef4eaf 100644 --- a/spring-cloud-alibaba-examples/fescar-example/storage-service/pom.xml +++ b/spring-cloud-alibaba-examples/fescar-example/storage-service/pom.xml @@ -39,30 +39,4 @@ mysql-connector-java - - - - - - org.codehaus.mojo - cobertura-maven-plugin - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.codehaus.mojo - cobertura-maven-plugin - false - - true - - - - - \ No newline at end of file From 852e2874814ab350f20076042cca355761efd208 Mon Sep 17 00:00:00 2001 From: gaoyunpeng Date: Thu, 21 Feb 2019 15:55:53 +0800 Subject: [PATCH 09/33] rename coverage module name --- spring-cloud-alibaba-coverage/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-coverage/pom.xml b/spring-cloud-alibaba-coverage/pom.xml index cf5a4c1e..3862b751 100644 --- a/spring-cloud-alibaba-coverage/pom.xml +++ b/spring-cloud-alibaba-coverage/pom.xml @@ -10,7 +10,7 @@ 4.0.0 spring-cloud-alibaba-coverage - spring-cloud-alibaba-coverage + Spring Cloud Alibaba Coverage 0.2.2.BUILD-SNAPSHOT From 880a894786651e219f75c4e98e84b3d2ca52c283 Mon Sep 17 00:00:00 2001 From: gaoyunpeng Date: Thu, 21 Feb 2019 16:03:39 +0800 Subject: [PATCH 10/33] there is not need deploy to maven so add settings for it --- spring-cloud-alibaba-coverage/pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spring-cloud-alibaba-coverage/pom.xml b/spring-cloud-alibaba-coverage/pom.xml index 3862b751..d8ef6b21 100644 --- a/spring-cloud-alibaba-coverage/pom.xml +++ b/spring-cloud-alibaba-coverage/pom.xml @@ -103,6 +103,14 @@ + + org.apache.maven.plugins + maven-deploy-plugin + ${maven-deploy-plugin.version} + + true + + From ac25e4a9dc266d3da05282d003c76de51dc8c38d Mon Sep 17 00:00:00 2001 From: tiger Date: Thu, 21 Feb 2019 16:32:01 +0800 Subject: [PATCH 11/33] add sentinel-zuul-adapter dependency --- spring-cloud-alibaba-dependencies/pom.xml | 10 ++++++++++ spring-cloud-alibaba-sentinel-zuul/pom.xml | 2 ++ 2 files changed, 12 insertions(+) diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 73f35e85..efd1ea82 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -148,6 +148,11 @@ sentinel-web-servlet ${sentinel.version} + + com.alibaba.csp + sentinel-zuul-adapter + ${sentinel.version} + com.alibaba.csp sentinel-transport-simple-http @@ -265,6 +270,11 @@ spring-cloud-alibaba-sentinel-datasource ${project.version} + + org.springframework.cloud + spring-cloud-alibaba-sentinel-zuul + ${project.version} + org.springframework.cloud spring-cloud-alicloud-oss diff --git a/spring-cloud-alibaba-sentinel-zuul/pom.xml b/spring-cloud-alibaba-sentinel-zuul/pom.xml index 3524212a..d8f8fa80 100644 --- a/spring-cloud-alibaba-sentinel-zuul/pom.xml +++ b/spring-cloud-alibaba-sentinel-zuul/pom.xml @@ -9,7 +9,9 @@ 4.0.0 + org.springframework.cloud spring-cloud-alibaba-sentinel-zuul + Spring Cloud Alibaba Sentinel Zuul From ffb71e3eaf37cfa41b45d348bccdd20b19db55ee Mon Sep 17 00:00:00 2001 From: tiger Date: Fri, 22 Feb 2019 18:09:35 +0800 Subject: [PATCH 12/33] change listener to use SmartInitializingSingleton --- .../zuul/SentinelZuulAutoConfiguration.java | 12 +++-------- .../listener/FallBackProviderListener.java | 21 ++++++++++++------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/SentinelZuulAutoConfiguration.java b/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/SentinelZuulAutoConfiguration.java index 9fc77637..73d4cf79 100644 --- a/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/SentinelZuulAutoConfiguration.java +++ b/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/SentinelZuulAutoConfiguration.java @@ -27,10 +27,10 @@ import com.alibaba.csp.sentinel.adapter.zuul.properties.SentinelZuulProperties; import com.alibaba.csp.sentinel.util.StringUtil; import com.netflix.zuul.ZuulFilter; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.alibaba.sentinel.zuul.listener.FallBackProviderListener; -import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; @@ -74,12 +74,6 @@ public class SentinelZuulAutoConfiguration { return properties; } - @Bean - @ConditionalOnMissingBean(ProxyRequestHelper.class) - public ProxyRequestHelper proxyRequestHelper() { - return new ProxyRequestHelper(); - } - @Bean @ConditionalOnMissingBean(UrlCleaner.class) public UrlCleaner urlCleaner(){ @@ -109,8 +103,8 @@ public class SentinelZuulAutoConfiguration { } @Bean - public FallBackProviderListener fallBackProviderListener() { - return new FallBackProviderListener(); + public FallBackProviderListener fallBackProviderListener(DefaultListableBeanFactory beanFactory) { + return new FallBackProviderListener(beanFactory); } } diff --git a/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/listener/FallBackProviderListener.java b/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/listener/FallBackProviderListener.java index d4d19bdf..d727a0e4 100644 --- a/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/listener/FallBackProviderListener.java +++ b/spring-cloud-alibaba-sentinel-zuul/src/main/java/org/springframework/cloud/alibaba/sentinel/zuul/listener/FallBackProviderListener.java @@ -6,6 +6,8 @@ import com.alibaba.csp.sentinel.adapter.zuul.fallback.ZuulBlockFallbackProvider; import org.apache.commons.collections.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.SmartInitializingSingleton; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.event.EventListener; @@ -15,17 +17,22 @@ import java.util.Map; /** * @author tiger */ -public class FallBackProviderListener { +public class FallBackProviderListener implements SmartInitializingSingleton { private static final Logger logger = LoggerFactory.getLogger(FallBackProviderListener.class); - @EventListener(classes = ApplicationStartedEvent.class) - public void appStartedListener(ApplicationStartedEvent event) throws Exception { - Map providerMap = event.getApplicationContext().getBeansOfType( - ZuulBlockFallbackProvider.class); + private final DefaultListableBeanFactory beanFactory; + + public FallBackProviderListener(DefaultListableBeanFactory beanFactory) { + this.beanFactory = beanFactory; + } + + @Override + public void afterSingletonsInstantiated() { + Map providerMap = beanFactory.getBeansOfType(ZuulBlockFallbackProvider.class); if (MapUtils.isNotEmpty(providerMap)) { providerMap.forEach((k, v) -> { - logger.info("[Sentinel] Register provider name: {}, instance: {}", k, v); + logger.info("[Sentinel] Register provider name:{}, instance: {}", k, v); ZuulBlockFallbackManager.registerProvider(v); }); } else { @@ -33,6 +40,4 @@ public class FallBackProviderListener { ZuulBlockFallbackManager.registerProvider(new DefaultBlockFallbackProvider()); } } - - } From 10206af82b89bf5e13ea6f97c0ed3440d9391080 Mon Sep 17 00:00:00 2001 From: Harris Zhang Date: Sun, 24 Feb 2019 11:16:56 +0800 Subject: [PATCH 13/33] use EnableDiscoveryClient --- .../cloud/alibaba/cloud/examples/ProviderApplication.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/ProviderApplication.java b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/ProviderApplication.java index c8b4a1c2..ae090f6e 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/ProviderApplication.java +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/nacos-discovery-provider-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/ProviderApplication.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController; /** * @author xiaojing */ +@EnableDiscoveryClient @SpringBootApplication public class ProviderApplication { From fa5b57f3dba809114c467c624d52f7428856021b Mon Sep 17 00:00:00 2001 From: xiaolongzuo <150349407@qq.com> Date: Mon, 25 Feb 2019 14:35:39 +0800 Subject: [PATCH 14/33] Polish test cases for schedulerx --- .../cloud/examples/HelloController.java | 35 +++++++++++++++++ .../alibaba/cloud/examples/SimpleTask.java | 20 +++++----- .../cloud/examples/TestController.java | 39 +++++++++++++++++++ .../alibaba/cloud/examples/TestService.java | 6 +-- 4 files changed, 87 insertions(+), 13 deletions(-) create mode 100644 spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/HelloController.java create mode 100644 spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/TestController.java diff --git a/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/HelloController.java b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/HelloController.java new file mode 100644 index 00000000..c11cbf98 --- /dev/null +++ b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/HelloController.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 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 + * + * http://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 org.springframework.cloud.alibaba.cloud.examples; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author xiaolongzuo + */ +@RestController +public class HelloController { + + @RequestMapping("/") + @ResponseBody + public String hello() { + return "OK"; + } + +} diff --git a/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/SimpleTask.java b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/SimpleTask.java index 09055da1..17ced464 100644 --- a/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/SimpleTask.java +++ b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/SimpleTask.java @@ -16,25 +16,25 @@ package org.springframework.cloud.alibaba.cloud.examples; +import org.springframework.beans.factory.annotation.Autowired; + import com.alibaba.edas.schedulerx.ProcessResult; import com.alibaba.edas.schedulerx.ScxSimpleJobContext; import com.alibaba.edas.schedulerx.ScxSimpleJobProcessor; -import org.springframework.beans.factory.annotation.Autowired; /** * @author xiaolongzuo */ public class SimpleTask implements ScxSimpleJobProcessor { - @Autowired - private TestService testService; + @Autowired + private TestService testService; - @Override - public ProcessResult process(ScxSimpleJobContext context) { - System.out.println("-----------Hello world---------------"); - testService.test(); - ProcessResult processResult = new ProcessResult(true); - return processResult; - } + @Override + public ProcessResult process(ScxSimpleJobContext context) { + testService.test(); + ProcessResult processResult = new ProcessResult(true); + return processResult; + } } diff --git a/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/TestController.java b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/TestController.java new file mode 100644 index 00000000..b237b279 --- /dev/null +++ b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/TestController.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 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 + * + * http://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 org.springframework.cloud.alibaba.cloud.examples; + +import java.util.concurrent.atomic.AtomicInteger; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author xiaolongzuo + */ +@RestController +public class TestController { + + static AtomicInteger atomicInteger = new AtomicInteger(0); + + @RequestMapping("/test") + @ResponseBody + public String test() { + return String.valueOf(atomicInteger.get()); + } + +} diff --git a/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/TestService.java b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/TestService.java index 1786d197..3352c05a 100644 --- a/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/TestService.java +++ b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/TestService.java @@ -24,7 +24,7 @@ import org.springframework.stereotype.Service; @Service public class TestService { - public void test() { - System.out.println("---------IOC Success--------"); - } + public void test() { + TestController.atomicInteger.incrementAndGet(); + } } From ca31245a8aeb924aeaa63ba4ed9a49d56997a001 Mon Sep 17 00:00:00 2001 From: xiaolongzuo <150349407@qq.com> Date: Mon, 25 Feb 2019 15:00:11 +0800 Subject: [PATCH 15/33] Polish --- .../nacos/NacosDiscoveryParameterInitListenerTests.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/nacos/NacosDiscoveryParameterInitListenerTests.java b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/nacos/NacosDiscoveryParameterInitListenerTests.java index ce425350..73754cf8 100644 --- a/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/nacos/NacosDiscoveryParameterInitListenerTests.java +++ b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/nacos/NacosDiscoveryParameterInitListenerTests.java @@ -54,8 +54,9 @@ public class NacosDiscoveryParameterInitListenerTests .isEqualTo("testAK"); assertThat(System.getProperty("spring.cloud.nacos.discovery.secret-key")) .isEqualTo("testSK"); - assertThat(System.getProperties().getProperty("webContext")) + assertThat(System.getProperties().getProperty("nacos.naming.web.context")) .isEqualTo("/vipserver"); - assertThat(System.getProperties().getProperty("serverPort")).isEqualTo("80"); + assertThat(System.getProperties().getProperty("nacos.naming.exposed.port")) + .isEqualTo("80"); } } From a543be5f9fa2be6086745d34f923fa2c0da21242 Mon Sep 17 00:00:00 2001 From: yunzheng1228 Date: Mon, 25 Feb 2019 16:44:08 +0800 Subject: [PATCH 16/33] Format log naming --- .../alibaba/nacos/NacosDiscoveryProperties.java | 4 ++-- .../nacos/discovery/NacosDiscoveryClient.java | 4 ++-- .../nacos/endpoint/NacosDiscoveryEndpoint.java | 4 ++-- .../registry/NacosAutoServiceRegistration.java | 4 ++-- .../nacos/registry/NacosServiceRegistry.java | 16 ++++++++-------- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryProperties.java index ecb0b136..f58aa4f9 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryProperties.java @@ -45,7 +45,7 @@ import static com.alibaba.nacos.api.PropertyKeyConst.*; @ConfigurationProperties("spring.cloud.nacos.discovery") public class NacosDiscoveryProperties { - private static final Logger LOGGER = LoggerFactory + private static final Logger log = LoggerFactory .getLogger(NacosDiscoveryProperties.class); /** @@ -401,7 +401,7 @@ public class NacosDiscoveryProperties { namingService = NacosFactory.createNamingService(properties); } catch (Exception e) { - LOGGER.error("create naming service error!properties={},e=,", this, e); + log.error("create naming service error!properties={},e=,", this, e); return null; } return namingService; diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/discovery/NacosDiscoveryClient.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/discovery/NacosDiscoveryClient.java index a820144e..4bedab5c 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/discovery/NacosDiscoveryClient.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/discovery/NacosDiscoveryClient.java @@ -33,7 +33,7 @@ import java.util.*; */ public class NacosDiscoveryClient implements DiscoveryClient { - private static final Logger LOGGER = LoggerFactory + private static final Logger log = LoggerFactory .getLogger(NacosDiscoveryClient.class); public static final String DESCRIPTION = "Spring Cloud Nacos Discovery Client"; @@ -100,7 +100,7 @@ public class NacosDiscoveryClient implements DiscoveryClient { return services.getData(); } catch (Exception e) { - LOGGER.error("get service name from nacos server fail,", e); + log.error("get service name from nacos server fail,", e); return Collections.emptyList(); } } diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/endpoint/NacosDiscoveryEndpoint.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/endpoint/NacosDiscoveryEndpoint.java index 43bec39a..6ceec414 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/endpoint/NacosDiscoveryEndpoint.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/endpoint/NacosDiscoveryEndpoint.java @@ -37,7 +37,7 @@ import org.springframework.cloud.alibaba.nacos.NacosDiscoveryProperties; @Endpoint(id = "nacos-discovery") public class NacosDiscoveryEndpoint { - private static final Logger LOGGER = LoggerFactory + private static final Logger log = LoggerFactory .getLogger(NacosDiscoveryEndpoint.class); private NacosDiscoveryProperties nacosDiscoveryProperties; @@ -61,7 +61,7 @@ public class NacosDiscoveryEndpoint { subscribe = namingService.getSubscribeServices(); } catch (Exception e) { - LOGGER.error("get subscribe services from nacos fail,", e); + log.error("get subscribe services from nacos fail,", e); } result.put("subscribe", subscribe); return result; diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosAutoServiceRegistration.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosAutoServiceRegistration.java index 4f7094f0..54c22a19 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosAutoServiceRegistration.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosAutoServiceRegistration.java @@ -31,7 +31,7 @@ import org.springframework.util.StringUtils; */ public class NacosAutoServiceRegistration extends AbstractAutoServiceRegistration { - private static final Logger LOGGER = LoggerFactory + private static final Logger log = LoggerFactory .getLogger(NacosAutoServiceRegistration.class); private NacosRegistration registration; @@ -65,7 +65,7 @@ public class NacosAutoServiceRegistration @Override protected void register() { if (!this.registration.getNacosDiscoveryProperties().isRegisterEnabled()) { - LOGGER.debug("Registration disabled."); + log.debug("Registration disabled."); return; } if (this.registration.getPort() < 0) { diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosServiceRegistry.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosServiceRegistry.java index d2d5fa67..48de92c0 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosServiceRegistry.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosServiceRegistry.java @@ -31,7 +31,7 @@ import org.springframework.util.StringUtils; */ public class NacosServiceRegistry implements ServiceRegistry { - private static Logger logger = LoggerFactory.getLogger(NacosServiceRegistry.class); + private static final Logger log = LoggerFactory.getLogger(NacosServiceRegistry.class); private final NacosDiscoveryProperties nacosDiscoveryProperties; @@ -46,7 +46,7 @@ public class NacosServiceRegistry implements ServiceRegistry { public void register(Registration registration) { if (StringUtils.isEmpty(registration.getServiceId())) { - logger.info("No service to register for nacos client..."); + log.info("No service to register for nacos client..."); return; } @@ -61,11 +61,11 @@ public class NacosServiceRegistry implements ServiceRegistry { try { namingService.registerInstance(serviceId, instance); - logger.info("nacos registry, {} {}:{} register finished", serviceId, + log.info("nacos registry, {} {}:{} register finished", serviceId, instance.getIp(), instance.getPort()); } catch (Exception e) { - logger.error("nacos registry, {} register failed...{},", serviceId, + log.error("nacos registry, {} register failed...{},", serviceId, registration.toString(), e); } } @@ -73,10 +73,10 @@ public class NacosServiceRegistry implements ServiceRegistry { @Override public void deregister(Registration registration) { - logger.info("De-registering from Nacos Server now..."); + log.info("De-registering from Nacos Server now..."); if (StringUtils.isEmpty(registration.getServiceId())) { - logger.info("No dom to de-register for nacos client..."); + log.info("No dom to de-register for nacos client..."); return; } @@ -88,11 +88,11 @@ public class NacosServiceRegistry implements ServiceRegistry { registration.getPort(), nacosDiscoveryProperties.getClusterName()); } catch (Exception e) { - logger.error("ERR_NACOS_DEREGISTER, de-register failed...{},", + log.error("ERR_NACOS_DEREGISTER, de-register failed...{},", registration.toString(), e); } - logger.info("De-registration finished."); + log.info("De-registration finished."); } @Override From 71b24881310d80749840bd7cde953cf9c360fcaf Mon Sep 17 00:00:00 2001 From: xiaolongzuo <150349407@qq.com> Date: Tue, 26 Feb 2019 10:49:42 +0800 Subject: [PATCH 17/33] Add scx and oss java doc. --- .../alicloud/context/oss/OssProperties.java | 20 +++++++++++++++++++ .../alicloud/context/scx/ScxProperties.java | 10 ++++++++++ 2 files changed, 30 insertions(+) diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/oss/OssProperties.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/oss/OssProperties.java index 59f64cc3..4897bf5f 100644 --- a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/oss/OssProperties.java +++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/oss/OssProperties.java @@ -31,13 +31,33 @@ import com.aliyun.oss.ClientBuilderConfiguration; @ConfigurationProperties("spring.cloud.alicloud.oss") public class OssProperties { + /** + * Authorization Mode, please see oss + * docs. + */ @Value("${spring.cloud.alicloud.oss.authorization-mode:AK_SK}") private AliCloudAuthorizationMode authorizationMode; + /** + * Endpoint, please see oss + * docs. + */ private String endpoint; + /** + * Sts token, please see oss + * docs. + */ private StsToken sts; + /** + * Client Configuration, please see oss + * docs. + */ private ClientBuilderConfiguration config; public AliCloudAuthorizationMode getAuthorizationMode() { diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/scx/ScxProperties.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/scx/ScxProperties.java index db6a00d6..5ddfb0ab 100644 --- a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/scx/ScxProperties.java +++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/scx/ScxProperties.java @@ -26,8 +26,18 @@ import com.alibaba.cloud.context.scx.ScxConfiguration; @ConfigurationProperties("spring.cloud.alicloud.scx") public class ScxProperties implements ScxConfiguration { + /** + * Group id, please see scx + * docs. + */ private String groupId; + /** + * Domain name, please see scx + * docs. + */ private String domainName; @Override From b3c26c509e617ad700c2f46305db91c95b2d26de Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Tue, 26 Feb 2019 14:50:26 +0800 Subject: [PATCH 18/33] Polish : /spring-cloud-incubator/spring-cloud-alibaba#386 : supports Spring Cloud Netflix Eureka and Spring Cloud Zookeeper --- spring-cloud-alibaba-dubbo/pom.xml | 104 ++++---- ...BalancedRestTemplateAutoConfiguration.java | 5 +- .../DubboMetadataAutoConfiguration.java | 6 + .../DubboOpenFeignAutoConfiguration.java | 6 +- .../DubboServiceBeanMetadataResolver.java | 2 +- .../openfeign/TargeterBeanPostProcessor.java | 15 +- .../registry/AbstractRegistrationFactory.java | 49 ++++ .../registry/DefaultRegistrationFactory.java | 35 +++ ...ation.java => DelegatingRegistration.java} | 4 +- .../dubbo/registry/RegistrationFactory.java | 42 ++++ .../dubbo/registry/SpringCloudRegistry.java | 167 +++++++++---- .../registry/SpringCloudRegistryFactory.java | 7 +- .../ZookeeperRegistrationFactory.java | 54 +++++ .../eureka/EurekaRegistrationFactory.java | 62 +++++ .../main/resources/META-INF/spring.factories | 7 +- .../bootstrap/DubboSpringCloudBootstrap.java | 222 ------------------ .../src/test/resources/application.yaml | 2 +- .../src/test/resources/bootstrap.yaml | 19 +- .../DubboSpringCloudProviderBootstrap.java | 37 +++ .../dubbo/service/StandardRestService.java | 8 +- .../alibaba/dubbo/service/RestService.java | 3 +- .../cloud/alibaba/dubbo/service/User.java | 6 +- 22 files changed, 509 insertions(+), 353 deletions(-) create mode 100644 spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/AbstractRegistrationFactory.java create mode 100644 spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DefaultRegistrationFactory.java rename spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/{DubboRegistration.java => DelegatingRegistration.java} (94%) create mode 100644 spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/RegistrationFactory.java create mode 100644 spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/apache/zookeeper/ZookeeperRegistrationFactory.java create mode 100644 spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/netflix/eureka/EurekaRegistrationFactory.java delete mode 100644 spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudBootstrap.java create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java rename {spring-cloud-alibaba-dubbo/src/test => spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main}/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java (94%) rename {spring-cloud-alibaba-dubbo/src/test => spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main}/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java (98%) rename {spring-cloud-alibaba-dubbo/src/test => spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main}/java/org/springframework/cloud/alibaba/dubbo/service/User.java (94%) diff --git a/spring-cloud-alibaba-dubbo/pom.xml b/spring-cloud-alibaba-dubbo/pom.xml index 61ccc471..5dbf37ac 100644 --- a/spring-cloud-alibaba-dubbo/pom.xml +++ b/spring-cloud-alibaba-dubbo/pom.xml @@ -17,6 +17,8 @@ 2.6.5 0.2.1.RELEASE 0.0.2 + 2.1.0.RELEASE + 4.0.1 @@ -53,6 +55,54 @@ true + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + true + + + + + org.springframework.cloud + spring-cloud-starter-zookeeper-discovery + ${spring-cloud-zookeeper.version} + true + + + org.apache.zookeeper + zookeeper + + + + + + org.apache.zookeeper + zookeeper + 3.4.12 + true + + + org.slf4j + slf4j-log4j12 + + + + + + org.apache.curator + curator-framework + ${curator.version} + true + + + + + org.springframework.cloud + spring-cloud-starter-alibaba-nacos-discovery + true + + org.springframework.boot spring-boot-actuator-autoconfigure @@ -90,11 +140,6 @@ true - - org.springframework.cloud - spring-cloud-alibaba-nacos-config - - org.springframework.cloud spring-cloud-starter-openfeign @@ -118,37 +163,6 @@ netty-all - - - org.jboss.resteasy - resteasy-jaxrs - - - - org.jboss.resteasy - resteasy-client - - - - org.jboss.resteasy - resteasy-netty4 - - - - javax.validation - validation-api - - - - org.jboss.resteasy - resteasy-jackson-provider - - - - org.jboss.resteasy - resteasy-jaxb-provider - - javax.servlet javax.servlet-api @@ -162,11 +176,6 @@ 9.7.0 - - org.apache.commons - commons-lang3 - - junit @@ -192,19 +201,6 @@ test - - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-discovery - test - - - - - - - - \ No newline at end of file diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboLoadBalancedRestTemplateAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboLoadBalancedRestTemplateAutoConfiguration.java index 15eb6cf3..e97acfca 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboLoadBalancedRestTemplateAutoConfiguration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboLoadBalancedRestTemplateAutoConfiguration.java @@ -33,7 +33,6 @@ import org.springframework.cloud.alibaba.dubbo.metadata.repository.DubboServiceM import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceExecutionContextFactory; import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceFactory; import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration; import org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor; import org.springframework.cloud.client.loadbalancer.RestTemplateCustomizer; import org.springframework.context.annotation.Configuration; @@ -55,8 +54,8 @@ import java.util.Map; * @author Mercy */ @Configuration -@ConditionalOnClass(RestTemplate.class) -@AutoConfigureAfter(LoadBalancerAutoConfiguration.class) +@ConditionalOnClass(name = {"org.springframework.web.client.RestTemplate"}) +@AutoConfigureAfter(name = {"org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration"}) public class DubboLoadBalancedRestTemplateAutoConfiguration implements BeanClassLoaderAware { private static final Class DUBBO_TRANSPORTED_CLASS = DubboTransported.class; diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java index 89a50578..e53a2ae4 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java @@ -66,6 +66,12 @@ public class DubboMetadataAutoConfiguration { protocolConfig = iterator.hasNext() ? iterator.next() : null; } + if (protocolConfig == null) { + protocolConfig = new ProtocolConfig(); + protocolConfig.setName(DEFAULT_PROTOCOL); + protocolConfig.setPort(20880); + } + return protocolConfig; } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java index 55d2f0a9..89df5ec7 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java @@ -17,7 +17,6 @@ package org.springframework.cloud.alibaba.dubbo.autoconfigure; import feign.Contract; -import feign.Feign; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -28,7 +27,6 @@ import org.springframework.cloud.alibaba.dubbo.metadata.resolver.MetadataResolve import org.springframework.cloud.alibaba.dubbo.openfeign.TargeterBeanPostProcessor; import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceExecutionContextFactory; import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceFactory; -import org.springframework.cloud.openfeign.FeignAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; @@ -39,8 +37,8 @@ import org.springframework.core.env.Environment; * * @author Mercy */ -@ConditionalOnClass(value = Feign.class) -@AutoConfigureAfter(FeignAutoConfiguration.class) +@ConditionalOnClass(name = {"feign.Feign"}) +@AutoConfigureAfter(name = {"org.springframework.cloud.openfeign.FeignAutoConfiguration"}) @Configuration public class DubboOpenFeignAutoConfiguration { diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/metadata/resolver/DubboServiceBeanMetadataResolver.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/metadata/resolver/DubboServiceBeanMetadataResolver.java index e3704dae..4a966b15 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/metadata/resolver/DubboServiceBeanMetadataResolver.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/metadata/resolver/DubboServiceBeanMetadataResolver.java @@ -84,7 +84,7 @@ public class DubboServiceBeanMetadataResolver implements BeanClassLoaderAware, S Stream.of(CONTRACT_CLASS_NAMES) .filter(this::isClassPresent) // filter the existed classes .map(this::loadContractClass) // load Contract Class - .map(this::createContract) // create instance by the specified class + .map(this::createContract) // createServiceInstance instance by the specified class .forEach(contracts::add); // add the Contract instance into contracts this.contracts = Collections.unmodifiableCollection(contracts); diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/openfeign/TargeterBeanPostProcessor.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/openfeign/TargeterBeanPostProcessor.java index d055709e..a4a3c77f 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/openfeign/TargeterBeanPostProcessor.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/openfeign/TargeterBeanPostProcessor.java @@ -26,6 +26,7 @@ import org.springframework.core.env.Environment; import static java.lang.reflect.Proxy.newProxyInstance; import static org.springframework.util.ClassUtils.getUserClass; +import static org.springframework.util.ClassUtils.isPresent; import static org.springframework.util.ClassUtils.resolveClassName; /** @@ -64,12 +65,14 @@ public class TargeterBeanPostProcessor implements BeanPostProcessor, BeanClassLo @Override public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException { - Class beanClass = getUserClass(bean.getClass()); - Class targetClass = resolveClassName(TARGETER_CLASS_NAME, classLoader); - if (targetClass.isAssignableFrom(beanClass)) { - return newProxyInstance(classLoader, new Class[]{targetClass}, - new TargeterInvocationHandler(bean, environment, dubboServiceMetadataRepository, - dubboGenericServiceFactory,contextFactory)); + if (isPresent(TARGETER_CLASS_NAME, classLoader)) { + Class beanClass = getUserClass(bean.getClass()); + Class targetClass = resolveClassName(TARGETER_CLASS_NAME, classLoader); + if (targetClass.isAssignableFrom(beanClass)) { + return newProxyInstance(classLoader, new Class[]{targetClass}, + new TargeterInvocationHandler(bean, environment, dubboServiceMetadataRepository, + dubboGenericServiceFactory, contextFactory)); + } } return bean; } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/AbstractRegistrationFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/AbstractRegistrationFactory.java new file mode 100644 index 00000000..41d06eb0 --- /dev/null +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/AbstractRegistrationFactory.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 + * + * http://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 org.springframework.cloud.alibaba.dubbo.registry; + +import com.alibaba.dubbo.common.Constants; +import com.alibaba.dubbo.common.URL; +import com.alibaba.dubbo.common.utils.NetUtils; + +import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.serviceregistry.Registration; + +import java.util.LinkedHashMap; + +/** + * Abstract {@link RegistrationFactory} implementation + *

+ * + * @param The subclass of {@link Registration} + * @author Mercy + */ +public abstract class AbstractRegistrationFactory implements RegistrationFactory { + + protected ServiceInstance createServiceInstance(String serviceName, URL url) { + // Append default category if absent + String category = url.getParameter(Constants.CATEGORY_KEY, Constants.DEFAULT_CATEGORY); + URL newURL = url.addParameter(Constants.CATEGORY_KEY, category); + newURL = newURL.addParameter(Constants.PROTOCOL_KEY, url.getProtocol()); + String ip = NetUtils.getLocalHost(); + int port = newURL.getParameter(Constants.BIND_PORT_KEY, url.getPort()); + DefaultServiceInstance serviceInstance = new DefaultServiceInstance(url.toIdentityString(), serviceName, ip, port, false); + serviceInstance.getMetadata().putAll(new LinkedHashMap<>(newURL.getParameters())); + return serviceInstance; + } +} diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DefaultRegistrationFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DefaultRegistrationFactory.java new file mode 100644 index 00000000..ac3e35f3 --- /dev/null +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DefaultRegistrationFactory.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 + * + * http://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 org.springframework.cloud.alibaba.dubbo.registry; + +import com.alibaba.dubbo.common.URL; + +import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.context.ApplicationContext; + +/** + * Default {@link RegistrationFactory} + * + * @author Mercy + */ +public class DefaultRegistrationFactory extends AbstractRegistrationFactory { + + @Override + public Registration create(String serviceName, URL url, ApplicationContext applicationContext) { + return new DelegatingRegistration(createServiceInstance(serviceName, url)); + } +} diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DubboRegistration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DelegatingRegistration.java similarity index 94% rename from spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DubboRegistration.java rename to spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DelegatingRegistration.java index 9a435ff2..e91831dd 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DubboRegistration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/DelegatingRegistration.java @@ -27,11 +27,11 @@ import java.util.Map; * * @author Mercy */ -class DubboRegistration implements Registration { +class DelegatingRegistration implements Registration { private final ServiceInstance delegate; - public DubboRegistration(ServiceInstance delegate) { + public DelegatingRegistration(ServiceInstance delegate) { this.delegate = delegate; } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/RegistrationFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/RegistrationFactory.java new file mode 100644 index 00000000..7d8d298c --- /dev/null +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/RegistrationFactory.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 + * + * http://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 org.springframework.cloud.alibaba.dubbo.registry; + +import com.alibaba.dubbo.common.URL; + +import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.context.ApplicationContext; + + +/** + * {@link Registration} Factory to createServiceInstance a instance of {@link Registration} + * + * @param The subclass of {@link Registration} + * @author Mercy + */ +public interface RegistrationFactory { + + /** + * Create a instance of {@link T} + * + * @param serviceName The service name of Dubbo service interface + * @param url The Dubbo's URL + * @param applicationContext {@link ApplicationContext} + * @return a instance of {@link T} + */ + T create(String serviceName, URL url, ApplicationContext applicationContext); +} diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java index 8d05cbd0..e02d1083 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java @@ -18,7 +18,7 @@ package org.springframework.cloud.alibaba.dubbo.registry; import com.alibaba.dubbo.common.Constants; import com.alibaba.dubbo.common.URL; -import com.alibaba.dubbo.common.utils.NetUtils; +import com.alibaba.dubbo.common.utils.NamedThreadFactory; import com.alibaba.dubbo.common.utils.UrlUtils; import com.alibaba.dubbo.registry.NotifyListener; import com.alibaba.dubbo.registry.RegistryFactory; @@ -26,11 +26,12 @@ import com.alibaba.dubbo.registry.support.FailbackRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.client.serviceregistry.ServiceRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.core.ResolvableType; import org.springframework.util.StringUtils; import java.util.ArrayList; @@ -38,11 +39,9 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Objects; -import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -50,6 +49,13 @@ import static com.alibaba.dubbo.common.Constants.CONFIGURATORS_CATEGORY; import static com.alibaba.dubbo.common.Constants.CONSUMERS_CATEGORY; import static com.alibaba.dubbo.common.Constants.PROVIDERS_CATEGORY; import static com.alibaba.dubbo.common.Constants.ROUTERS_CATEGORY; +import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; +import static org.springframework.beans.BeanUtils.instantiateClass; +import static org.springframework.core.ResolvableType.forInstance; +import static org.springframework.core.ResolvableType.forType; +import static org.springframework.core.io.support.SpringFactoriesLoader.loadFactoryNames; +import static org.springframework.util.ClassUtils.isPresent; +import static org.springframework.util.ClassUtils.resolveClassName; /** * Dubbo {@link RegistryFactory} uses Spring Cloud Service Registration abstraction, whose protocol is "spring-cloud" @@ -70,10 +76,6 @@ public class SpringCloudRegistry extends FailbackRegistry { private static final int CATEGORY_INDEX = 0; -// private static final int PROTOCOL_INDEX = CATEGORY_INDEX + 1; - -// private static final int SERVICE_INTERFACE_INDEX = PROTOCOL_INDEX + 1; - private static final int SERVICE_INTERFACE_INDEX = CATEGORY_INDEX + 1; private static final int SERVICE_VERSION_INDEX = SERVICE_INTERFACE_INDEX + 1; @@ -82,34 +84,122 @@ public class SpringCloudRegistry extends FailbackRegistry { private static final String WILDCARD = "*"; + private final Logger logger = LoggerFactory.getLogger(getClass()); + /** * The separator for service name */ private static final String SERVICE_NAME_SEPARATOR = ":"; + private final ApplicationContext applicationContext; + private final ServiceRegistry serviceRegistry; private final DiscoveryClient discoveryClient; - private final Logger logger = LoggerFactory.getLogger(getClass()); + private final RegistrationFactory registrationFactory; /** - * {@link ScheduledExecutorService} lookup service names(only for Dubbo-OPS) + * The {@link ScheduledExecutorService Scheduler} to lookup the registered services */ - private volatile ScheduledExecutorService scheduledExecutorService; + private final ScheduledExecutorService registeredServicesLookupScheduler; + + /** + * The {@link ScheduledExecutorService Scheduler} to lookup all services (only for Dubbo-OPS) + */ + private volatile ScheduledExecutorService allServicesLookupScheduler; /** * The interval in second of lookup service names(only for Dubbo-OPS) */ - private static final long LOOKUP_INTERVAL = Long.getLong("dubbo.service.names.lookup.interval", 30); + private static final long ALL_SERVICES_LOOKUP_INTERVAL = Long.getLong("dubbo.all.services.lookup.interval", 30); - public SpringCloudRegistry(URL url, ServiceRegistry serviceRegistry, - DiscoveryClient discoveryClient) { + /** + * The interval in second of lookup regigered service instances + */ + private static final long REGISTERED_SERVICES_LOOKUP_INTERVAL = Long.getLong("dubbo.registered.services.lookup.interval", 30); + + public SpringCloudRegistry(URL url, ApplicationContext applicationContext) { super(url); - this.serviceRegistry = serviceRegistry; - this.discoveryClient = discoveryClient; + this.applicationContext = applicationContext; + this.serviceRegistry = applicationContext.getBean(ServiceRegistry.class); + this.registrationFactory = buildRegistrationFactory(serviceRegistry, applicationContext.getClassLoader()); + this.discoveryClient = applicationContext.getBean(DiscoveryClient.class); + applicationContext.getClassLoader(); + this.registeredServicesLookupScheduler = newSingleThreadScheduledExecutor(new NamedThreadFactory("dubbo-registered-services-lookup-")); } + private RegistrationFactory buildRegistrationFactory(ServiceRegistry serviceRegistry, + ClassLoader classLoader) { + RegistrationFactory registrationFactory = null; + List factoryClassNames = loadFactoryNames(RegistrationFactory.class, classLoader); + + ResolvableType serviceRegistryType = forInstance(serviceRegistry); + // Get first generic Class + Class registrationClass = resolveGenericClass(serviceRegistryType, ServiceRegistry.class, 0); + + for (String factoryClassName : factoryClassNames) { + if (isPresent(factoryClassName, classLoader)) { // ignore compilation issue + Class factoryClass = resolveClassName(factoryClassName, classLoader); + ResolvableType registrationFactoryType = forType(factoryClass); + Class actualRegistrationClass = resolveGenericClass(registrationFactoryType, RegistrationFactory.class, 0); + if (actualRegistrationClass.equals(registrationClass)) { + registrationFactory = (RegistrationFactory) instantiateClass(registrationFactoryType.getRawClass()); + break; + } + } + } + + if (registrationFactory == null) { + + if (logger.isWarnEnabled()) { + logger.warn("{} implementation can't be resolved by ServiceRegistry[{}]", + registrationClass.getSimpleName(), serviceRegistry.getClass().getName()); + } + + registrationFactory = new DefaultRegistrationFactory(); + } else { + if (logger.isInfoEnabled()) { + logger.info("{} has been resolved by ServiceRegistry[{}]", + registrationFactory.getClass().getName(), serviceRegistry.getClass().getName()); + } + } + + return registrationFactory; + } + + private Class resolveGenericClass(ResolvableType implementedType, Class interfaceClass, int index) { + + ResolvableType resolvableType = implementedType; + + OUTER: + while (true) { + + ResolvableType[] interfaceTypes = resolvableType.getInterfaces(); + + for (ResolvableType interfaceType : interfaceTypes) { + if (interfaceType.resolve().equals(interfaceClass)) { + resolvableType = interfaceType; + break OUTER; + } + } + + ResolvableType superType = resolvableType.getSuperType(); + + Class superClass = superType.resolve(); + + if (Object.class.equals(superClass)) { + break; + } + + resolvableType = superType; + } + + + return resolvableType.resolveGeneric(index); + } + + @Override protected void doRegister(URL url) { final String serviceName = getServiceName(url); @@ -128,6 +218,12 @@ public class SpringCloudRegistry extends FailbackRegistry { protected void doSubscribe(URL url, NotifyListener listener) { List serviceNames = getServiceNames(url, listener); doSubscribe(url, listener, serviceNames); + this.registeredServicesLookupScheduler.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + doSubscribe(url, listener, serviceNames); + } + }, REGISTERED_SERVICES_LOOKUP_INTERVAL, REGISTERED_SERVICES_LOOKUP_INTERVAL, TimeUnit.SECONDS); } @Override @@ -135,6 +231,10 @@ public class SpringCloudRegistry extends FailbackRegistry { if (isAdminProtocol(url)) { shutdownServiceNamesLookup(); } + + if (registeredServicesLookupScheduler != null) { + registeredServicesLookupScheduler.shutdown(); + } } @Override @@ -143,25 +243,13 @@ public class SpringCloudRegistry extends FailbackRegistry { } private void shutdownServiceNamesLookup() { - if (scheduledExecutorService != null) { - scheduledExecutorService.shutdown(); + if (allServicesLookupScheduler != null) { + allServicesLookupScheduler.shutdown(); } } private Registration createRegistration(String serviceName, URL url) { - return new DubboRegistration(createServiceInstance(serviceName, url)); - } - - private ServiceInstance createServiceInstance(String serviceName, URL url) { - // Append default category if absent - String category = url.getParameter(Constants.CATEGORY_KEY, Constants.DEFAULT_CATEGORY); - URL newURL = url.addParameter(Constants.CATEGORY_KEY, category); - newURL = newURL.addParameter(Constants.PROTOCOL_KEY, url.getProtocol()); - String ip = NetUtils.getLocalHost(); - int port = newURL.getParameter(Constants.BIND_PORT_KEY, url.getPort()); - DefaultServiceInstance serviceInstance = new DefaultServiceInstance(serviceName, ip, port, false); - serviceInstance.getMetadata().putAll(new LinkedHashMap<>(newURL.getParameters())); - return serviceInstance; + return registrationFactory.create(serviceName, url, applicationContext); } public static String getServiceName(URL url) { @@ -248,10 +336,6 @@ public class SpringCloudRegistry extends FailbackRegistry { return segments[CATEGORY_INDEX]; } -// public static String getProtocol(String[] segments) { -// return segments[PROTOCOL_INDEX]; -// } - public static String getServiceInterface(String[] segments) { return segments[SERVICE_INTERFACE_INDEX]; } @@ -288,7 +372,7 @@ public class SpringCloudRegistry extends FailbackRegistry { */ private List getServiceNames(URL url, NotifyListener listener) { if (isAdminProtocol(url)) { - scheduleServiceNamesLookup(url, listener); + initAllServicesLookupScheduler(url, listener); return getServiceNamesForOps(url); } else { return doGetServiceNames(url); @@ -300,10 +384,10 @@ public class SpringCloudRegistry extends FailbackRegistry { return Constants.ADMIN_PROTOCOL.equals(url.getProtocol()); } - private void scheduleServiceNamesLookup(final URL url, final NotifyListener listener) { - if (scheduledExecutorService == null) { - scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); - scheduledExecutorService.scheduleAtFixedRate(new Runnable() { + private void initAllServicesLookupScheduler(final URL url, final NotifyListener listener) { + if (allServicesLookupScheduler == null) { + allServicesLookupScheduler = newSingleThreadScheduledExecutor(new NamedThreadFactory("dubbo-all-services-lookup-")); + allServicesLookupScheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { List serviceNames = getAllServiceNames(); @@ -323,7 +407,7 @@ public class SpringCloudRegistry extends FailbackRegistry { }); doSubscribe(url, listener, serviceNames); } - }, LOOKUP_INTERVAL, LOOKUP_INTERVAL, TimeUnit.SECONDS); + }, ALL_SERVICES_LOOKUP_INTERVAL, ALL_SERVICES_LOOKUP_INTERVAL, TimeUnit.SECONDS); } } @@ -331,7 +415,6 @@ public class SpringCloudRegistry extends FailbackRegistry { for (String serviceName : serviceNames) { List serviceInstances = discoveryClient.getInstances(serviceName); notifySubscriber(url, listener, serviceInstances); - // TODO Support Update notification event } } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistryFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistryFactory.java index 7402ff97..7b0a9169 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistryFactory.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistryFactory.java @@ -20,9 +20,6 @@ import com.alibaba.dubbo.common.URL; import com.alibaba.dubbo.registry.Registry; import com.alibaba.dubbo.registry.RegistryFactory; -import org.springframework.cloud.client.discovery.DiscoveryClient; -import org.springframework.cloud.client.serviceregistry.Registration; -import org.springframework.cloud.client.serviceregistry.ServiceRegistry; import org.springframework.context.ApplicationContext; /** @@ -38,9 +35,7 @@ public class SpringCloudRegistryFactory implements RegistryFactory { @Override public Registry getRegistry(URL url) { - ServiceRegistry serviceRegistry = applicationContext.getBean(ServiceRegistry.class); - DiscoveryClient discoveryClient = applicationContext.getBean(DiscoveryClient.class); - return new SpringCloudRegistry(url, serviceRegistry, discoveryClient); + return new SpringCloudRegistry(url, applicationContext); } public static void setApplicationContext(ApplicationContext applicationContext) { diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/apache/zookeeper/ZookeeperRegistrationFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/apache/zookeeper/ZookeeperRegistrationFactory.java new file mode 100644 index 00000000..77becb0e --- /dev/null +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/apache/zookeeper/ZookeeperRegistrationFactory.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 + * + * http://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 org.springframework.cloud.alibaba.dubbo.registry.apache.zookeeper; + +import com.alibaba.dubbo.common.URL; + +import org.springframework.cloud.alibaba.dubbo.registry.AbstractRegistrationFactory; +import org.springframework.cloud.alibaba.dubbo.registry.RegistrationFactory; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.zookeeper.discovery.ZookeeperInstance; +import org.springframework.cloud.zookeeper.serviceregistry.ServiceInstanceRegistration; +import org.springframework.cloud.zookeeper.serviceregistry.ZookeeperRegistration; +import org.springframework.context.ApplicationContext; + +/** + * Zookeeper {@link RegistrationFactory} + * + * @author Mercy + */ +public class ZookeeperRegistrationFactory extends AbstractRegistrationFactory { + + @Override + public ZookeeperRegistration create(String serviceName, URL url, ApplicationContext applicationContext) { + + ServiceInstance serviceInstance = createServiceInstance(serviceName, url); + + ZookeeperInstance zookeeperInstance = new ZookeeperInstance(serviceInstance.getInstanceId(), + serviceInstance.getServiceId(), serviceInstance.getMetadata()); + + ZookeeperRegistration registration = ServiceInstanceRegistration + .builder() + .address(serviceInstance.getHost()) + .name(serviceInstance.getServiceId()) + .payload(zookeeperInstance) + .port(serviceInstance.getPort()) + .build(); + + return registration; + } +} diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/netflix/eureka/EurekaRegistrationFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/netflix/eureka/EurekaRegistrationFactory.java new file mode 100644 index 00000000..af54039a --- /dev/null +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/netflix/eureka/EurekaRegistrationFactory.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 + * + * http://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 org.springframework.cloud.alibaba.dubbo.registry.netflix.eureka; + +import com.alibaba.dubbo.common.URL; + +import com.netflix.appinfo.HealthCheckHandler; +import com.netflix.discovery.EurekaClientConfig; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.cloud.alibaba.dubbo.registry.AbstractRegistrationFactory; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.cloud.netflix.eureka.CloudEurekaInstanceConfig; +import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean; +import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration; +import org.springframework.context.ApplicationContext; + +/** + * {@link EurekaRegistration} Factory + * + * @author Mercy + */ +public class EurekaRegistrationFactory extends AbstractRegistrationFactory { + + @Override + public EurekaRegistration create(String serviceName, URL url, ApplicationContext applicationContext) { + ServiceInstance serviceInstance = createServiceInstance(serviceName, url); + CloudEurekaInstanceConfig cloudEurekaInstanceConfig = applicationContext.getBean(CloudEurekaInstanceConfig.class); + ObjectProvider healthCheckHandler = applicationContext.getBeanProvider(HealthCheckHandler.class); + EurekaClientConfig eurekaClientConfig = applicationContext.getBean(EurekaClientConfig.class); + InetUtils inetUtils = applicationContext.getBean(InetUtils.class); + EurekaInstanceConfigBean eurekaInstanceConfigBean = new EurekaInstanceConfigBean(inetUtils); + BeanUtils.copyProperties(cloudEurekaInstanceConfig, eurekaInstanceConfigBean); + String serviceId = serviceInstance.getServiceId(); + eurekaInstanceConfigBean.setInstanceId(serviceInstance.getInstanceId()); + eurekaInstanceConfigBean.setVirtualHostName(serviceId); + eurekaInstanceConfigBean.setSecureVirtualHostName(serviceId); + eurekaInstanceConfigBean.setAppname(serviceId); + eurekaInstanceConfigBean.setHostname(serviceInstance.getHost()); + eurekaInstanceConfigBean.setMetadataMap(serviceInstance.getMetadata()); + + return EurekaRegistration.builder(eurekaInstanceConfigBean) + .with(healthCheckHandler) + .with(eurekaClientConfig, applicationContext) + .build(); + } +} diff --git a/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories index 516f25f6..c18edcd5 100644 --- a/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories @@ -6,4 +6,9 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.cloud.alibaba.dubbo.autoconfigure.DubboServiceAutoConfiguration org.springframework.context.ApplicationContextInitializer=\ - org.springframework.cloud.alibaba.dubbo.context.DubboServiceRegistrationApplicationContextInitializer \ No newline at end of file + org.springframework.cloud.alibaba.dubbo.context.DubboServiceRegistrationApplicationContextInitializer + +org.springframework.cloud.alibaba.dubbo.registry.RegistrationFactory=\ + org.springframework.cloud.alibaba.dubbo.registry.DefaultRegistrationFactory,\ + org.springframework.cloud.alibaba.dubbo.registry.netflix.eureka.EurekaRegistrationFactory,\ + org.springframework.cloud.alibaba.dubbo.registry.apache.zookeeper.ZookeeperRegistrationFactory \ No newline at end of file diff --git a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudBootstrap.java b/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudBootstrap.java deleted file mode 100644 index 48566585..00000000 --- a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudBootstrap.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 - * - * http://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 org.springframework.cloud.alibaba.dubbo.bootstrap; - -import com.alibaba.dubbo.config.annotation.Reference; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.ApplicationRunner; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.cloud.alibaba.dubbo.annotation.DubboTransported; -import org.springframework.cloud.alibaba.dubbo.service.RestService; -import org.springframework.cloud.alibaba.dubbo.service.User; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Lazy; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import java.util.HashMap; -import java.util.Map; - -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; - -/** - * Dubbo Spring Cloud Bootstrap - */ -@EnableDiscoveryClient -@EnableAutoConfiguration -@EnableFeignClients -@RestController -public class DubboSpringCloudBootstrap { - - @Reference(version = "1.0.0") - private RestService restService; - - @Autowired - @Lazy - private FeignRestService feignRestService; - - @Autowired - @Lazy - private DubboFeignRestService dubboFeignRestService; - - @Autowired - @LoadBalanced - private RestTemplate restTemplate; - - @FeignClient("spring-cloud-alibaba-dubbo") - public interface FeignRestService { - - @GetMapping(value = "/param") - String param(@RequestParam("param") String param); - - @PostMapping("/params") - public String params(@RequestParam("b") String b, @RequestParam("a") int a); - - @PostMapping(value = "/request/body/map", produces = APPLICATION_JSON_UTF8_VALUE) - User requestBody(@RequestParam("param") String param, @RequestBody Map data); - - @GetMapping("/headers") - @Path("/headers") - @GET - public String headers(@RequestHeader("h2") String header2, - @RequestHeader("h") String header, - @RequestParam("v") Integer value); - - @GetMapping("/path-variables/{p1}/{p2}") - public String pathVariables(@PathVariable("p2") String path2, - @PathVariable("p1") String path1, - @RequestParam("v") String param); - } - - @FeignClient("spring-cloud-alibaba-dubbo") - @DubboTransported - public interface DubboFeignRestService { - - @GetMapping(value = "/param") - String param(@RequestParam("param") String param); - - @PostMapping("/params") - String params(@RequestParam("b") String paramB, @RequestParam("a") int paramA); - - @PostMapping(value = "/request/body/map", produces = APPLICATION_JSON_UTF8_VALUE) - User requestBody(@RequestParam("param") String param, @RequestBody Map data); - - @GetMapping("/headers") - @Path("/headers") - @GET - public String headers(@RequestHeader("h2") String header2, - @RequestParam("v") Integer value, - @RequestHeader("h") String header); - - @GetMapping("/path-variables/{p1}/{p2}") - public String pathVariables(@RequestParam("v") String param, - @PathVariable("p2") String path2, - @PathVariable("p1") String path1); - } - - - @Bean - public ApplicationRunner paramRunner() { - return arguments -> { - - // To call /path-variables - callPathVariables(); - - // To call /headers - callHeaders(); - - // To call /param - callParam(); - - // To call /params - callParams(); - - // To call /request/body/map - callRequestBodyMap(); - - }; - } - - private void callPathVariables() { - // Dubbo Service call - System.out.println(restService.pathVariables("a", "b", "c")); - // Spring Cloud Open Feign REST Call (Dubbo Transported) - System.out.println(dubboFeignRestService.pathVariables("c", "b", "a")); - // Spring Cloud Open Feign REST Call - System.out.println(feignRestService.pathVariables("b", "a", "c")); - - // RestTemplate call - System.out.println(restTemplate.getForEntity("http://spring-cloud-alibaba-dubbo//path-variables/{p1}/{p2}?v=c", String.class, "a", "b")); - } - - private void callHeaders() { - // Dubbo Service call - System.out.println(restService.headers("a", "b", 10)); - // Spring Cloud Open Feign REST Call (Dubbo Transported) - System.out.println(dubboFeignRestService.headers("b", 10, "a")); - // Spring Cloud Open Feign REST Call - System.out.println(feignRestService.headers("b", "a", 10)); - } - - private void callParam() { - // Dubbo Service call - System.out.println(restService.param("mercyblitz")); - // Spring Cloud Open Feign REST Call (Dubbo Transported) - System.out.println(dubboFeignRestService.param("mercyblitz")); - // Spring Cloud Open Feign REST Call - System.out.println(feignRestService.param("mercyblitz")); - } - - private void callParams() { - // Dubbo Service call - System.out.println(restService.params(1, "1")); - // Spring Cloud Open Feign REST Call (Dubbo Transported) - System.out.println(dubboFeignRestService.params("1", 1)); - // Spring Cloud Open Feign REST Call - System.out.println(feignRestService.params("1", 1)); - - // RestTemplate call - System.out.println(restTemplate.getForEntity("http://spring-cloud-alibaba-dubbo/param?param=小马哥", String.class)); - } - - private void callRequestBodyMap() { - - Map data = new HashMap<>(); - data.put("id", 1); - data.put("name", "小马哥"); - data.put("age", 33); - - // Dubbo Service call - System.out.println(restService.requestBodyMap(data, "Hello,World")); - // Spring Cloud Open Feign REST Call (Dubbo Transported) -// System.out.println(dubboFeignRestService.requestBody("Hello,World", data)); -// Spring Cloud Open Feign REST Call - System.out.println(feignRestService.requestBody("Hello,World", data)); - - // RestTemplate call - System.out.println(restTemplate.postForObject("http://spring-cloud-alibaba-dubbo/request/body/map?param=小马哥", data, User.class)); - } - - @Bean - @LoadBalanced - @DubboTransported - public RestTemplate restTemplate() { - return new RestTemplate(); - } - - public static void main(String[] args) { - new SpringApplicationBuilder(DubboSpringCloudBootstrap.class) - .run(args); - } -} - - - diff --git a/spring-cloud-alibaba-dubbo/src/test/resources/application.yaml b/spring-cloud-alibaba-dubbo/src/test/resources/application.yaml index e3867ace..2b3eb54e 100644 --- a/spring-cloud-alibaba-dubbo/src/test/resources/application.yaml +++ b/spring-cloud-alibaba-dubbo/src/test/resources/application.yaml @@ -7,7 +7,7 @@ dubbo: port: 12345 rest: name: rest - port: 9090 + port: 8081 server: netty registry: address: spring-cloud://nacos diff --git a/spring-cloud-alibaba-dubbo/src/test/resources/bootstrap.yaml b/spring-cloud-alibaba-dubbo/src/test/resources/bootstrap.yaml index e21e07da..9b1aad42 100644 --- a/spring-cloud-alibaba-dubbo/src/test/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-dubbo/src/test/resources/bootstrap.yaml @@ -7,6 +7,9 @@ spring: server-addr: 127.0.0.1:8848 config: server-addr: 127.0.0.1:8848 + zookeeper: + enabled: false + main: allow-bean-definition-overriding: true @@ -27,4 +30,18 @@ eureka: client: enabled: true service-url: - defaultZone: http://127.0.0.1:8761/eureka/ \ No newline at end of file + defaultZone: http://localhost:9090/eureka/ + +--- +spring: + profiles: zookeeper + + cloud: + nacos: + discovery: + enabled: false + register-enabled: false + + zookeeper: + enabled: true + connect-string: localhost:2181 \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java new file mode 100644 index 00000000..03e24633 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 + * + * http://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 org.springframework.cloud.alibaba.dubbo.bootstrap; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * Dubbo Spring Cloud Provider Bootstrap + */ +@EnableDiscoveryClient +@EnableAutoConfiguration +public class DubboSpringCloudProviderBootstrap { + + public static void main(String[] args) { + new SpringApplicationBuilder(DubboSpringCloudProviderBootstrap.class) + .run(args); + } +} + + + diff --git a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java similarity index 94% rename from spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java rename to spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java index 0c512f66..642fdb0d 100644 --- a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/service/StandardRestService.java @@ -20,6 +20,7 @@ import com.alibaba.dubbo.rpc.RpcContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -40,7 +41,6 @@ import javax.ws.rs.QueryParam; import java.util.HashMap; import java.util.Map; -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON_VALUE; /** @@ -109,7 +109,7 @@ public class StandardRestService implements RestService { } @Override - @PostMapping(value = "/request/body/map", produces = APPLICATION_JSON_UTF8_VALUE) + @PostMapping(value = "/request/body/map", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Path("/request/body/map") @POST @Produces(APPLICATION_JSON_VALUE) @@ -122,11 +122,11 @@ public class StandardRestService implements RestService { return user; } - @PostMapping(value = "/request/body/user", consumes = APPLICATION_JSON_UTF8_VALUE) + @PostMapping(value = "/request/body/user", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) @Path("/request/body/user") @POST @Override - @Consumes(APPLICATION_JSON_UTF8_VALUE) + @Consumes(MediaType.APPLICATION_JSON_UTF8_VALUE) public Map requestBodyUser(@RequestBody User user) { Map map = new HashMap<>(); map.put("id", user.getId()); diff --git a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java similarity index 98% rename from spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java rename to spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java index 35d6755d..442a0a9a 100644 --- a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/service/RestService.java @@ -19,7 +19,7 @@ package org.springframework.cloud.alibaba.dubbo.service; import java.util.Map; /** - * Echo Service + * Rest Service * * @author Mercy */ @@ -38,5 +38,4 @@ public interface RestService { User requestBodyMap(Map data, String param); Map requestBodyUser(User user); - } diff --git a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/User.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/service/User.java similarity index 94% rename from spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/User.java rename to spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/service/User.java index 79d54107..f91caba3 100644 --- a/spring-cloud-alibaba-dubbo/src/test/java/org/springframework/cloud/alibaba/dubbo/service/User.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/src/main/java/org/springframework/cloud/alibaba/dubbo/service/User.java @@ -16,21 +16,19 @@ */ package org.springframework.cloud.alibaba.dubbo.service; -import javax.ws.rs.FormParam; import java.io.Serializable; /** * User Entity + * + * @author Mercy */ public class User implements Serializable { - @FormParam("id") private Long id; - @FormParam("name") private String name; - @FormParam("age") private Integer age; public Long getId() { From 21f3451f7b2223a35ea4f57549020b39cdfe27bc Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Tue, 26 Feb 2019 14:52:47 +0800 Subject: [PATCH 19/33] Polish : spring-cloud-incubator/spring-cloud-alibaba/issues#387 : Add Dubbo Spring Cloud Samples --- spring-cloud-alibaba-examples/pom.xml | 1 + .../pom.xml | 178 ++++++++++++++ .../pom.xml | 38 +++ .../DubboSpringCloudConsumerBootstrap.java | 217 ++++++++++++++++++ .../src/main/resources/application.yaml | 5 + .../src/main/resources/bootstrap.yaml | 51 ++++ .../pom.xml | 65 ++++++ .../src/main/resources/application.yaml | 20 ++ .../src/main/resources/bootstrap.yaml | 47 ++++ .../spring-cloud-dubbo-sample-api/pom.xml | 16 ++ 10 files changed, 638 insertions(+) create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/pom.xml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml create mode 100644 spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/pom.xml diff --git a/spring-cloud-alibaba-examples/pom.xml b/spring-cloud-alibaba-examples/pom.xml index 31e8ca5e..91452590 100644 --- a/spring-cloud-alibaba-examples/pom.xml +++ b/spring-cloud-alibaba-examples/pom.xml @@ -37,6 +37,7 @@ rocketmq-example spring-cloud-bus-rocketmq-example schedulerx-example/schedulerx-simple-task-example + spring-cloud-alibaba-dubbo-examples diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml new file mode 100644 index 00000000..65bc560f --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml @@ -0,0 +1,178 @@ + + + + spring-cloud-alibaba-examples + org.springframework.cloud + 0.2.2.BUILD-SNAPSHOT + ../pom.xml + + 4.0.0 + + org.springframework.cloud + spring-cloud-alibaba-dubbo-examples + Spring Cloud Alibaba Dubbo Examples + pom + + + spring-cloud-dubbo-sample-api + spring-cloud-dubbo-provider-sample + spring-cloud-dubbo-consumer-sample + + + + 2.6.5 + 0.2.1.RELEASE + 0.0.2 + 2.1.0.RELEASE + 4.0.1 + + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + com.alibaba + dubbo-dependencies-bom + ${dubbo.version} + pom + import + + + + + + + + + + org.springframework.boot + spring-boot-actuator-autoconfigure + + + + org.springframework.boot + spring-boot-configuration-processor + + + + org.springframework.boot + spring-boot + + + + org.springframework.boot + spring-boot-autoconfigure + true + + + + + org.springframework.cloud + spring-cloud-commons + + + + org.springframework.cloud + spring-cloud-context + + + + + org.springframework.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + true + + + + + org.springframework.cloud + spring-cloud-starter-zookeeper-discovery + ${spring-cloud-zookeeper.version} + true + + + org.apache.zookeeper + zookeeper + + + + + + org.apache.zookeeper + zookeeper + 3.4.12 + true + + + org.slf4j + slf4j-log4j12 + + + + + + org.apache.curator + curator-framework + ${curator.version} + true + + + + + org.springframework.cloud + spring-cloud-starter-dubbo + ${project.version} + + + + + + + + + nacos + + true + + + + + + + + eureka + + + + + + + + zookeeper + + + + + + + + + \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/pom.xml new file mode 100644 index 00000000..5a0debd1 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/pom.xml @@ -0,0 +1,38 @@ + + + + spring-cloud-alibaba-dubbo-examples + org.springframework.cloud + 0.2.2.BUILD-SNAPSHOT + ../pom.xml + + 4.0.0 + + org.springframework.cloud + spring-cloud-dubbo-consumer-sample + Spring Cloud Dubbo Consumer Sample + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.cloud + spring-cloud-dubbo-sample-api + ${project.version} + + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java new file mode 100644 index 00000000..5933a281 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java @@ -0,0 +1,217 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 + * + * http://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 org.springframework.cloud.alibaba.dubbo.bootstrap; + +import com.alibaba.dubbo.config.annotation.Reference; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.alibaba.dubbo.annotation.DubboTransported; +import org.springframework.cloud.alibaba.dubbo.service.RestService; +import org.springframework.cloud.alibaba.dubbo.service.User; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Lazy; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; + +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; + +/** + * Dubbo Spring Cloud Consumer Bootstrap + */ +@EnableDiscoveryClient +@EnableAutoConfiguration +@EnableFeignClients +public class DubboSpringCloudConsumerBootstrap { + + @Reference(version = "1.0.0") + private RestService restService; + + @Autowired + @Lazy + private FeignRestService feignRestService; + + @Autowired + @Lazy + private DubboFeignRestService dubboFeignRestService; + + @Value("${provider.application.name}") + private String providerApplicationName; + + @Autowired + @LoadBalanced + private RestTemplate restTemplate; + + @FeignClient("${provider.application.name}") + public interface FeignRestService { + + @GetMapping(value = "/param") + String param(@RequestParam("param") String param); + + @PostMapping("/params") + public String params(@RequestParam("b") String b, @RequestParam("a") int a); + + @PostMapping(value = "/request/body/map", produces = APPLICATION_JSON_UTF8_VALUE) + User requestBody(@RequestParam("param") String param, @RequestBody Map data); + + @GetMapping("/headers") + public String headers(@RequestHeader("h2") String header2, + @RequestHeader("h") String header, + @RequestParam("v") Integer value); + + @GetMapping("/path-variables/{p1}/{p2}") + public String pathVariables(@PathVariable("p2") String path2, + @PathVariable("p1") String path1, + @RequestParam("v") String param); + } + + @FeignClient("${provider.application.name}") + @DubboTransported + public interface DubboFeignRestService { + + @GetMapping(value = "/param") + String param(@RequestParam("param") String param); + + @PostMapping("/params") + String params(@RequestParam("b") String paramB, @RequestParam("a") int paramA); + + @PostMapping(value = "/request/body/map", produces = APPLICATION_JSON_UTF8_VALUE) + User requestBody(@RequestParam("param") String param, @RequestBody Map data); + + @GetMapping("/headers") + public String headers(@RequestHeader("h2") String header2, + @RequestParam("v") Integer value, + @RequestHeader("h") String header); + + @GetMapping("/path-variables/{p1}/{p2}") + public String pathVariables(@RequestParam("v") String param, + @PathVariable("p2") String path2, + @PathVariable("p1") String path1); + } + + @Bean + public ApplicationRunner paramRunner() { + return arguments -> { + + // To call /path-variables + callPathVariables(); + + // To call /headers + callHeaders(); + + // To call /param + callParam(); +// +// // To call /params +// callParams(); +// +// // To call /request/body/map +// callRequestBodyMap(); + + }; + } + + private void callPathVariables() { + // Dubbo Service call + System.out.println(restService.pathVariables("a", "b", "c")); + // Spring Cloud Open Feign REST Call (Dubbo Transported) + System.out.println(dubboFeignRestService.pathVariables("c", "b", "a")); + // Spring Cloud Open Feign REST Call + System.out.println(feignRestService.pathVariables("b", "a", "c")); + + // RestTemplate call + System.out.println(restTemplate.getForEntity("http://" + providerApplicationName + "//path-variables/{p1}/{p2}?v=c", String.class, "a", "b")); + } + + private void callHeaders() { + // Dubbo Service call + System.out.println(restService.headers("a", "b", 10)); + // Spring Cloud Open Feign REST Call (Dubbo Transported) + System.out.println(dubboFeignRestService.headers("b", 10, "a")); + // Spring Cloud Open Feign REST Call + System.out.println(feignRestService.headers("b", "a", 10)); + } + + private void callParam() { + // Dubbo Service call + System.out.println(restService.param("mercyblitz")); + // Spring Cloud Open Feign REST Call (Dubbo Transported) + System.out.println(dubboFeignRestService.param("mercyblitz")); + // Spring Cloud Open Feign REST Call + System.out.println(feignRestService.param("mercyblitz")); + } + + private void callParams() { + // Dubbo Service call + System.out.println(restService.params(1, "1")); + // Spring Cloud Open Feign REST Call (Dubbo Transported) + System.out.println(dubboFeignRestService.params("1", 1)); + // Spring Cloud Open Feign REST Call + System.out.println(feignRestService.params("1", 1)); + + // RestTemplate call + System.out.println(restTemplate.getForEntity("http://" + providerApplicationName + "/param?param=小马哥", String.class)); + } + + private void callRequestBodyMap() { + + Map data = new HashMap<>(); + data.put("id", 1); + data.put("name", "小马哥"); + data.put("age", 33); + + // Dubbo Service call + System.out.println(restService.requestBodyMap(data, "Hello,World")); + // Spring Cloud Open Feign REST Call (Dubbo Transported) +// System.out.println(dubboFeignRestService.requestBody("Hello,World", data)); +// Spring Cloud Open Feign REST Call + System.out.println(feignRestService.requestBody("Hello,World", data)); + + // RestTemplate call + System.out.println(restTemplate.postForObject("http://" + providerApplicationName + "/request/body/map?param=小马哥", data, User.class)); + } + + @Bean + @LoadBalanced + @DubboTransported + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + public static void main(String[] args) { + new SpringApplicationBuilder(DubboSpringCloudConsumerBootstrap.class) + .run(args); + } +} + + + diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml new file mode 100644 index 00000000..83d0d835 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml @@ -0,0 +1,5 @@ +dubbo: + registry: + address: spring-cloud://nacos +server: + port: 7070 \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml new file mode 100644 index 00000000..d4db17e6 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml @@ -0,0 +1,51 @@ +spring: + application: + name: spring-cloud-alibaba-dubbo-consumer + cloud: + nacos: + discovery: + server-addr: 127.0.0.1:8848 + config: + server-addr: 127.0.0.1:8848 + zookeeper: + enabled: false + + main: + allow-bean-definition-overriding: true + +eureka: + client: + enabled: false + +provider: + application: + name: spring-cloud-alibaba-dubbo-provider + +--- +spring: + profiles: eureka + cloud: + nacos: + discovery: + enabled: false + register-enabled: false + +eureka: + client: + enabled: true + service-url: + defaultZone: http://localhost:9090/eureka/ + +--- +spring: + profiles: zookeeper + + cloud: + nacos: + discovery: + enabled: false + register-enabled: false + + zookeeper: + enabled: true + connect-string: localhost:2181 \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml new file mode 100644 index 00000000..9ebd00a1 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/pom.xml @@ -0,0 +1,65 @@ + + + + spring-cloud-alibaba-dubbo-examples + org.springframework.cloud + 0.2.2.BUILD-SNAPSHOT + ../pom.xml + + 4.0.0 + + org.springframework.cloud + spring-cloud-dubbo-provider-sample + Spring Cloud Dubbo Provider Sample + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.cloud + spring-cloud-dubbo-sample-api + ${project.version} + + + + + org.jboss.resteasy + resteasy-jaxrs + + + + org.jboss.resteasy + resteasy-client + + + + org.jboss.resteasy + resteasy-netty4 + + + + javax.validation + validation-api + + + + org.jboss.resteasy + resteasy-jackson-provider + + + + org.jboss.resteasy + resteasy-jaxb-provider + + + + + \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml new file mode 100644 index 00000000..2b3eb54e --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml @@ -0,0 +1,20 @@ +dubbo: + scan: + base-packages: org.springframework.cloud.alibaba.dubbo.service + protocols: + dubbo: + name: dubbo + port: 12345 + rest: + name: rest + port: 8081 + server: netty + registry: + address: spring-cloud://nacos + +feign: + hystrix: + enabled: true + +server: + port: 8080 \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml new file mode 100644 index 00000000..0cee4797 --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml @@ -0,0 +1,47 @@ +spring: + application: + name: spring-cloud-alibaba-dubbo-provider + cloud: + nacos: + discovery: + server-addr: 127.0.0.1:8848 + config: + server-addr: 127.0.0.1:8848 + zookeeper: + enabled: false + + main: + allow-bean-definition-overriding: true + +eureka: + client: + enabled: false + +--- +spring: + profiles: eureka + cloud: + nacos: + discovery: + enabled: false + register-enabled: false + +eureka: + client: + enabled: true + service-url: + defaultZone: http://localhost:9090/eureka/ + +--- +spring: + profiles: zookeeper + + cloud: + nacos: + discovery: + enabled: false + register-enabled: false + + zookeeper: + enabled: true + connect-string: localhost:2181 \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/pom.xml new file mode 100644 index 00000000..16b74cdb --- /dev/null +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-sample-api/pom.xml @@ -0,0 +1,16 @@ + + + + spring-cloud-alibaba-dubbo-examples + org.springframework.cloud + 0.2.2.BUILD-SNAPSHOT + + 4.0.0 + + org.springframework.cloud + spring-cloud-dubbo-sample-api + Spring Cloud Dubbo Sample API + + \ No newline at end of file From c454294370ba949fa3cdea82a0f9e5f164a63ef5 Mon Sep 17 00:00:00 2001 From: WangTao Date: Tue, 26 Feb 2019 15:49:26 +0800 Subject: [PATCH 20/33] Update NacosDiscoveryProperties.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在截取serverAddr时没有对serverAddr进行再次赋值。 --- .../cloud/alibaba/nacos/NacosDiscoveryProperties.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryProperties.java index 11ea3475..a86b24d6 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryProperties.java @@ -167,7 +167,7 @@ public class NacosDiscoveryProperties { serverAddr = Objects.toString(serverAddr, ""); if (serverAddr.lastIndexOf("/") != -1) { - serverAddr.substring(0, serverAddr.length() - 1); + serverAddr = serverAddr.substring(0, serverAddr.length() - 1); } endpoint = Objects.toString(endpoint, ""); namespace = Objects.toString(namespace, ""); From 8e9398d24fd22e61faa7edcc26aa1e30c6d05cac Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Tue, 26 Feb 2019 16:24:55 +0800 Subject: [PATCH 21/33] Polish : /spring-cloud-incubator/spring-cloud-alibaba#386 : supports Spring Cloud Consul --- spring-cloud-alibaba-dubbo/pom.xml | 85 +++++++++-------- .../dubbo/registry/SpringCloudRegistry.java | 88 +++++++++--------- .../consul/ConsulRegistrationFactory.java | 92 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 3 +- 4 files changed, 188 insertions(+), 80 deletions(-) create mode 100644 spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/hashicorp/consul/ConsulRegistrationFactory.java diff --git a/spring-cloud-alibaba-dubbo/pom.xml b/spring-cloud-alibaba-dubbo/pom.xml index 5dbf37ac..5d51c191 100644 --- a/spring-cloud-alibaba-dubbo/pom.xml +++ b/spring-cloud-alibaba-dubbo/pom.xml @@ -18,6 +18,7 @@ 0.2.1.RELEASE 0.0.2 2.1.0.RELEASE + 2.1.0.RELEASE 4.0.1 @@ -55,6 +56,44 @@ true + + org.springframework.boot + spring-boot-actuator-autoconfigure + true + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.springframework.boot + spring-boot + true + + + + org.springframework.boot + spring-boot-autoconfigure + true + + + + + org.springframework.cloud + spring-cloud-commons + true + + + + org.springframework.cloud + spring-cloud-context + true + + + org.springframework.cloud @@ -96,6 +135,14 @@ true + + + org.springframework.cloud + spring-cloud-starter-consul-discovery + ${spring-cloud-consul.version} + true + + org.springframework.cloud @@ -103,43 +150,7 @@ true - - org.springframework.boot - spring-boot-actuator-autoconfigure - true - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.springframework.boot - spring-boot - true - - - - org.springframework.boot - spring-boot-autoconfigure - true - - - - - org.springframework.cloud - spring-cloud-commons - true - - - - org.springframework.cloud - spring-cloud-context - true - - + org.springframework.cloud spring-cloud-starter-openfeign diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java index e02d1083..30678ed1 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/SpringCloudRegistry.java @@ -49,6 +49,7 @@ import static com.alibaba.dubbo.common.Constants.CONFIGURATORS_CATEGORY; import static com.alibaba.dubbo.common.Constants.CONSUMERS_CATEGORY; import static com.alibaba.dubbo.common.Constants.PROVIDERS_CATEGORY; import static com.alibaba.dubbo.common.Constants.ROUTERS_CATEGORY; +import static java.lang.Long.getLong; import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; import static org.springframework.beans.BeanUtils.instantiateClass; import static org.springframework.core.ResolvableType.forInstance; @@ -84,6 +85,26 @@ public class SpringCloudRegistry extends FailbackRegistry { private static final String WILDCARD = "*"; + /** + * The interval in second of lookup service names(only for Dubbo-OPS) + */ + private static final long ALL_SERVICES_LOOKUP_INTERVAL = getLong("dubbo.all.services.lookup.interval", 30); + + /** + * The interval in second of lookup regigered service instances + */ + private static final long REGISTERED_SERVICES_LOOKUP_INTERVAL = getLong("dubbo.registered.services.lookup.interval", 300); + + /** + * The {@link ScheduledExecutorService Scheduler} to lookup the registered services + */ + private static final ScheduledExecutorService registeredServicesLookupScheduler = newSingleThreadScheduledExecutor(new NamedThreadFactory("dubbo-registered-services-lookup-")); + + /** + * The {@link ScheduledExecutorService Scheduler} to lookup all services (only for Dubbo-OPS) + */ + private static volatile ScheduledExecutorService allServicesLookupScheduler; + private final Logger logger = LoggerFactory.getLogger(getClass()); /** @@ -99,26 +120,6 @@ public class SpringCloudRegistry extends FailbackRegistry { private final RegistrationFactory registrationFactory; - /** - * The {@link ScheduledExecutorService Scheduler} to lookup the registered services - */ - private final ScheduledExecutorService registeredServicesLookupScheduler; - - /** - * The {@link ScheduledExecutorService Scheduler} to lookup all services (only for Dubbo-OPS) - */ - private volatile ScheduledExecutorService allServicesLookupScheduler; - - /** - * The interval in second of lookup service names(only for Dubbo-OPS) - */ - private static final long ALL_SERVICES_LOOKUP_INTERVAL = Long.getLong("dubbo.all.services.lookup.interval", 30); - - /** - * The interval in second of lookup regigered service instances - */ - private static final long REGISTERED_SERVICES_LOOKUP_INTERVAL = Long.getLong("dubbo.registered.services.lookup.interval", 30); - public SpringCloudRegistry(URL url, ApplicationContext applicationContext) { super(url); this.applicationContext = applicationContext; @@ -126,7 +127,6 @@ public class SpringCloudRegistry extends FailbackRegistry { this.registrationFactory = buildRegistrationFactory(serviceRegistry, applicationContext.getClassLoader()); this.discoveryClient = applicationContext.getBean(DiscoveryClient.class); applicationContext.getClassLoader(); - this.registeredServicesLookupScheduler = newSingleThreadScheduledExecutor(new NamedThreadFactory("dubbo-registered-services-lookup-")); } private RegistrationFactory buildRegistrationFactory(ServiceRegistry serviceRegistry, @@ -143,7 +143,7 @@ public class SpringCloudRegistry extends FailbackRegistry { Class factoryClass = resolveClassName(factoryClassName, classLoader); ResolvableType registrationFactoryType = forType(factoryClass); Class actualRegistrationClass = resolveGenericClass(registrationFactoryType, RegistrationFactory.class, 0); - if (actualRegistrationClass.equals(registrationClass)) { + if (registrationClass.equals(actualRegistrationClass)) { registrationFactory = (RegistrationFactory) instantiateClass(registrationFactoryType.getRawClass()); break; } @@ -172,30 +172,34 @@ public class SpringCloudRegistry extends FailbackRegistry { ResolvableType resolvableType = implementedType; - OUTER: - while (true) { + try { + OUTER: + while (true) { - ResolvableType[] interfaceTypes = resolvableType.getInterfaces(); + ResolvableType[] interfaceTypes = resolvableType.getInterfaces(); - for (ResolvableType interfaceType : interfaceTypes) { - if (interfaceType.resolve().equals(interfaceClass)) { - resolvableType = interfaceType; - break OUTER; + for (ResolvableType interfaceType : interfaceTypes) { + if (interfaceType.resolve().equals(interfaceClass)) { + resolvableType = interfaceType; + break OUTER; + } } + + ResolvableType superType = resolvableType.getSuperType(); + + Class superClass = superType.resolve(); + + if (Object.class.equals(superClass)) { + break; + } + + resolvableType = superType; } - ResolvableType superType = resolvableType.getSuperType(); - - Class superClass = superType.resolve(); - - if (Object.class.equals(superClass)) { - break; - } - - resolvableType = superType; + } catch (Throwable e) { + resolvableType = ResolvableType.forType(void.class); } - return resolvableType.resolveGeneric(index); } @@ -232,9 +236,9 @@ public class SpringCloudRegistry extends FailbackRegistry { shutdownServiceNamesLookup(); } - if (registeredServicesLookupScheduler != null) { - registeredServicesLookupScheduler.shutdown(); - } +// if (registeredServicesLookupScheduler != null) { +// registeredServicesLookupScheduler.shutdown(); +// } } @Override diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/hashicorp/consul/ConsulRegistrationFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/hashicorp/consul/ConsulRegistrationFactory.java new file mode 100644 index 00000000..89c19acf --- /dev/null +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/registry/hashicorp/consul/ConsulRegistrationFactory.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 + * + * http://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 org.springframework.cloud.alibaba.dubbo.registry.hashicorp.consul; + +import com.alibaba.dubbo.common.URL; + +import com.ecwid.consul.v1.agent.model.NewService; +import org.springframework.cloud.alibaba.dubbo.registry.AbstractRegistrationFactory; +import org.springframework.cloud.alibaba.dubbo.registry.RegistrationFactory; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties; +import org.springframework.cloud.consul.discovery.ConsulServerUtils; +import org.springframework.cloud.consul.serviceregistry.ConsulRegistration; +import org.springframework.context.ApplicationContext; + +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * {@link ConsulRegistration} {@link RegistrationFactory} implementation + * + * @author Mercy + */ +public class ConsulRegistrationFactory extends AbstractRegistrationFactory { + + @Override + public ConsulRegistration create(String serviceName, URL url, ApplicationContext applicationContext) { + ServiceInstance serviceInstance = createServiceInstance(serviceName, url); + + Map metadata = getMetadata(serviceInstance); + List tags = createTags(metadata); + + NewService service = new NewService(); + service.setId(serviceInstance.getInstanceId()); + service.setName(serviceInstance.getServiceId()); + service.setAddress(serviceInstance.getHost()); + service.setPort(serviceInstance.getPort()); + service.setMeta(metadata); + service.setTags(tags); + + ConsulDiscoveryProperties properties = applicationContext.getBean(ConsulDiscoveryProperties.class); + + ConsulRegistration registration = new ConsulRegistration(service, properties); + return registration; + } + + /** + * @param metadata + * @return + * @see ConsulServerUtils#getMetadata(java.util.List) + */ + private List createTags(Map metadata) { + List tags = new LinkedList<>(); + for (Map.Entry entry : metadata.entrySet()) { + String tag = entry.getKey() + "=" + entry.getValue(); + tags.add(tag); + + } + return tags; + } + + private Map getMetadata(ServiceInstance serviceInstance) { + Map metadata = serviceInstance.getMetadata(); + Set removedKeys = new LinkedHashSet<>(); + for (String key : metadata.keySet()) { + if (key.contains(".")) { + removedKeys.add(key); + } + } + for (String removedKey : removedKeys) { + metadata.remove(removedKey); + } + return metadata; + } +} diff --git a/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories index c18edcd5..f90bb175 100644 --- a/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories @@ -11,4 +11,5 @@ org.springframework.context.ApplicationContextInitializer=\ org.springframework.cloud.alibaba.dubbo.registry.RegistrationFactory=\ org.springframework.cloud.alibaba.dubbo.registry.DefaultRegistrationFactory,\ org.springframework.cloud.alibaba.dubbo.registry.netflix.eureka.EurekaRegistrationFactory,\ - org.springframework.cloud.alibaba.dubbo.registry.apache.zookeeper.ZookeeperRegistrationFactory \ No newline at end of file + org.springframework.cloud.alibaba.dubbo.registry.apache.zookeeper.ZookeeperRegistrationFactory,\ + org.springframework.cloud.alibaba.dubbo.registry.hashicorp.consul.ConsulRegistrationFactory \ No newline at end of file From ab1ecca6ab776cad74989b16045ee0c95c37f42c Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Tue, 26 Feb 2019 16:25:41 +0800 Subject: [PATCH 22/33] Polish : /spring-cloud-incubator/spring-cloud-alibaba#387 : Dubbo Spring Cloud Samples --- .../pom.xml | 112 ++++++++++-------- .../DubboSpringCloudConsumerBootstrap.java | 13 +- .../src/main/resources/bootstrap.yaml | 50 +++++--- .../DubboSpringCloudProviderBootstrap.java | 1 + .../src/main/resources/bootstrap.yaml | 50 +++++--- 5 files changed, 134 insertions(+), 92 deletions(-) diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml index 65bc560f..6a1f3ce1 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml @@ -26,6 +26,7 @@ 0.2.1.RELEASE 0.0.2 2.1.0.RELEASE + 2.1.0.RELEASE 4.0.1 @@ -88,53 +89,6 @@ spring-cloud-context - - - org.springframework.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - true - - - - - org.springframework.cloud - spring-cloud-starter-zookeeper-discovery - ${spring-cloud-zookeeper.version} - true - - - org.apache.zookeeper - zookeeper - - - - - - org.apache.zookeeper - zookeeper - 3.4.12 - true - - - org.slf4j - slf4j-log4j12 - - - - - - org.apache.curator - curator-framework - ${curator.version} - true - - org.springframework.cloud @@ -149,18 +103,24 @@ nacos - - true - - + + + org.springframework.cloud + spring-cloud-starter-alibaba-nacos-discovery + eureka - + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + true + @@ -168,7 +128,55 @@ zookeeper + + + org.springframework.cloud + spring-cloud-starter-zookeeper-discovery + ${spring-cloud-zookeeper.version} + true + + + org.apache.zookeeper + zookeeper + + + + + org.apache.zookeeper + zookeeper + 3.4.12 + true + + + org.slf4j + slf4j-log4j12 + + + + + + org.apache.curator + curator-framework + ${curator.version} + true + + + + + + consul + + true + + + + + org.springframework.cloud + spring-cloud-starter-consul-discovery + ${spring-cloud-consul.version} + true + diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java index 5933a281..b5dea081 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java @@ -130,12 +130,12 @@ public class DubboSpringCloudConsumerBootstrap { // To call /param callParam(); -// -// // To call /params -// callParams(); -// -// // To call /request/body/map -// callRequestBodyMap(); + + // To call /params + callParams(); + + // To call /request/body/map + callRequestBodyMap(); }; } @@ -209,6 +209,7 @@ public class DubboSpringCloudConsumerBootstrap { public static void main(String[] args) { new SpringApplicationBuilder(DubboSpringCloudConsumerBootstrap.class) + .profiles("consul") .run(args); } } diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml index d4db17e6..5f5ed8d1 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml @@ -1,17 +1,19 @@ spring: application: name: spring-cloud-alibaba-dubbo-consumer + main: + allow-bean-definition-overriding: true + + # default disable all cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 - config: - server-addr: 127.0.0.1:8848 + enabled: false + register-enabled: false zookeeper: enabled: false - - main: - allow-bean-definition-overriding: true + consul: + enabled: false eureka: client: @@ -21,31 +23,45 @@ provider: application: name: spring-cloud-alibaba-dubbo-provider + --- spring: - profiles: eureka + profiles: nacos + cloud: nacos: discovery: - enabled: false - register-enabled: false + enabled: true + register-enabled: true + server-addr: 127.0.0.1:8848 + + +--- +spring: + profiles: eureka eureka: client: enabled: true service-url: - defaultZone: http://localhost:9090/eureka/ + defaultZone: http://127.0.0.1:9090/eureka/ + --- spring: profiles: zookeeper - cloud: - nacos: - discovery: - enabled: false - register-enabled: false - zookeeper: enabled: true - connect-string: localhost:2181 \ No newline at end of file + connect-string: 127.0.0.1:2181 + + +--- +spring: + profiles: consul + + cloud: + consul: + enabled: true + host: 127.0.0.1 + port: 8500 \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java index 03e24633..748511c6 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java @@ -29,6 +29,7 @@ public class DubboSpringCloudProviderBootstrap { public static void main(String[] args) { new SpringApplicationBuilder(DubboSpringCloudProviderBootstrap.class) + .profiles("consul") .run(args); } } diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml index 0cee4797..c845d8ca 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml @@ -1,47 +1,63 @@ spring: application: name: spring-cloud-alibaba-dubbo-provider + main: + allow-bean-definition-overriding: true + + # default disable all cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 - config: - server-addr: 127.0.0.1:8848 + enabled: false + register-enabled: false zookeeper: enabled: false - - main: - allow-bean-definition-overriding: true + consul: + enabled: false eureka: client: enabled: false + --- spring: - profiles: eureka + profiles: nacos + cloud: nacos: discovery: - enabled: false - register-enabled: false + enabled: true + register-enabled: true + server-addr: 127.0.0.1:8848 + + +--- +spring: + profiles: eureka eureka: client: enabled: true service-url: - defaultZone: http://localhost:9090/eureka/ + defaultZone: http://127.0.0.1:9090/eureka/ + --- spring: profiles: zookeeper - cloud: - nacos: - discovery: - enabled: false - register-enabled: false - zookeeper: enabled: true - connect-string: localhost:2181 \ No newline at end of file + connect-string: 127.0.0.1:2181 + + +--- +spring: + profiles: consul + + cloud: + consul: + enabled: true + host: 127.0.0.1 + port: 8500 \ No newline at end of file From f719e16d38f8edf6e066f63e9f46e3e4b718f903 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Tue, 26 Feb 2019 16:54:36 +0800 Subject: [PATCH 23/33] Polish : /spring-cloud-incubator/spring-cloud-alibaba#386 : Supports all Spring Cloud Registries and default is Nacos --- .../spring-cloud-alibaba-dubbo-examples/pom.xml | 10 +++------- .../bootstrap/DubboSpringCloudConsumerBootstrap.java | 2 +- .../src/main/resources/bootstrap.yaml | 9 ++++++++- .../bootstrap/DubboSpringCloudProviderBootstrap.java | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml index 6a1f3ce1..93f33466 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/pom.xml @@ -103,6 +103,9 @@ nacos + + true + @@ -119,7 +122,6 @@ org.springframework.cloud spring-cloud-starter-netflix-eureka-client - true @@ -133,7 +135,6 @@ org.springframework.cloud spring-cloud-starter-zookeeper-discovery ${spring-cloud-zookeeper.version} - true org.apache.zookeeper @@ -159,23 +160,18 @@ org.apache.curator curator-framework ${curator.version} - true consul - - true - org.springframework.cloud spring-cloud-starter-consul-discovery ${spring-cloud-consul.version} - true diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java index b5dea081..2d72b79f 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java @@ -209,7 +209,7 @@ public class DubboSpringCloudConsumerBootstrap { public static void main(String[] args) { new SpringApplicationBuilder(DubboSpringCloudConsumerBootstrap.class) - .profiles("consul") + .profiles("nacos") .run(args); } } diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml index 5f5ed8d1..1d25940c 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/bootstrap.yaml @@ -4,6 +4,7 @@ spring: main: allow-bean-definition-overriding: true + # default disable all cloud: nacos: @@ -19,11 +20,14 @@ eureka: client: enabled: false +ribbon: + nacos: + enabled: false + provider: application: name: spring-cloud-alibaba-dubbo-provider - --- spring: profiles: nacos @@ -35,6 +39,9 @@ spring: register-enabled: true server-addr: 127.0.0.1:8848 +ribbon: + nacos: + enabled: true --- spring: diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java index 748511c6..4fbf8ea8 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/org/springframework/cloud/alibaba/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java @@ -29,7 +29,7 @@ public class DubboSpringCloudProviderBootstrap { public static void main(String[] args) { new SpringApplicationBuilder(DubboSpringCloudProviderBootstrap.class) - .profiles("consul") + .profiles("nacos") .run(args); } } From a0092470e5eb3b21b27f631ca554df05e8d63d7c Mon Sep 17 00:00:00 2001 From: flystar32 Date: Tue, 26 Feb 2019 20:09:11 +0800 Subject: [PATCH 24/33] add test case --- ...nsAutoServiceRegistrationEnabledTests.java | 80 +++++++++++++++++++ .../AnsAutoServiceRegistrationIpTests.java | 13 ++- .../AnsAutoServiceRegistrationTests.java | 10 ++- 3 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistrationEnabledTests.java diff --git a/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistrationEnabledTests.java b/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistrationEnabledTests.java new file mode 100644 index 00000000..28c465f7 --- /dev/null +++ b/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistrationEnabledTests.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 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 + * + * http://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 org.springframework.cloud.alicloud.ans.registry; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.alicloud.ans.AnsAutoConfiguration; +import org.springframework.cloud.alicloud.ans.AnsDiscoveryClientAutoConfiguration; +import org.springframework.cloud.alicloud.context.ans.AnsProperties; +import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * @author xiaojing + */ + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = AnsAutoServiceRegistrationEnabledTests.TestConfig.class, properties = { + "spring.application.name=myTestService1", + "spring.cloud.alicloud.ans.server-list=127.0.0.1", + "spring.cloud.alicloud.ans.server-port=8080", + "spring.cloud.alicloud.ans.register-enabled=false" }, webEnvironment = RANDOM_PORT) +public class AnsAutoServiceRegistrationEnabledTests { + + @Autowired + private AnsRegistration registration; + + @Autowired + private AnsAutoServiceRegistration ansAutoServiceRegistration; + + @Autowired + private AnsProperties properties; + + @Test + public void contextLoads() throws Exception { + + assertNotNull("AnsRegistration was not created", registration); + assertNotNull("AnsProperties was not created", properties); + assertNotNull("AnsAutoServiceRegistration was not created", + ansAutoServiceRegistration); + + checkEnabled(); + + } + + private void checkEnabled() { + assertFalse("Ans Auto Registration should not start", + ansAutoServiceRegistration.isEnabled()); + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ AutoServiceRegistrationConfiguration.class, + AnsDiscoveryClientAutoConfiguration.class, AnsAutoConfiguration.class }) + public static class TestConfig { + } +} diff --git a/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistrationIpTests.java b/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistrationIpTests.java index 53d7b5c2..7bf76b25 100644 --- a/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistrationIpTests.java +++ b/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistrationIpTests.java @@ -40,7 +40,9 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes = AnsAutoServiceRegistrationIpTests.TestConfig.class, properties = { "spring.application.name=myTestService1", + "spring.cloud.alicloud.ans.client-domains=myTestService2", "spring.cloud.alicloud.ans.server-list=127.0.0.1", + "spring.cloud.alicloud.ans.client-weight=2", "spring.cloud.alicloud.ans.server-port=8080", "spring.cloud.alicloud.ans.client-ip=123.123.123.123" }, webEnvironment = RANDOM_PORT) public class AnsAutoServiceRegistrationIpTests { @@ -63,13 +65,22 @@ public class AnsAutoServiceRegistrationIpTests { ansAutoServiceRegistration); checkoutAnsDiscoveryServiceIP(); - + checkoutAnsDiscoveryServiceName(); + checkoutAnsDiscoveryWeight(); } private void checkoutAnsDiscoveryServiceIP() { assertEquals("AnsProperties service IP was wrong", "123.123.123.123", registration.getHost()); + } + private void checkoutAnsDiscoveryServiceName() { + assertEquals("AnsDiscoveryProperties service name was wrong", "myTestService2", + properties.getClientDomains()); + } + + private void checkoutAnsDiscoveryWeight() { + assertEquals(2L, properties.getClientWeight(), 0); } @Configuration diff --git a/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistrationTests.java b/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistrationTests.java index 93381408..9d6904b8 100644 --- a/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistrationTests.java +++ b/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistrationTests.java @@ -54,6 +54,7 @@ import org.springframework.test.context.junit4.SpringRunner; "spring.application.name=myTestService1", "spring.cloud.alicloud.ans.server-list=127.0.0.1", "spring.cloud.alicloud.ans.server-port=8080", + "spring.cloud.alicloud.ans.secure=true", "spring.cloud.alicloud.ans.endpoint=test-endpoint" }, webEnvironment = RANDOM_PORT) public class AnsAutoServiceRegistrationTests { @@ -86,6 +87,7 @@ public class AnsAutoServiceRegistrationTests { checkoutAnsDiscoveryServiceName(); checkoutAnsDiscoveryServiceIP(); checkoutAnsDiscoveryServicePort(); + checkoutAnsDiscoverySecure(); checkAutoRegister(); @@ -101,31 +103,31 @@ public class AnsAutoServiceRegistrationTests { private void checkoutAnsDiscoveryServerList() { assertEquals("AnsDiscoveryProperties server list was wrong", "127.0.0.1", properties.getServerList()); - } private void checkoutAnsDiscoveryServerPort() { assertEquals("AnsDiscoveryProperties server port was wrong", "8080", properties.getServerPort()); - } private void checkoutAnsDiscoveryServiceName() { assertEquals("AnsDiscoveryProperties service name was wrong", "myTestService1", properties.getClientDomains()); - } private void checkoutAnsDiscoveryServiceIP() { assertEquals("AnsDiscoveryProperties service IP was wrong", inetUtils.findFirstNonLoopbackHostInfo().getIpAddress(), registration.getHost()); - } private void checkoutAnsDiscoveryServicePort() { assertEquals("AnsDiscoveryProperties service Port was wrong", port, registration.getPort()); + } + + private void checkoutAnsDiscoverySecure() { + assertTrue("AnsDiscoveryProperties secure should be true", properties.isSecure()); } From eef764a0206426d7c1c90e4626b9f091f475cbeb Mon Sep 17 00:00:00 2001 From: gaokai Date: Wed, 27 Feb 2019 10:35:45 +0800 Subject: [PATCH 25/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring-cloud-alibaba-dependencies/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index f4a78d75..df04b40c 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -34,7 +34,6 @@ 0.0.2 1.1.0 1.1.8 - 1.1.0 1.1.1 From bf73f83a1120effe4b4b1d1735fdd41905fdc0d5 Mon Sep 17 00:00:00 2001 From: gaokai Date: Wed, 27 Feb 2019 10:35:55 +0800 Subject: [PATCH 26/33] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring-cloud-alicloud-sms/pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/spring-cloud-alicloud-sms/pom.xml b/spring-cloud-alicloud-sms/pom.xml index 2b9b500e..b69530a0 100644 --- a/spring-cloud-alicloud-sms/pom.xml +++ b/spring-cloud-alicloud-sms/pom.xml @@ -39,10 +39,6 @@ com.aliyun.mns aliyun-sdk-mns - - com.aliyun - aliyun-java-sdk-dysmsapi - org.springframework.boot From ef00e96b5cd6e66f17ec8d6a0a61ce05f241cb9d Mon Sep 17 00:00:00 2001 From: gaokai Date: Wed, 27 Feb 2019 10:36:19 +0800 Subject: [PATCH 27/33] =?UTF-8?q?=E5=8C=85=E5=90=ABsms-example=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring-cloud-alibaba-examples/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud-alibaba-examples/pom.xml b/spring-cloud-alibaba-examples/pom.xml index 31e8ca5e..44070fdd 100644 --- a/spring-cloud-alibaba-examples/pom.xml +++ b/spring-cloud-alibaba-examples/pom.xml @@ -35,6 +35,7 @@ fescar-example/account-service acm-example/acm-local-example rocketmq-example + sms-example spring-cloud-bus-rocketmq-example schedulerx-example/schedulerx-simple-task-example From c94eec582852111cb8ebc036ebfa2bf67f5907f7 Mon Sep 17 00:00:00 2001 From: yunzheng1228 Date: Thu, 28 Feb 2019 14:18:26 +0800 Subject: [PATCH 28/33] Change log level when the service attribute of nacos is empty. --- .../cloud/alibaba/nacos/registry/NacosServiceRegistry.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosServiceRegistry.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosServiceRegistry.java index 48de92c0..6c362af6 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosServiceRegistry.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosServiceRegistry.java @@ -46,7 +46,7 @@ public class NacosServiceRegistry implements ServiceRegistry { public void register(Registration registration) { if (StringUtils.isEmpty(registration.getServiceId())) { - log.info("No service to register for nacos client..."); + log.warn("No service to register for nacos client..."); return; } @@ -76,7 +76,7 @@ public class NacosServiceRegistry implements ServiceRegistry { log.info("De-registering from Nacos Server now..."); if (StringUtils.isEmpty(registration.getServiceId())) { - log.info("No dom to de-register for nacos client..."); + log.warn("No dom to de-register for nacos client..."); return; } From 34e6f7542123bcea844c93f8dbc4f7f7822ab889 Mon Sep 17 00:00:00 2001 From: flystar32 Date: Thu, 28 Feb 2019 14:21:42 +0800 Subject: [PATCH 29/33] add ACM test case --- spring-cloud-alicloud-acm/pom.xml | 14 ++ .../DiamondConnectionFailureAnalyzer.java | 40 ---- .../DiamondConnectionFailureException.java | 52 ----- .../main/resources/META-INF/spring.factories | 5 +- .../alicloud/acm/AcmConfigurationTests.java | 191 ++++++++++++++++++ .../acm/AcmGroupConfigurationTest.java | 105 ++++++++++ .../acm/endpoint/AcmEndpointTests.java | 152 ++++++++++++++ .../context/acm/AcmIntegrationProperties.java | 4 + 8 files changed, 467 insertions(+), 96 deletions(-) delete mode 100644 spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureAnalyzer.java delete mode 100644 spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureException.java create mode 100644 spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmConfigurationTests.java create mode 100644 spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmGroupConfigurationTest.java create mode 100644 spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/endpoint/AcmEndpointTests.java diff --git a/spring-cloud-alicloud-acm/pom.xml b/spring-cloud-alicloud-acm/pom.xml index 045812b3..5212fdd1 100644 --- a/spring-cloud-alicloud-acm/pom.xml +++ b/spring-cloud-alicloud-acm/pom.xml @@ -67,6 +67,20 @@ spring-boot-starter-test test + + + org.powermock + powermock-module-junit4 + 2.0.0 + test + + + org.powermock + powermock-api-mockito2 + 2.0.0 + test + + diff --git a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureAnalyzer.java b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureAnalyzer.java deleted file mode 100644 index 64d56be3..00000000 --- a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureAnalyzer.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 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 - * - * http://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 org.springframework.cloud.alicloud.acm.diagnostics.analyzer; - -import org.springframework.boot.diagnostics.AbstractFailureAnalyzer; -import org.springframework.boot.diagnostics.FailureAnalysis; - -/** - * A {@code FailureAnalyzer} that performs analysis of failures caused by a - * {@code DiamondConnectionFailureException}. - * - * @author juven.xuxb, 07/11/2016. - */ -public class DiamondConnectionFailureAnalyzer - extends AbstractFailureAnalyzer { - - @Override - protected FailureAnalysis analyze(Throwable rootFailure, - DiamondConnectionFailureException cause) { - return new FailureAnalysis( - "Application failed to connect to Diamond, unable to access http://" - + cause.getDomain() + ":" + cause.getPort() - + "/diamond-server/diamond", - "config the right endpoint", cause); - } -} diff --git a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureException.java b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureException.java deleted file mode 100644 index a1b10abf..00000000 --- a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureException.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 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 - * - * http://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 org.springframework.cloud.alicloud.acm.diagnostics.analyzer; - -/** - * A {@code DiamondConnectionFailureException} is thrown when the application fails to - * connect to Diamond Server. - * - * @author juven.xuxb, 07/11/2016. - */ -public class DiamondConnectionFailureException extends RuntimeException { - - private final String domain; - - private final String port; - - public DiamondConnectionFailureException(String domain, String port, String message) { - super(message); - this.domain = domain; - this.port = port; - } - - public DiamondConnectionFailureException(String domain, String port, String message, - Throwable cause) { - super(message, cause); - this.domain = domain; - this.port = port; - } - - String getDomain() { - return domain; - } - - String getPort() { - return port; - } - -} diff --git a/spring-cloud-alicloud-acm/src/main/resources/META-INF/spring.factories b/spring-cloud-alicloud-acm/src/main/resources/META-INF/spring.factories index 4f39095f..b5708d18 100644 --- a/spring-cloud-alicloud-acm/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alicloud-acm/src/main/resources/META-INF/spring.factories @@ -3,7 +3,4 @@ org.springframework.cloud.alicloud.acm.bootstrap.AcmPropertySourceLocator org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.cloud.alicloud.acm.AcmAutoConfiguration,\ -org.springframework.cloud.alicloud.acm.endpoint.AcmEndpointAutoConfiguration - -org.springframework.boot.diagnostics.FailureAnalyzer=\ -org.springframework.cloud.alicloud.acm.diagnostics.analyzer.DiamondConnectionFailureAnalyzer \ No newline at end of file +org.springframework.cloud.alicloud.acm.endpoint.AcmEndpointAutoConfiguration \ No newline at end of file diff --git a/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmConfigurationTests.java b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmConfigurationTests.java new file mode 100644 index 00000000..ea6a4bdb --- /dev/null +++ b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmConfigurationTests.java @@ -0,0 +1,191 @@ +/* + * Copyright (C) 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 + * + * http://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 org.springframework.cloud.alicloud.acm; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +import com.alibaba.edas.acm.ConfigService; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.api.support.MethodProxy; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.alicloud.acm.bootstrap.AcmPropertySourceLocator; +import org.springframework.cloud.alicloud.acm.endpoint.AcmEndpointAutoConfiguration; +import org.springframework.cloud.alicloud.context.acm.AcmContextBootstrapConfiguration; +import org.springframework.cloud.alicloud.context.acm.AcmIntegrationProperties; +import org.springframework.cloud.alicloud.context.acm.AcmProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * @author xiaojing + */ + +@RunWith(PowerMockRunner.class) +@PowerMockRunnerDelegate(SpringRunner.class) +@PrepareForTest({ ConfigService.class }) +@SpringBootTest(classes = AcmConfigurationTests.TestConfig.class, properties = { + "spring.application.name=test-name", "spring.profiles.active=dev,test", + "spring.cloud.alicloud.acm.server-list=127.0.0.1", + "spring.cloud.alicloud.acm.server-port=8848", + "spring.cloud.alicloud.acm.endpoint=test-endpoint", + "spring.cloud.alicloud.acm.namespace=test-namespace", + "spring.cloud.alicloud.acm.timeout=1000", + "spring.cloud.alicloud.acm.group=test-group", + "spring.cloud.alicloud.acm.refresh-enabled=false", + "spring.cloud.alicloud.acm.file-extension=properties" }, webEnvironment = NONE) +public class AcmConfigurationTests { + + static { + + try { + + Method method = PowerMockito.method(ConfigService.class, "getConfig", + String.class, String.class, long.class); + MethodProxy.proxy(method, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + + if ("test-name.properties".equals(args[0]) + && "test-group".equals(args[1])) { + return "user.name=hello\nuser.age=12"; + } + + if ("test-name-dev.properties".equals(args[0]) + && "test-group".equals(args[1])) { + return "user.name=dev"; + } + return ""; + } + }); + + } + catch (Exception ignore) { + ignore.printStackTrace(); + + } + } + + @Autowired + private Environment environment; + + @Autowired + private AcmPropertySourceLocator locator; + + @Autowired + private AcmIntegrationProperties integrationProperties; + + @Autowired + private AcmProperties properties; + + @Test + public void contextLoads() throws Exception { + + assertNotNull("AcmPropertySourceLocator was not created", locator); + assertNotNull("AcmProperties was not created", properties); + assertNotNull("AcmIntegrationProperties was not created", integrationProperties); + + checkoutAcmServerAddr(); + checkoutAcmServerPort(); + checkoutAcmEndpoint(); + checkoutAcmNamespace(); + checkoutAcmGroup(); + checkoutAcmFileExtension(); + checkoutAcmTimeout(); + checkoutAcmProfiles(); + checkoutAcmRefreshEnabled(); + checkoutDataLoad(); + } + + private void checkoutAcmServerAddr() { + assertEquals("AcmProperties server address is wrong", "127.0.0.1", + properties.getServerList()); + + } + + private void checkoutAcmServerPort() { + assertEquals("AcmProperties server port is wrong", "8848", + properties.getServerPort()); + + } + + private void checkoutAcmEndpoint() { + assertEquals("AcmProperties endpoint is wrong", "test-endpoint", + properties.getEndpoint()); + + } + + private void checkoutAcmNamespace() { + assertEquals("AcmProperties namespace is wrong", "test-namespace", + properties.getNamespace()); + + } + + private void checkoutAcmGroup() { + assertEquals("AcmProperties' group is wrong", "test-group", + properties.getGroup()); + } + + private void checkoutAcmFileExtension() { + assertEquals("AcmProperties' file extension is wrong", "properties", + properties.getFileExtension()); + } + + private void checkoutAcmTimeout() { + assertEquals("AcmProperties' timeout is wrong", 1000, properties.getTimeout()); + } + + private void checkoutAcmRefreshEnabled() { + assertEquals("AcmProperties' refresh enabled is wrong", false, + properties.isRefreshEnabled()); + } + + private void checkoutAcmProfiles() { + assertArrayEquals("AcmProperties' profiles is wrong", + new String[] { "dev", "test" }, + integrationProperties.getActiveProfiles()); + } + + private void checkoutDataLoad() { + Assert.assertEquals(environment.getProperty("user.name"), "dev"); + Assert.assertEquals(environment.getProperty("user.age"), "12"); + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ AcmEndpointAutoConfiguration.class, + AcmAutoConfiguration.class, AcmContextBootstrapConfiguration.class }) + public static class TestConfig { + } +} diff --git a/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmGroupConfigurationTest.java b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmGroupConfigurationTest.java new file mode 100644 index 00000000..2e8076ab --- /dev/null +++ b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmGroupConfigurationTest.java @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2019 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 + * + * http://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 org.springframework.cloud.alicloud.acm; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +import com.alibaba.edas.acm.ConfigService; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.api.support.MethodProxy; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.alicloud.acm.endpoint.AcmEndpointAutoConfiguration; +import org.springframework.cloud.alicloud.context.acm.AcmContextBootstrapConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; + +/** + * @author xiaojing + */ + +@RunWith(PowerMockRunner.class) +@PowerMockRunnerDelegate(SpringRunner.class) +@PrepareForTest({ ConfigService.class }) +@SpringBootTest(classes = AcmGroupConfigurationTest.TestConfig.class, properties = { + "spring.application.name=test-name", "spring.application.group=com.test.hello", + "spring.cloud.alicloud.acm.server-list=127.0.0.1", + "spring.cloud.alicloud.acm.server-port=8080", + "spring.cloud.alicloud.acm.timeout=1000", + "spring.cloud.alicloud.acm.group=test-group" }, webEnvironment = NONE) +public class AcmGroupConfigurationTest { + + static { + + try { + Method method = PowerMockito.method(ConfigService.class, "getConfig", + String.class, String.class, long.class); + MethodProxy.proxy(method, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + if ("com.test:application.properties".equals(args[0]) + && "test-group".equals(args[1])) { + return "com.test.value=com.test"; + } + if ("com.test.hello:application.properties".equals(args[0]) + && "test-group".equals(args[1])) { + return "com.test.hello.value=com.test.hello"; + } + return ""; + } + }); + + } + catch (Exception ignore) { + ignore.printStackTrace(); + + } + } + + @Autowired + private Environment environment; + + @Test + public void contextLoads() throws Exception { + + Assert.assertEquals(environment.getProperty("com.test.value"), "com.test"); + Assert.assertEquals(environment.getProperty("com.test.hello.value"), + "com.test.hello"); + + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ AcmEndpointAutoConfiguration.class, + AcmAutoConfiguration.class, AcmContextBootstrapConfiguration.class }) + public static class TestConfig { + } +} diff --git a/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/endpoint/AcmEndpointTests.java b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/endpoint/AcmEndpointTests.java new file mode 100644 index 00000000..dcef7f48 --- /dev/null +++ b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/endpoint/AcmEndpointTests.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 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 + * + * http://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 org.springframework.cloud.alicloud.acm.endpoint; + +import static org.junit.Assert.assertEquals; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.api.support.MethodProxy; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.health.Health.Builder; +import org.springframework.boot.actuate.health.HealthIndicator; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.alicloud.acm.AcmAutoConfiguration; +import org.springframework.cloud.alicloud.acm.AcmPropertySourceRepository; +import org.springframework.cloud.alicloud.acm.bootstrap.AcmPropertySourceLocator; +import org.springframework.cloud.alicloud.acm.refresh.AcmRefreshHistory; +import org.springframework.cloud.alicloud.context.acm.AcmContextBootstrapConfiguration; +import org.springframework.cloud.alicloud.context.acm.AcmIntegrationProperties; +import org.springframework.cloud.alicloud.context.acm.AcmProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; + +import com.alibaba.edas.acm.ConfigService; + +/** + * @author xiaojing + */ + +@RunWith(PowerMockRunner.class) +@PowerMockRunnerDelegate(SpringRunner.class) +@PrepareForTest({ ConfigService.class }) +@SpringBootTest(classes = AcmEndpointTests.TestConfig.class, properties = { + "spring.application.name=test-name", + "spring.cloud.alicloud.acm.server-list=127.0.0.1", + "spring.cloud.alicloud.acm.server-port=8848", + "spring.cloud.alicloud.acm.file-extension=properties" }, webEnvironment = NONE) +public class AcmEndpointTests { + + static { + + try { + + Method method = PowerMockito.method(ConfigService.class, "getConfig", + String.class, String.class, long.class); + MethodProxy.proxy(method, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + + if ("test-name.properties".equals(args[0]) + && "DEFAULT_GROUP".equals(args[1])) { + return "user.name=hello\nuser.age=12"; + } + return ""; + } + }); + + } + catch (Exception ignore) { + ignore.printStackTrace(); + + } + } + + @Autowired + private AcmProperties properties; + + @Autowired + private AcmRefreshHistory refreshHistory; + + @Autowired + private AcmPropertySourceRepository propertySourceRepository; + + @Autowired + private AcmPropertySourceRepository acmPropertySourceRepository; + + @Test + public void contextLoads() throws Exception { + + checkoutEndpoint(); + checkoutAcmHealthIndicator(); + + } + + private void checkoutAcmHealthIndicator() { + try { + Builder builder = new Builder(); + + AcmHealthIndicator healthIndicator = new AcmHealthIndicator(properties, + acmPropertySourceRepository); + healthIndicator.doHealthCheck(builder); + + Builder builder1 = new Builder(); + List dataIds = new ArrayList<>(); + dataIds.add("test-name.properties"); + builder1.up().withDetail("dataIds", dataIds); + + Assert.assertTrue(builder.build().equals(builder1.build())); + + } + catch (Exception ignoreE) { + + } + + } + + private void checkoutEndpoint() throws Exception { + AcmEndpoint acmEndpoint = new AcmEndpoint(properties, refreshHistory, + propertySourceRepository); + Map map = acmEndpoint.invoke(); + assertEquals(map.get("config"), properties); + assertEquals(((Map) map.get("runtime")).get("refreshHistory"), + refreshHistory.getRecords()); + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ AcmEndpointAutoConfiguration.class, + AcmAutoConfiguration.class, AcmContextBootstrapConfiguration.class }) + public static class TestConfig { + } +} diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmIntegrationProperties.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmIntegrationProperties.java index 8491ef12..55c073b9 100644 --- a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmIntegrationProperties.java +++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmIntegrationProperties.java @@ -88,6 +88,10 @@ public class AcmIntegrationProperties { this.activeProfiles = activeProfiles; } + public String[] getActiveProfiles() { + return activeProfiles; + } + public void setAcmProperties(AcmProperties acmProperties) { this.acmProperties = acmProperties; } From cd02c50151caa2b544f99d8ca6ae888f424379f4 Mon Sep 17 00:00:00 2001 From: flystar32 Date: Thu, 28 Feb 2019 15:36:14 +0800 Subject: [PATCH 30/33] add more test case --- .../bootstrap/AcmPropertySourceLocator.java | 2 + .../alicloud/acm/AcmConfigurationTests.java | 6 +- .../alicloud/acm/AcmFileExtensionTest.java | 98 +++++++++++++++++++ .../acm/AcmGroupConfigurationTest.java | 5 +- .../acm/endpoint/AcmEndpointTests.java | 4 - 5 files changed, 108 insertions(+), 7 deletions(-) create mode 100644 spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmFileExtensionTest.java diff --git a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/bootstrap/AcmPropertySourceLocator.java b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/bootstrap/AcmPropertySourceLocator.java index cb5ebdfb..62ded421 100644 --- a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/bootstrap/AcmPropertySourceLocator.java +++ b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/bootstrap/AcmPropertySourceLocator.java @@ -42,6 +42,8 @@ public class AcmPropertySourceLocator implements PropertySourceLocator { CompositePropertySource compositePropertySource = new CompositePropertySource( DIAMOND_PROPERTY_SOURCE_NAME); + acmIntegrationProperties.setActiveProfiles(environment.getActiveProfiles()); + for (String dataId : acmIntegrationProperties.getGroupConfigurationDataIds()) { loadDiamondDataIfPresent(compositePropertySource, dataId, acmIntegrationProperties.getAcmProperties().getGroup(), true); diff --git a/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmConfigurationTests.java b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmConfigurationTests.java index ea6a4bdb..9d09fd7a 100644 --- a/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmConfigurationTests.java +++ b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmConfigurationTests.java @@ -126,6 +126,7 @@ public class AcmConfigurationTests { checkoutAcmProfiles(); checkoutAcmRefreshEnabled(); checkoutDataLoad(); + checkoutProfileDataLoad(); } private void checkoutAcmServerAddr() { @@ -178,10 +179,13 @@ public class AcmConfigurationTests { } private void checkoutDataLoad() { - Assert.assertEquals(environment.getProperty("user.name"), "dev"); Assert.assertEquals(environment.getProperty("user.age"), "12"); } + private void checkoutProfileDataLoad() { + Assert.assertEquals(environment.getProperty("user.name"), "dev"); + } + @Configuration @EnableAutoConfiguration @ImportAutoConfiguration({ AcmEndpointAutoConfiguration.class, diff --git a/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmFileExtensionTest.java b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmFileExtensionTest.java new file mode 100644 index 00000000..b463cf8f --- /dev/null +++ b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmFileExtensionTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2019 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 + * + * http://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 org.springframework.cloud.alicloud.acm; + +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.api.support.MethodProxy; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.alicloud.acm.endpoint.AcmEndpointAutoConfiguration; +import org.springframework.cloud.alicloud.context.acm.AcmContextBootstrapConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; + +import com.alibaba.edas.acm.ConfigService; + +/** + * @author xiaojing + */ + +@RunWith(PowerMockRunner.class) +@PowerMockRunnerDelegate(SpringRunner.class) +@PrepareForTest({ ConfigService.class }) +@SpringBootTest(classes = AcmFileExtensionTest.TestConfig.class, properties = { + "spring.application.name=test-name", + "spring.cloud.alicloud.acm.server-list=127.0.0.1", + "spring.cloud.alicloud.acm.server-port=8080", + "spring.cloud.alicloud.acm.file-extension=yaml" }, webEnvironment = NONE) +public class AcmFileExtensionTest { + + static { + + try { + Method method = PowerMockito.method(ConfigService.class, "getConfig", + String.class, String.class, long.class); + MethodProxy.proxy(method, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + if ("test-name.yaml".equals(args[0]) + && "DEFAULT_GROUP".equals(args[1])) { + return "user:\n name: hello\n age: 12"; + } + return ""; + } + }); + + } + catch (Exception ignore) { + ignore.printStackTrace(); + + } + } + + @Autowired + private Environment environment; + + @Test + public void contextLoads() throws Exception { + + Assert.assertEquals(environment.getProperty("user.name"), "hello"); + Assert.assertEquals(environment.getProperty("user.age"), "12"); + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ AcmEndpointAutoConfiguration.class, + AcmAutoConfiguration.class, AcmContextBootstrapConfiguration.class }) + public static class TestConfig { + } +} diff --git a/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmGroupConfigurationTest.java b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmGroupConfigurationTest.java index 2e8076ab..030b26d0 100644 --- a/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmGroupConfigurationTest.java +++ b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmGroupConfigurationTest.java @@ -67,11 +67,11 @@ public class AcmGroupConfigurationTest { throws Throwable { if ("com.test:application.properties".equals(args[0]) && "test-group".equals(args[1])) { - return "com.test.value=com.test"; + return "com.test.value=com.test\ntest.priority=1"; } if ("com.test.hello:application.properties".equals(args[0]) && "test-group".equals(args[1])) { - return "com.test.hello.value=com.test.hello"; + return "com.test.hello.value=com.test.hello\ntest.priority=2"; } return ""; } @@ -91,6 +91,7 @@ public class AcmGroupConfigurationTest { public void contextLoads() throws Exception { Assert.assertEquals(environment.getProperty("com.test.value"), "com.test"); + Assert.assertEquals(environment.getProperty("test.priority"), "2"); Assert.assertEquals(environment.getProperty("com.test.hello.value"), "com.test.hello"); diff --git a/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/endpoint/AcmEndpointTests.java b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/endpoint/AcmEndpointTests.java index dcef7f48..d05ddb5f 100644 --- a/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/endpoint/AcmEndpointTests.java +++ b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/endpoint/AcmEndpointTests.java @@ -35,19 +35,15 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunnerDelegate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.health.Health.Builder; -import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.alicloud.acm.AcmAutoConfiguration; import org.springframework.cloud.alicloud.acm.AcmPropertySourceRepository; -import org.springframework.cloud.alicloud.acm.bootstrap.AcmPropertySourceLocator; import org.springframework.cloud.alicloud.acm.refresh.AcmRefreshHistory; import org.springframework.cloud.alicloud.context.acm.AcmContextBootstrapConfiguration; -import org.springframework.cloud.alicloud.context.acm.AcmIntegrationProperties; import org.springframework.cloud.alicloud.context.acm.AcmProperties; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; import org.springframework.test.context.junit4.SpringRunner; import com.alibaba.edas.acm.ConfigService; From 923a2b590d28bf3680e6f8488d737af435ff2a5a Mon Sep 17 00:00:00 2001 From: yunzheng1228 Date: Thu, 28 Feb 2019 15:43:27 +0800 Subject: [PATCH 31/33] When the service attribute is empty, modify the log level of ANS to warn. --- .../cloud/alicloud/ans/registry/AnsServiceRegistry.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/registry/AnsServiceRegistry.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/registry/AnsServiceRegistry.java index 1ff187a3..39553004 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/registry/AnsServiceRegistry.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/registry/AnsServiceRegistry.java @@ -44,7 +44,7 @@ public class AnsServiceRegistry implements ServiceRegistry { return; } if (StringUtils.isEmpty(registration.getServiceId())) { - log.info("No service to register for client..."); + log.warn("No service to register for client..."); return; } @@ -80,7 +80,7 @@ public class AnsServiceRegistry implements ServiceRegistry { log.info("De-registering from ANSServer now..."); if (StringUtils.isEmpty(registration.getServiceId())) { - log.info("No dom to de-register for client..."); + log.warn("No dom to de-register for client..."); return; } From df8f703460d191bdd00e914a7c43533e1631cb8b Mon Sep 17 00:00:00 2001 From: yunzheng1228 Date: Thu, 28 Feb 2019 15:51:42 +0800 Subject: [PATCH 32/33] Fixed nacos-example's bug, Change the attribute value of spring.application.name from 'sca-nacos-config' to 'nacos-config-example' --- .../src/main/resources/bootstrap.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/src/main/resources/bootstrap.properties b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/src/main/resources/bootstrap.properties index 831d8ff7..375be66e 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/src/main/resources/bootstrap.properties +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/src/main/resources/bootstrap.properties @@ -1,4 +1,4 @@ -spring.application.name=sca-nacos-config +spring.application.name=nacos-config-example spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.shared-data-ids=base-common.properties,common.properties spring.cloud.nacos.config.refreshable-dataids=common.properties \ No newline at end of file From 11db5e87281919bdfa269ac8824c0f2064eba4c2 Mon Sep 17 00:00:00 2001 From: flystar32 Date: Thu, 28 Feb 2019 17:11:04 +0800 Subject: [PATCH 33/33] add test case of ANS --- .../alicloud/ans/AnsAutoConfiguration.java | 3 - .../alicloud/ans/AnsDiscoveryClient.java | 7 +- .../AnsDiscoveryClientAutoConfiguration.java | 3 - .../alicloud/ans/endpoint/AnsEndpoint.java | 6 +- .../alicloud/ans/migrate/MigrateEndpoint.java | 31 ---- .../MigrateEndpointAutoConfiguration.java | 21 --- .../ans/migrate/MigrateOnCondition.java | 48 ----- .../ans/migrate/MigrateOnConditionClass.java | 23 --- .../MigrateOnConditionMissingClass.java | 22 --- .../ans/migrate/MigrateProxyManager.java | 97 ---------- .../migrate/MigrateRefreshEventListener.java | 78 -------- .../MigrateRibbonBeanPostProcessor.java | 52 ------ .../ans/migrate/MigrateServiceRegistry.java | 52 ------ .../migrate/MigrationAutoconfiguration.java | 39 ---- .../migrate/ServerListInvocationHandler.java | 170 ------------------ .../alicloud/ans/migrate/ServerWrapper.java | 38 ---- .../registry/AnsAutoServiceRegistration.java | 2 - .../ans/registry/AnsServiceRegistry.java | 17 +- .../ribbon/AnsRibbonClientConfiguration.java | 3 - .../cloud/alicloud/ans/ribbon/AnsServer.java | 40 +---- .../alicloud/ans/ribbon/AnsServerList.java | 20 +-- .../ans/ribbon/MigrateRibbonCofiguration.java | 19 -- .../ribbon/RibbonAnsAutoConfiguration.java | 3 +- .../main/resources/META-INF/spring.factories | 2 - .../ans/ribbon/AnsServerListTests.java | 6 - 25 files changed, 24 insertions(+), 778 deletions(-) delete mode 100644 spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateEndpoint.java delete mode 100644 spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateEndpointAutoConfiguration.java delete mode 100644 spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnCondition.java delete mode 100644 spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionClass.java delete mode 100644 spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionMissingClass.java delete mode 100644 spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateProxyManager.java delete mode 100644 spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateRefreshEventListener.java delete mode 100644 spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateRibbonBeanPostProcessor.java delete mode 100644 spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateServiceRegistry.java delete mode 100644 spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrationAutoconfiguration.java delete mode 100644 spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/ServerListInvocationHandler.java delete mode 100644 spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/ServerWrapper.java delete mode 100644 spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/MigrateRibbonCofiguration.java diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/AnsAutoConfiguration.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/AnsAutoConfiguration.java index fb96cfc1..3364c21b 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/AnsAutoConfiguration.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/AnsAutoConfiguration.java @@ -21,7 +21,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.alicloud.ans.migrate.MigrateOnConditionMissingClass; import org.springframework.cloud.alicloud.ans.registry.AnsAutoServiceRegistration; import org.springframework.cloud.alicloud.ans.registry.AnsRegistration; import org.springframework.cloud.alicloud.ans.registry.AnsServiceRegistry; @@ -30,7 +29,6 @@ import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationC import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; /** @@ -38,7 +36,6 @@ import org.springframework.context.annotation.Configuration; */ @Configuration @EnableConfigurationProperties -@Conditional(MigrateOnConditionMissingClass.class) @ConditionalOnClass(name = "org.springframework.boot.web.context.WebServerInitializedEvent") @ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true) @ConditionalOnAnsEnabled diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/AnsDiscoveryClient.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/AnsDiscoveryClient.java index 6f93a979..493dfdcd 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/AnsDiscoveryClient.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/AnsDiscoveryClient.java @@ -22,12 +22,7 @@ import com.alibaba.ans.shaded.com.taobao.vipserver.client.core.Host; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * @author xiaolongzuo diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/AnsDiscoveryClientAutoConfiguration.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/AnsDiscoveryClientAutoConfiguration.java index 06508b07..e035b2a3 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/AnsDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/AnsDiscoveryClientAutoConfiguration.java @@ -19,11 +19,9 @@ package org.springframework.cloud.alicloud.ans; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.alicloud.ans.migrate.MigrateOnConditionMissingClass; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; /** @@ -31,7 +29,6 @@ import org.springframework.context.annotation.Configuration; * @author pbting */ @Configuration -@Conditional(MigrateOnConditionMissingClass.class) @ConditionalOnMissingBean(DiscoveryClient.class) @EnableConfigurationProperties @AutoConfigureBefore(SimpleDiscoveryClientAutoConfiguration.class) diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/endpoint/AnsEndpoint.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/endpoint/AnsEndpoint.java index baefdb56..7688074e 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/endpoint/AnsEndpoint.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/endpoint/AnsEndpoint.java @@ -19,8 +19,8 @@ package org.springframework.cloud.alicloud.ans.endpoint; import com.alibaba.ans.core.NamingService; import com.alibaba.ans.shaded.com.taobao.vipserver.client.core.Host; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; import org.springframework.cloud.alicloud.context.ans.AnsProperties; @@ -37,7 +37,7 @@ import java.util.Set; @Endpoint(id = "ans") public class AnsEndpoint { - private static final Log log = LogFactory.getLog(AnsEndpoint.class); + private static final Logger log = LoggerFactory.getLogger(AnsEndpoint.class); private AnsProperties ansProperties; diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateEndpoint.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateEndpoint.java deleted file mode 100644 index 59b2146a..00000000 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateEndpoint.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.springframework.cloud.alicloud.ans.migrate; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.actuate.endpoint.annotation.Endpoint; -import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; - -import java.util.Map; -import java.util.concurrent.ConcurrentMap; - -@Endpoint(id = "migrate") -public class MigrateEndpoint { - - private static final Logger log = LoggerFactory.getLogger(MigrateEndpoint.class); - - public MigrateEndpoint() { - } - - /** - * @return ans endpoint - */ - @ReadOperation - public Map> invoke() { - - Map> result = ServerListInvocationHandler - .getServerRegistry(); - - log.info("migrate server list :" + result); - return result; - } -} \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateEndpointAutoConfiguration.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateEndpointAutoConfiguration.java deleted file mode 100644 index af572837..00000000 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateEndpointAutoConfiguration.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.springframework.cloud.alicloud.ans.migrate; - -import org.springframework.boot.actuate.endpoint.annotation.Endpoint; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; - -/** - * @author pbting - */ -@ConditionalOnWebApplication -@ConditionalOnClass(value = Endpoint.class) -@Conditional(MigrateOnConditionClass.class) -public class MigrateEndpointAutoConfiguration { - - @Bean - public MigrateEndpoint ansEndpoint() { - return new MigrateEndpoint(); - } -} \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnCondition.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnCondition.java deleted file mode 100644 index 86816587..00000000 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnCondition.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.springframework.cloud.alicloud.ans.migrate; - -import org.springframework.beans.factory.BeanClassLoaderAware; -import org.springframework.context.annotation.Condition; -import org.springframework.context.annotation.ConditionContext; -import org.springframework.core.type.AnnotatedTypeMetadata; -import org.springframework.util.ClassUtils; - -/** - * @author pbting - */ -public abstract class MigrateOnCondition implements Condition, BeanClassLoaderAware { - - final String[] conditionOnClass = new String[] { - "org.springframework.cloud.consul.serviceregistry.ConsulAutoServiceRegistration", - "org.springframework.cloud.netflix.eureka.serviceregistry.EurekaAutoServiceRegistration" }; - - ClassLoader classLoader; - - @Override - public void setBeanClassLoader(ClassLoader classLoader) { - this.classLoader = classLoader; - } - - @Override - public abstract boolean matches(ConditionContext context, - AnnotatedTypeMetadata metadata); - - boolean isPresent(String className, ClassLoader classLoader) { - if (classLoader == null) { - classLoader = ClassUtils.getDefaultClassLoader(); - } - - try { - forName(className, classLoader); - return true; - } - catch (Throwable throwable) { - return false; - } - } - - Class forName(String className, ClassLoader classLoader) - throws ClassNotFoundException { - return classLoader != null ? classLoader.loadClass(className) - : Class.forName(className); - } -} \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionClass.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionClass.java deleted file mode 100644 index 9e99c9f8..00000000 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionClass.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.springframework.cloud.alicloud.ans.migrate; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.annotation.ConditionContext; -import org.springframework.core.type.AnnotatedTypeMetadata; - -/** - * @author pbting - */ -public class MigrateOnConditionClass extends MigrateOnCondition { - - private static final Logger log = LoggerFactory - .getLogger(MigrateOnConditionClass.class); - - @Override - public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { - boolean result = isPresent(conditionOnClass[0], classLoader) - || isPresent(conditionOnClass[1], classLoader); - log.info("the result of matcher is " + result); - return result; - } -} \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionMissingClass.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionMissingClass.java deleted file mode 100644 index b5653bb7..00000000 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateOnConditionMissingClass.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.springframework.cloud.alicloud.ans.migrate; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.annotation.ConditionContext; -import org.springframework.core.type.AnnotatedTypeMetadata; - -/** - * @author pbting - */ -public class MigrateOnConditionMissingClass extends MigrateOnConditionClass { - private static final Logger log = LoggerFactory - .getLogger(MigrateOnConditionMissingClass.class); - - @Override - public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { - boolean result = !super.matches(context, metadata); - log.info(" the result of matcher is " + result); - return result; - } - -} \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateProxyManager.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateProxyManager.java deleted file mode 100644 index f44f1af9..00000000 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateProxyManager.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.springframework.cloud.alicloud.ans.migrate; - -import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.ILoadBalancer; -import com.netflix.loadbalancer.Server; -import com.netflix.loadbalancer.ServerList; -import org.aopalliance.aop.Advice; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.aop.AfterReturningAdvice; -import org.springframework.aop.framework.ProxyFactory; - -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentSkipListSet; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * @author pbting - */ -final class MigrateProxyManager { - - private static final Logger log = LoggerFactory.getLogger(MigrateProxyManager.class); - private final static AtomicBoolean IS_PROXY = new AtomicBoolean(true); - - private final static Set SERVICES_ID = new ConcurrentSkipListSet<>(); - - private static Object springProxyFactory(Object target, ClassLoader classLoader, - List adviceList, Class... interfaces) { - final ProxyFactory proxyFactory = new ProxyFactory(interfaces); - proxyFactory.setTarget(target); - adviceList.forEach(advice -> proxyFactory.addAdvice(advice)); - return proxyFactory.getProxy(classLoader); - } - - static Object newServerListProxy(Object bean, ClassLoader classLoader, - IClientConfig clientConfig) { - bean = springProxyFactory(bean, classLoader, - Arrays.asList(new ServerListInvocationHandler(clientConfig)), - new Class[] { ServerList.class }); - log.info("[service id]" + clientConfig.getClientName() - + " new a ServerList proxy instance for spring cloud netflix to spring cloud alibaba "); - collectServiceId(clientConfig.getClientName()); - return bean; - } - - static Object newLoadBalancerProxy(Object bean, ClassLoader classLoader, - final IClientConfig clientConfig) { - - bean = springProxyFactory(bean, classLoader, - Arrays.asList(new AfterReturningAdvice() { - private final IClientConfig iclientConfig = clientConfig; - - @Override - public void afterReturning(Object returnValue, Method method, - Object[] args, Object target) { - String methodName = method.getName(); - if ("chooseServer".equals(methodName)) { - String serviceId = iclientConfig.getClientName(); - Server server = (Server) returnValue; - server = ServerListInvocationHandler - .checkAndGetServiceServer(serviceId, server); - ServerListInvocationHandler.incrementCallService(serviceId, - server); - } - } - }), new Class[] { ILoadBalancer.class }); - log.info("[service id]" + clientConfig.getClientName() - + " new a ILoadBalancer proxy instance for spring cloud netflix to spring cloud alibaba "); - return bean; - } - - static void migrateProxyClose() { - IS_PROXY.set(false); - } - - static void migrateProxyUp() { - IS_PROXY.set(true); - } - - static boolean isMigrateProxy() { - - return IS_PROXY.get(); - } - - static void collectServiceId(String serviceId) { - SERVICES_ID.add(serviceId); - } - - static Set getServicesId() { - - return Collections.unmodifiableSet(SERVICES_ID); - } -} \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateRefreshEventListener.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateRefreshEventListener.java deleted file mode 100644 index 70d12113..00000000 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateRefreshEventListener.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.springframework.cloud.alicloud.ans.migrate; - -import com.netflix.loadbalancer.ILoadBalancer; -import org.springframework.cloud.context.named.NamedContextFactory; -import org.springframework.cloud.endpoint.event.RefreshEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -/** - * @author pbting - */ -@Component -public class MigrateRefreshEventListener implements ApplicationListener { - - private final static int CHECK_INTERVAL = 1; - - private final static String MIGRATE_SWITCH = "spring.cloud.alicloud.migrate.ans.switch"; - - private volatile String lastScaMigrateAnsSwitchValue = "true"; - - private Environment environment; - - private NamedContextFactory namedContextFactory; - - public MigrateRefreshEventListener(Environment environment, - NamedContextFactory namedContextFactory) { - this.environment = environment; - this.namedContextFactory = namedContextFactory; - } - - @PostConstruct - public void initTimerCheck() { - Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay( - () -> onApplicationEvent(null), CHECK_INTERVAL, CHECK_INTERVAL, - TimeUnit.SECONDS); - } - - @Override - public void onApplicationEvent(RefreshEvent event) { - String value = environment.getProperty(MIGRATE_SWITCH, "true"); - // check 1: check the value - if (value.equals(lastScaMigrateAnsSwitchValue)) { - return; - } - - updateLastScaMigrateAnsResetValue(value); - - // step 1: migrate up - if ("true".equals(value)) { - MigrateProxyManager.migrateProxyUp(); - serviceIdContextInit(); - return; - } - - // step 2: migrate close - if ("false".equals(value)) { - MigrateProxyManager.migrateProxyClose(); - serviceIdContextInit(); - return; - } - } - - private void serviceIdContextInit() { - namedContextFactory.destroy(); - // initializer each spring context for service id - MigrateProxyManager.getServicesId().forEach(serviceId -> namedContextFactory - .getInstance(serviceId, ILoadBalancer.class)); - } - - private synchronized void updateLastScaMigrateAnsResetValue(String value) { - this.lastScaMigrateAnsSwitchValue = value; - } -} \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateRibbonBeanPostProcessor.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateRibbonBeanPostProcessor.java deleted file mode 100644 index b03a1890..00000000 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateRibbonBeanPostProcessor.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.springframework.cloud.alicloud.ans.migrate; - -import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.ILoadBalancer; -import com.netflix.loadbalancer.ServerList; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.BeanClassLoaderAware; -import org.springframework.beans.factory.config.BeanPostProcessor; - -public class MigrateRibbonBeanPostProcessor - implements BeanPostProcessor, BeanClassLoaderAware { - - private static final Logger log = LoggerFactory.getLogger(MigrateOnCondition.class); - - private ClassLoader classLoader; - private IClientConfig clientConfig; - - public MigrateRibbonBeanPostProcessor(IClientConfig clientConfig) { - this.clientConfig = clientConfig; - } - - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) - throws BeansException { - - // step 1 : check the bean whether proxy or not - if (!MigrateProxyManager.isMigrateProxy()) { - log.info("Migrate proxy is Close."); - return bean; - } - - // step 2 : proxy the designated bean - if (bean instanceof ServerList) { - bean = MigrateProxyManager.newServerListProxy(bean, classLoader, - clientConfig); - } - - if (bean instanceof ILoadBalancer) { - bean = MigrateProxyManager.newLoadBalancerProxy(bean, classLoader, - clientConfig); - } - return bean; - } - - @Override - public void setBeanClassLoader(ClassLoader classLoader) { - this.classLoader = classLoader; - } - -} \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateServiceRegistry.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateServiceRegistry.java deleted file mode 100644 index 11ca9e9c..00000000 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrateServiceRegistry.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.springframework.cloud.alicloud.ans.migrate; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.web.context.WebServerInitializedEvent; -import org.springframework.cloud.alicloud.ans.registry.AnsRegistration; -import org.springframework.cloud.alicloud.ans.registry.AnsServiceRegistry; -import org.springframework.cloud.alicloud.context.ans.AnsProperties; -import org.springframework.cloud.client.serviceregistry.ServiceRegistry; -import org.springframework.context.ApplicationContext; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * @author pbting - */ -@Component -public class MigrateServiceRegistry { - - private static final Logger log = LoggerFactory - .getLogger(MigrateServiceRegistry.class); - - private AtomicBoolean running = new AtomicBoolean(false); - - private ServiceRegistry serviceRegistry; - private AnsRegistration ansRegistration; - - public MigrateServiceRegistry(AnsProperties ansProperties, - ApplicationContext context) { - this.ansRegistration = new AnsRegistration(ansProperties, context); - this.ansRegistration.init(); - this.serviceRegistry = new AnsServiceRegistry(); - } - - @EventListener(WebServerInitializedEvent.class) - public void onApplicationEvent(WebServerInitializedEvent event) { - int serverPort = event.getWebServer().getPort(); - this.ansRegistration.setPort(serverPort); - log.info("[ Migrate ] change the port to " + serverPort); - if (!this.running.get()) { - long s = System.currentTimeMillis(); - log.info("[Migrate] start to registry server to ANS"); - this.serviceRegistry.register(this.ansRegistration); - log.info("[migrate] end to registry server to ANS cost time with " - + (System.currentTimeMillis() - s) + " ms."); - this.running.set(true); - } - } - -} \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrationAutoconfiguration.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrationAutoconfiguration.java deleted file mode 100644 index 8f632bf1..00000000 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/MigrationAutoconfiguration.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.springframework.cloud.alicloud.ans.migrate; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.alicloud.ans.ConditionalOnAnsEnabled; -import org.springframework.cloud.alicloud.context.ans.AnsProperties; -import org.springframework.cloud.context.named.NamedContextFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; - -/** - * @author pbting - */ -@Configuration -@EnableConfigurationProperties -@Conditional(MigrateOnConditionClass.class) -@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true) -@ConditionalOnAnsEnabled -public class MigrationAutoconfiguration { - - @Bean - public MigrateServiceRegistry migrationManger(AnsProperties ansProperties, - ApplicationContext applicationContext) { - - return new MigrateServiceRegistry(ansProperties, applicationContext); - } - - @Bean - public MigrateRefreshEventListener migrateRefreshEventListener( - Environment environment, - @Qualifier(value = "springClientFactory") NamedContextFactory namedContextFactory) { - - return new MigrateRefreshEventListener(environment, namedContextFactory); - } -} \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/ServerListInvocationHandler.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/ServerListInvocationHandler.java deleted file mode 100644 index 16d533c1..00000000 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/ServerListInvocationHandler.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.springframework.cloud.alicloud.ans.migrate; - -import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.Server; -import org.aopalliance.intercept.MethodInterceptor; -import org.aopalliance.intercept.MethodInvocation; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.cloud.alicloud.ans.ribbon.AnsServer; -import org.springframework.cloud.alicloud.ans.ribbon.AnsServerList; - -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ConcurrentSkipListSet; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicLong; - -/** - * @author pbting - */ -class ServerListInvocationHandler implements MethodInterceptor { - - private static final Logger log = LoggerFactory - .getLogger(ServerListInvocationHandler.class); - - private final static ConcurrentMap SERVER_LIST_CONCURRENT_MAP = new ConcurrentHashMap<>(); - - private final static ConcurrentMap> CALL_SERVICE_COUNT = new ConcurrentHashMap<>(); - - private final static Set INTERCEPTOR_METHOD_NAME = new ConcurrentSkipListSet(); - - private IClientConfig clientConfig; - private AnsServerList ansServerList; - private AtomicBoolean isFirst = new AtomicBoolean(false); - - static { - INTERCEPTOR_METHOD_NAME.add("getInitialListOfServers"); - INTERCEPTOR_METHOD_NAME.add("getUpdatedListOfServers"); - } - - ServerListInvocationHandler(IClientConfig clientConfig) { - this.clientConfig = clientConfig; - this.ansServerList = new AnsServerList(clientConfig.getClientName()); - SERVER_LIST_CONCURRENT_MAP.put(ansServerList.getDom(), ansServerList); - } - - @Override - public Object invoke(MethodInvocation invocation) throws Throwable { - String methodName = invocation.getMethod().getName(); - // step 1: check the method is not interceptor - if (!INTERCEPTOR_METHOD_NAME.contains(methodName)) { - return invocation.proceed(); - } - - // step 2: interceptor the method - List serverList = (List) invocation.proceed(); - long s = System.currentTimeMillis(); - log.info("[ START ] merage server list for " + clientConfig.getClientName()); - serverList = mergeAnsServerList(serverList); - log.info("[ END ] merage server list for " + clientConfig.getClientName() - + ", cost time " + (System.currentTimeMillis() - s) + " ms ."); - return serverList; - } - - /** - * 后台线程 和 Eureka 两个注册中心进行 Merage 的时候,List 表中始终保持是有效的 Server. 即不考虑 ANS 客户端本地容灾的情况 - */ - private List mergeAnsServerList(final List source) { - if (isFirst.compareAndSet(false, true)) { - return source; - } - - // step 1: get all of server list and filter the alive - List ansServerList = filterAliveAnsServer( - this.ansServerList.getInitialListOfServers()); - - if (ansServerList.isEmpty()) { - return source; - } - - log.info("[" + this.clientConfig.getClientName() + "] Get Server List from ANS:" - + ansServerList + "; loadbalancer server list override before:" + source); - - // step 2:remove servers of that have in load balancer list - final Iterator serverIterator = source.iterator(); - while (serverIterator.hasNext()) { - final Server server = serverIterator.next(); - ansServerList.forEach(ansServer -> { - if (server.getHostPort() - .equals(ansServer.getHealthService().toInetAddr())) { - // by: ZoneAffinityPredicate - serverIterator.remove(); - log.info("Source Server is remove " + server.getHostPort() - + ", and from ANS Server is override:" - + ansServer.toString()); - } - // fix bug: mast be set the zone, update server list,will filter - ansServer.setZone(server.getZone()); - ansServer.setSchemea(server.getScheme()); - ansServer.setId(ansServer.getHealthService().toInetAddr()); - ansServer.setReadyToServe(true); - }); - } - - ansServerList.forEach(ansServer -> source.add(ansServer)); - log.info("[" + this.clientConfig.getClientName() + "] " - + "; loadbalancer server list override after:" + source); - // override - return source; - } - - private List filterAliveAnsServer(List sourceServerList) { - final List resultServerList = new LinkedList<>(); - sourceServerList.forEach(ansServer -> { - boolean isAlive = ansServer.isAlive(3); - if (isAlive) { - resultServerList.add(ansServer); - } - log.warn(ansServer.toString() + " isAlive :" + isAlive); - }); - return resultServerList; - } - - static Map> getServerRegistry() { - - return Collections.unmodifiableMap(CALL_SERVICE_COUNT); - } - - static Server checkAndGetServiceServer(String serviceId, Server server) { - if (server != null) { - return server; - } - - log.warn(String.format("[%s] refers the server is null", server)); - - List ansServerList = SERVER_LIST_CONCURRENT_MAP.get(serviceId) - .getInitialListOfServers(); - - if (!ansServerList.isEmpty()) { - return ansServerList.get(0); - } - - return server; - } - - static void incrementCallService(String serviceId, Server server) { - ConcurrentMap concurrentHashMap = CALL_SERVICE_COUNT - .putIfAbsent(serviceId, new ConcurrentHashMap<>()); - - if (concurrentHashMap == null) { - concurrentHashMap = CALL_SERVICE_COUNT.get(serviceId); - } - - String ipPort = server.getHostPort(); - ServerWrapper serverWraper = concurrentHashMap.putIfAbsent(ipPort, - new ServerWrapper(server, new AtomicLong())); - - if (serverWraper == null) { - serverWraper = concurrentHashMap.get(ipPort); - } - serverWraper.setServer(server); - serverWraper.getCallCount().incrementAndGet(); - } -} \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/ServerWrapper.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/ServerWrapper.java deleted file mode 100644 index 4fbccfdf..00000000 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/migrate/ServerWrapper.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.springframework.cloud.alicloud.ans.migrate; - -import com.netflix.loadbalancer.Server; - -import java.util.concurrent.atomic.AtomicLong; - -/** - * @author pbting - */ -public class ServerWrapper { - - private Server server; - private AtomicLong callCount; - - public ServerWrapper() { - } - - public ServerWrapper(Server server, AtomicLong callCount) { - this.server = server; - this.callCount = callCount; - } - - public Server getServer() { - return server; - } - - public void setServer(Server server) { - this.server = server; - } - - public AtomicLong getCallCount() { - return callCount; - } - - public void setCallCount(AtomicLong callCount) { - this.callCount = callCount; - } -} \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistration.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistration.java index 4158dedb..56a37ade 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistration.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/registry/AnsAutoServiceRegistration.java @@ -18,7 +18,6 @@ package org.springframework.cloud.alicloud.ans.registry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration; import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties; import org.springframework.cloud.client.serviceregistry.ServiceRegistry; @@ -34,7 +33,6 @@ public class AnsAutoServiceRegistration private static final Logger log = LoggerFactory .getLogger(AnsAutoServiceRegistration.class); - @Autowired private AnsRegistration registration; public AnsAutoServiceRegistration(ServiceRegistry serviceRegistry, diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/registry/AnsServiceRegistry.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/registry/AnsServiceRegistry.java index d08fed69..05b43639 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/registry/AnsServiceRegistry.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/registry/AnsServiceRegistry.java @@ -41,7 +41,7 @@ public class AnsServiceRegistry implements ServiceRegistry { public void register(AnsRegistration registration) { if (!registration.isRegisterEnabled()) { - log.info("Registration is disabled..."); + log.warn("Registration is disabled..."); return; } if (StringUtils.isEmpty(registration.getServiceId())) { @@ -63,14 +63,13 @@ public class AnsServiceRegistry implements ServiceRegistry { NamingService.regDom(dom, registration.getHost(), registration.getPort(), registration.getRegisterWeight(dom), registration.getCluster(), tags); - log.info("INFO_ANS_REGISTER, " + dom + " " - + registration.getAnsProperties().getClientIp() + ":" - + registration.getAnsProperties().getClientPort() - + " register finished"); + log.info("INFO_ANS_REGISTER, {} {}:{} register finished", dom, + registration.getAnsProperties().getClientIp(), + registration.getAnsProperties().getClientPort()); } catch (Exception e) { - log.error("ERR_ANS_REGISTER, " + dom + " register failed..." - + registration.toString() + ",", e); + log.error("ERR_ANS_REGISTER, {} register failed...{},", dom, + registration.toString(), e); } } } @@ -90,8 +89,8 @@ public class AnsServiceRegistry implements ServiceRegistry { registration.getPort(), registration.getCluster()); } catch (Exception e) { - log.error("ERR_ANS_DEREGISTER, de-register failed..." - + registration.toString() + ",", e); + log.error("ERR_ANS_DEREGISTER, de-register failed...{},", + registration.toString(), e); } log.info("De-registration finished."); diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/AnsRibbonClientConfiguration.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/AnsRibbonClientConfiguration.java index c67c6c38..d189a4da 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/AnsRibbonClientConfiguration.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/AnsRibbonClientConfiguration.java @@ -19,9 +19,7 @@ package org.springframework.cloud.alicloud.ans.ribbon; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.ServerList; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.cloud.alicloud.ans.migrate.MigrateOnConditionMissingClass; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; /** @@ -29,7 +27,6 @@ import org.springframework.context.annotation.Configuration; * @author pbting */ @Configuration -@Conditional(MigrateOnConditionMissingClass.class) public class AnsRibbonClientConfiguration { @Bean diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/AnsServer.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/AnsServer.java index d19f6287..55684a64 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/AnsServer.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/AnsServer.java @@ -16,16 +16,12 @@ package org.springframework.cloud.alicloud.ans.ribbon; +import java.util.Collections; +import java.util.Map; + import com.alibaba.ans.shaded.com.taobao.vipserver.client.core.Host; import com.netflix.loadbalancer.Server; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - /** * @author xiaolongzuo */ @@ -38,8 +34,7 @@ public class AnsServer extends Server { public AnsServer(final Host host, final String dom) { super(host.getIp(), host.getPort()); this.host = host; - this.metadata = new HashMap(); - this.metadata.put("source", "ANS"); + this.metadata = Collections.emptyMap(); metaInfo = new MetaInfo() { @Override public String getAppName() { @@ -64,33 +59,6 @@ public class AnsServer extends Server { }; } - @Override - public boolean isAlive() { - - return true; - } - - /** - * - * @param timeOut Unit: Seconds - * @return - */ - public boolean isAlive(long timeOut) { - try { - String hostName = this.host.getHostname(); - hostName = hostName != null && hostName.trim().length() > 0 ? hostName - : this.host.getIp(); - Socket socket = new Socket(); - socket.connect(new InetSocketAddress(hostName, this.host.getPort()), - (int) TimeUnit.SECONDS.toMillis(timeOut)); - socket.close(); - return true; - } - catch (IOException e) { - return false; - } - } - @Override public MetaInfo getMetaInfo() { return metaInfo; diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/AnsServerList.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/AnsServerList.java index c3b308be..f34f19ff 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/AnsServerList.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/AnsServerList.java @@ -16,23 +16,19 @@ package org.springframework.cloud.alicloud.ans.ribbon; -import com.alibaba.ans.core.NamingService; -import com.alibaba.ans.shaded.com.taobao.vipserver.client.core.Host; - -import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.AbstractServerList; - import java.util.ArrayList; import java.util.List; +import com.alibaba.ans.core.NamingService; +import com.alibaba.ans.shaded.com.taobao.vipserver.client.core.Host; +import com.netflix.client.config.IClientConfig; +import com.netflix.loadbalancer.AbstractServerList; + /** * @author xiaolongzuo - * @author pbting */ public class AnsServerList extends AbstractServerList { - private final static int CONNECT_TIME_OUT = 3; - private String dom; public AnsServerList(String dom) { @@ -64,12 +60,10 @@ public class AnsServerList extends AbstractServerList { List result = new ArrayList(hosts.size()); for (Host host : hosts) { if (host.isValid()) { - AnsServer ansServer = hostToServer(host); - if (ansServer.isAlive(CONNECT_TIME_OUT)) { - result.add(ansServer); - } + result.add(hostToServer(host)); } } + return result; } diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/MigrateRibbonCofiguration.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/MigrateRibbonCofiguration.java deleted file mode 100644 index 9074b786..00000000 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/MigrateRibbonCofiguration.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.springframework.cloud.alicloud.ans.ribbon; - -import com.netflix.client.config.IClientConfig; -import org.springframework.cloud.alicloud.ans.migrate.MigrateOnConditionClass; -import org.springframework.cloud.alicloud.ans.migrate.MigrateRibbonBeanPostProcessor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; -import org.springframework.context.annotation.Configuration; - -@Configuration -@Conditional(MigrateOnConditionClass.class) -public class MigrateRibbonCofiguration { - - @Bean - public MigrateRibbonBeanPostProcessor migrateBeanPostProcessor(IClientConfig clientConfig) { - - return new MigrateRibbonBeanPostProcessor(clientConfig); - } -} \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/RibbonAnsAutoConfiguration.java b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/RibbonAnsAutoConfiguration.java index cf7d52ff..4333cb53 100644 --- a/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/RibbonAnsAutoConfiguration.java +++ b/spring-cloud-alicloud-ans/src/main/java/org/springframework/cloud/alicloud/ans/ribbon/RibbonAnsAutoConfiguration.java @@ -34,7 +34,6 @@ import org.springframework.context.annotation.Configuration; @ConditionalOnBean(SpringClientFactory.class) @ConditionalOnRibbonAns @AutoConfigureAfter(RibbonAutoConfiguration.class) -@RibbonClients(defaultConfiguration = { AnsRibbonClientConfiguration.class, - MigrateRibbonCofiguration.class }) +@RibbonClients(defaultConfiguration = AnsRibbonClientConfiguration.class) public class RibbonAnsAutoConfiguration { } diff --git a/spring-cloud-alicloud-ans/src/main/resources/META-INF/spring.factories b/spring-cloud-alicloud-ans/src/main/resources/META-INF/spring.factories index 63f54329..02177b93 100644 --- a/spring-cloud-alicloud-ans/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alicloud-ans/src/main/resources/META-INF/spring.factories @@ -2,6 +2,4 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.cloud.alicloud.ans.endpoint.AnsEndpointAutoConfiguration,\ org.springframework.cloud.alicloud.ans.ribbon.RibbonAnsAutoConfiguration,\ org.springframework.cloud.alicloud.ans.AnsAutoConfiguration,\ - org.springframework.cloud.alicloud.ans.migrate.MigrateEndpointAutoConfiguration,\ - org.springframework.cloud.alicloud.ans.migrate.MigrationAutoconfiguration,\ org.springframework.cloud.alicloud.ans.AnsDiscoveryClientAutoConfiguration \ No newline at end of file diff --git a/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/ribbon/AnsServerListTests.java b/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/ribbon/AnsServerListTests.java index 815fa89d..b7cf34e3 100644 --- a/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/ribbon/AnsServerListTests.java +++ b/spring-cloud-alicloud-ans/src/test/java/org/springframework/cloud/alicloud/ans/ribbon/AnsServerListTests.java @@ -71,8 +71,6 @@ public class AnsServerListTests { PowerMockito.mockStatic(NamingService.class); when(NamingService.getHosts(anyString())).thenReturn(hosts); - PowerMockito.stub(PowerMockito.method(AnsServer.class, "isAlive", long.class)) - .toReturn(true); IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); @@ -101,8 +99,6 @@ public class AnsServerListTests { when(NamingService.getHosts(eq("test-service"))).thenReturn( hosts.stream().filter(Host::isValid).collect(Collectors.toList())); - PowerMockito.stub(PowerMockito.method(AnsServer.class, "isAlive", long.class)) - .toReturn(true); IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); @@ -132,8 +128,6 @@ public class AnsServerListTests { PowerMockito.mockStatic(NamingService.class); when(NamingService.getHosts(eq("test-service"))).thenReturn( hosts.stream().filter(Host::isValid).collect(Collectors.toList())); - PowerMockito.stub(PowerMockito.method(AnsServer.class, "isAlive", long.class)) - .toReturn(true); IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service");