diff --git a/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/pom.xml b/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/pom.xml index 9797cc653..c33d0237f 100644 --- a/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/pom.xml +++ b/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/pom.xml @@ -21,9 +21,14 @@ com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config + + org.projectlombok + lombok + com.alibaba.cloud spring-cloud-alibaba-test-support + test diff --git a/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/java/com/alibaba/cloud/tests/nacos/NacosConfigTestApplication.java b/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/java/com/alibaba/cloud/tests/nacos/config/NacosConfigTestApplication.java similarity index 95% rename from spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/java/com/alibaba/cloud/tests/nacos/NacosConfigTestApplication.java rename to spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/java/com/alibaba/cloud/tests/nacos/config/NacosConfigTestApplication.java index c115e98d6..d64c74700 100644 --- a/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/java/com/alibaba/cloud/tests/nacos/NacosConfigTestApplication.java +++ b/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/java/com/alibaba/cloud/tests/nacos/config/NacosConfigTestApplication.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.alibaba.cloud.tests.nacos; +package com.alibaba.cloud.tests.nacos.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/java/com/alibaba/cloud/tests/nacos/UserProperties.java b/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/java/com/alibaba/cloud/tests/nacos/config/UserProperties.java similarity index 95% rename from spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/java/com/alibaba/cloud/tests/nacos/UserProperties.java rename to spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/java/com/alibaba/cloud/tests/nacos/config/UserProperties.java index 3d23bbe41..38e6b1f67 100644 --- a/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/java/com/alibaba/cloud/tests/nacos/UserProperties.java +++ b/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/java/com/alibaba/cloud/tests/nacos/config/UserProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.alibaba.cloud.tests.nacos; +package com.alibaba.cloud.tests.nacos.config; import java.util.List; import java.util.Map; diff --git a/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/resources/application.yml b/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/main/resources/application.yml new file mode 100644 index 000000000..e69de29bb diff --git a/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/test/java/com/alibaba/cloud/tests/nacos/NacosConfigRefreshTest.java b/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/test/java/com/alibaba/cloud/tests/nacos/config/NacosConfigRefreshTest.java similarity index 96% rename from spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/test/java/com/alibaba/cloud/tests/nacos/NacosConfigRefreshTest.java rename to spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/test/java/com/alibaba/cloud/tests/nacos/config/NacosConfigRefreshTest.java index 3b9ce6939..9ed065ad1 100644 --- a/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/test/java/com/alibaba/cloud/tests/nacos/NacosConfigRefreshTest.java +++ b/spring-cloud-alibaba-tests/nacos-tests/nacos-config-test/src/test/java/com/alibaba/cloud/tests/nacos/config/NacosConfigRefreshTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.alibaba.cloud.tests.nacos; +package com.alibaba.cloud.tests.nacos.config; import com.alibaba.cloud.nacos.NacosConfigManager; import com.alibaba.cloud.testsupport.ContainerStarter; @@ -33,7 +33,7 @@ import org.springframework.context.event.EventListener; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; -import static com.alibaba.cloud.tests.nacos.NacosConfigRefreshTest.PushConfigConfiguration; +import static com.alibaba.cloud.tests.nacos.config.NacosConfigRefreshTest.PushConfigConfiguration; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; diff --git a/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/pom.xml b/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/pom.xml index b866a3103..b5d71bf80 100644 --- a/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/pom.xml +++ b/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/pom.xml @@ -33,6 +33,14 @@ org.springframework.cloud spring-cloud-starter-openfeign + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + org.projectlombok + lombok + com.alibaba.cloud spring-cloud-alibaba-test-support diff --git a/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/src/main/java/com/alibaba/cloud/tests/nacos/discovery/NacosDiscoveryTestApp.java b/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/src/main/java/com/alibaba/cloud/tests/nacos/discovery/NacosDiscoveryTestApp.java new file mode 100644 index 000000000..832de99f9 --- /dev/null +++ b/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/src/main/java/com/alibaba/cloud/tests/nacos/discovery/NacosDiscoveryTestApp.java @@ -0,0 +1,99 @@ +/* + * Copyright 2013-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.tests.nacos.discovery; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.context.ServletWebServerInitializedEvent; +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.Profile; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +/** + * + * @author freeman + */ +@SpringBootApplication +@EnableFeignClients +public class NacosDiscoveryTestApp { + + public static void main(String[] args) { + SpringApplication.run(NacosDiscoveryTestApp.class, args); + } + + @Bean + @LoadBalanced + @Profile("service-1") + RestTemplate restTemplate() { + return new RestTemplate(); + } + + @RestController + @Profile("service-2") + static class Controller { + int port; + + @GetMapping + public Object get() { + return port; + } + + @GetMapping("/{ok}") + public Object pass(@PathVariable Boolean ok) { + if (ok) { + return "ok"; + } + throw new RuntimeException("not ok!"); + } + + @EventListener + public void onApplicationEvent(ServletWebServerInitializedEvent event) { + port = event.getWebServer().getPort(); + } + } + + @FeignClient(value = "service-2", fallback = Fallback.class) + interface Service2Client { + @GetMapping + Object get(); + + @GetMapping("/{ok}") + String pass(@PathVariable Boolean ok); + } + + @Component + static class Fallback implements Service2Client { + @Override + public Object get() { + return "shouldn't use this !"; + } + + @Override + public String pass(Boolean ok) { + return "fallback"; + } + } + +} diff --git a/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/src/test/java/com/alibaba/cloud/tests/nacos/discovery/NacosDiscoveryTest.java b/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/src/test/java/com/alibaba/cloud/tests/nacos/discovery/NacosDiscoveryTest.java new file mode 100644 index 000000000..fa3855e67 --- /dev/null +++ b/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/src/test/java/com/alibaba/cloud/tests/nacos/discovery/NacosDiscoveryTest.java @@ -0,0 +1,176 @@ +/* + * Copyright 2013-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.tests.nacos.discovery; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +import com.alibaba.cloud.testsupport.ContainerStarter; +import com.alibaba.cloud.testsupport.HasDockerAndItEnabled; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.context.WebServerApplicationContext; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import static com.alibaba.cloud.tests.nacos.discovery.NacosDiscoveryTestApp.Service2Client; +import static com.alibaba.cloud.testsupport.Tester.justDo; +import static com.alibaba.cloud.testsupport.Tester.testFunction; +import static java.util.function.Predicate.isEqual; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +/** + * + * + * @author freeman + */ +@HasDockerAndItEnabled +public class NacosDiscoveryTest { + + static GenericContainer nacos; + + static { + nacos = ContainerStarter.startNacos(); + + // wait nacos started + justDo(() -> Thread.sleep(4000L)); + } + + static { + String serverAddr = "localhost:" + nacos.getMappedPort(8848); + System.setProperty("spring.cloud.nacos.discovery.server-addr", serverAddr); + } + + static volatile ConfigurableApplicationContext service1 = new SpringApplicationBuilder( + NacosDiscoveryTestApp.class).profiles("service-1").run(); + + static volatile ConfigurableApplicationContext service2_0 = new SpringApplicationBuilder( + NacosDiscoveryTestApp.class).profiles("service-2").run(); + + static volatile ConfigurableApplicationContext service2_1 = new SpringApplicationBuilder( + NacosDiscoveryTestApp.class).profiles("service-2").run(); + + @AfterAll + static void stop() { + service1.stop(); + service2_0.stop(); + service2_1.stop(); + } + + @Test + public void testServiceDiscovery() { + testFunction("Service discovery", () -> { + DiscoveryClient discoveryClient = service1.getBean(DiscoveryClient.class); + List instances = discoveryClient.getInstances("service-2"); + assertThat(instances).hasSize(2); + }); + } + + @Test + public void testServiceDiscoveryWithRestTemplate() { + testFunction("Service discovery with RestTemplate", () -> { + RestTemplate restTemplate = service1.getBean(RestTemplate.class); + assertThatThrownBy(() -> service2_0.getBean(RestTemplate.class)); + + // default using RR + List list1 = new ArrayList<>(); + List list2 = new ArrayList<>(); + for (int i = 0; i < 20; i++) { + ResponseEntity response = restTemplate + .getForEntity("http://service-2", String.class); + if (i % 2 != 0) { + list1.add(response.getBody()); + } + else { + list2.add(response.getBody()); + } + } + assertThat(list1).hasSize(10); + assertThat(list2).hasSize(10); + }); + } + + @Test + public void testServiceDiscoveryWithFeignClient() { + testFunction("Service discovery with FeignClient", () -> { + Service2Client service2Client = service1.getBean(Service2Client.class); + + // default using RR + List list1 = new ArrayList<>(); + List list2 = new ArrayList<>(); + for (int i = 0; i < 20; i++) { + Object result = service2Client.get(); + if (i % 2 != 0) { + list1.add(result); + } + else { + list2.add(result); + } + } + assertThat(list1).hasSize(10); + assertThat(list2).hasSize(10); + }); + } + + @Test + public void testServiceDiscoveryWithFeignClientUsingSentinelCircuitBreaker() { + testFunction("Service discovery with FeignClient using Sentinel Circuit Breaker", + () -> { + Service2Client service2Client = service1 + .getBean(Service2Client.class); + + List passResult = new ArrayList<>(); + List fallbackResult = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + passResult.add(service2Client.pass(true)); + fallbackResult.add(service2Client.pass(false)); + } + assertThat(passResult.stream().allMatch(isEqual("ok"))).isTrue(); + assertThat(fallbackResult.stream().allMatch(isEqual("fallback"))) + .isTrue(); + }); + } + + @Test + public void testServiceDiscoveryActuatorEndpoint() { + testFunction("Service discovery actuator endpoint", () -> { + + WebServerApplicationContext webServerApplicationContext = (WebServerApplicationContext) service1; + int port = webServerApplicationContext.getWebServer().getPort(); + + String response = new RestTemplate().getForEntity( + String.format("http://127.0.0.1:%d/actuator/nacosdiscovery", port), + String.class).getBody(); + + LinkedHashMap map = new ObjectMapper().readValue(response, + LinkedHashMap.class); + + assertThat(map.containsKey("subscribe")).isTrue(); + assertThat(map.containsKey("NacosDiscoveryProperties")).isTrue(); + }); + } + +} diff --git a/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/src/test/resources/application-service-1.yml b/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/src/test/resources/application-service-1.yml new file mode 100644 index 000000000..1a22039f4 --- /dev/null +++ b/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/src/test/resources/application-service-1.yml @@ -0,0 +1,23 @@ +server: + port: 0 + tomcat: + threads: + min-spare: 2 + max: 10 +spring: + application: + name: service-1 + cloud: + nacos: + discovery: + server-addr: localhost:8848 +feign: + circuitbreaker: + enabled: true + +management: + endpoints: + web: + exposure: + include: '*' + diff --git a/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/src/test/resources/application-service-2.yml b/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/src/test/resources/application-service-2.yml new file mode 100644 index 000000000..35dd827d4 --- /dev/null +++ b/spring-cloud-alibaba-tests/nacos-tests/nacos-discovery-test/src/test/resources/application-service-2.yml @@ -0,0 +1,13 @@ +server: + port: 0 + tomcat: + threads: + min-spare: 4 + max: 10 +spring: + application: + name: service-2 + cloud: + nacos: + discovery: + server-addr: localhost:8848 diff --git a/spring-cloud-alibaba-tests/pom.xml b/spring-cloud-alibaba-tests/pom.xml index 0c49ff249..a71a35a81 100644 --- a/spring-cloud-alibaba-tests/pom.xml +++ b/spring-cloud-alibaba-tests/pom.xml @@ -38,4 +38,17 @@ + + + + org.apache.maven.plugins + maven-deploy-plugin + ${maven-deploy-plugin.version} + + true + + + + + \ No newline at end of file diff --git a/spring-cloud-alibaba-tests/spring-cloud-alibaba-test-support/pom.xml b/spring-cloud-alibaba-tests/spring-cloud-alibaba-test-support/pom.xml index 614db36dc..b7157edd8 100644 --- a/spring-cloud-alibaba-tests/spring-cloud-alibaba-test-support/pom.xml +++ b/spring-cloud-alibaba-tests/spring-cloud-alibaba-test-support/pom.xml @@ -23,10 +23,6 @@ junit-jupiter compile - - org.projectlombok - lombok - \ No newline at end of file diff --git a/spring-cloud-alibaba-tests/spring-cloud-alibaba-test-support/src/main/java/com/alibaba/cloud/testsupport/ContainerStarter.java b/spring-cloud-alibaba-tests/spring-cloud-alibaba-test-support/src/main/java/com/alibaba/cloud/testsupport/ContainerStarter.java index 66158f2fc..0fe639536 100644 --- a/spring-cloud-alibaba-tests/spring-cloud-alibaba-test-support/src/main/java/com/alibaba/cloud/testsupport/ContainerStarter.java +++ b/spring-cloud-alibaba-tests/spring-cloud-alibaba-test-support/src/main/java/com/alibaba/cloud/testsupport/ContainerStarter.java @@ -109,9 +109,4 @@ public class ContainerStarter { } } - public static void main(String[] args) throws IOException, InterruptedException { - loadHostIp2BrokerConf(); - // startRocketmq("4.9.2").start(); - } - }