From d41b2515140c1198101cb563b1caabfbb5827dd9 Mon Sep 17 00:00:00 2001 From: "Shanyou Yu (Sean Yu)" Date: Fri, 31 Mar 2023 15:16:15 +0800 Subject: [PATCH] fix: adapt for nacos instance (#936) --- CHANGELOG.md | 1 + pom.xml | 2 +- ...sCircuitBreakerGatewayIntegrationTest.java | 2 +- .../PolarisDiscoveryEndpointTest.java | 18 +++- .../registry/PolarisRegistrationTest.java | 16 +++- ...arisRouterServiceInstanceListSupplier.java | 7 +- .../cloud/polaris/router/RouterUtils.java | 35 +------- .../config/LoadBalancerConfiguration.java | 22 ++++- .../router/spi/InstanceTransformer.java | 53 ++++++++++++ .../PolarisInstanceTransformer.java | 45 ++++++++++ ...RouterServiceInstanceListSupplierTest.java | 17 ++-- .../cloud/polaris/router/RouterUtilsTest.java | 5 +- .../config/LoadBalancerConfigurationTest.java | 3 + .../PolarisInstanceTransformerTest.java | 60 +++++++++++++ spring-cloud-tencent-coverage/pom.xml | 6 ++ spring-cloud-tencent-dependencies/pom.xml | 11 ++- .../nacos-callee-service-a/pom.xml | 61 +++++++++++++ .../discovery/nacos/NacosCalleeServiceA.java | 34 ++++++++ .../nacos/NacosCalleeServiceAController.java | 50 +++++++++++ .../src/main/resources/bootstrap.yml | 16 ++++ .../nacos-callee-service-b/pom.xml | 62 +++++++++++++ .../discovery/nacos/NacosCalleeServiceB.java | 34 ++++++++ .../nacos/NacosCalleeServiceBController.java | 54 ++++++++++++ .../src/main/resources/bootstrap.yml | 17 ++++ .../nacos-discovery-caller/pom.xml | 86 +++++++++++++++++++ .../discovery/nacos/NacosCallerService.java | 36 ++++++++ .../nacos/NacosCallerServiceController.java | 42 +++++++++ .../multiple/discovery/nacos/ProviderB.java | 38 ++++++++ .../src/main/resources/bootstrap.yml | 26 ++++++ .../multiple-discovery-nacos-example/pom.xml | 21 +++++ .../multiple-discovery-example/pom.xml | 20 +++++ .../src/main/resources/bootstrap.yml | 10 --- .../src/main/resources/bootstrap.yml | 10 --- .../src/main/resources/bootstrap.yml | 10 --- spring-cloud-tencent-examples/pom.xml | 1 + spring-cloud-tencent-plugin-starters/pom.xml | 1 + .../pom.xml | 42 +++++++++ ...acosDiscoveryAdapterAutoConfiguration.java | 52 +++++++++++ .../transformer/NacosInstanceTransformer.java | 50 +++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + ...DiscoveryAdapterAutoConfigurationTest.java | 51 +++++++++++ .../config/NacosInstanceTransformerTest.java | 66 ++++++++++++++ .../feign/plugin/reporter/ReporterUtils.java | 5 ++ 43 files changed, 1109 insertions(+), 90 deletions(-) create mode 100644 spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/InstanceTransformer.java create mode 100644 spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformer.java create mode 100644 spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformerTest.java create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/pom.xml create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceA.java create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceAController.java create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/src/main/resources/bootstrap.yml create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/pom.xml create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceB.java create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceBController.java create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/src/main/resources/bootstrap.yml create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/pom.xml create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCallerService.java create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCallerServiceController.java create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/java/com/tencent/cloud/multiple/discovery/nacos/ProviderB.java create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/resources/bootstrap.yml create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/pom.xml create mode 100644 spring-cloud-tencent-examples/multiple-discovery-example/pom.xml create mode 100644 spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/pom.xml create mode 100644 spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfiguration.java create mode 100644 spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/transformer/NacosInstanceTransformer.java create mode 100644 spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/test/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfigurationTest.java create mode 100644 spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/test/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosInstanceTransformerTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a7c6724..591a3af0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,3 +10,4 @@ - [fix:fix nacos and consul registration.](https://github.com/Tencent/spring-cloud-tencent/pull/922) - [Documentation content changes: add circuitbreaker readme.](https://github.com/Tencent/spring-cloud-tencent/pull/931) - [fix: fix PolarisRouterServiceInstanceListSupplier npe with reactive feign.](https://github.com/Tencent/spring-cloud-tencent/pull/927) +- [fix: adapt for nacos instance.](https://github.com/Tencent/spring-cloud-tencent/pull/936) \ No newline at end of file diff --git a/pom.xml b/pom.xml index b44db92b..758be0b0 100644 --- a/pom.xml +++ b/pom.xml @@ -88,7 +88,7 @@ - 1.11.0-2022.0.1-SNAPSHOT + 1.10.3-2022.0.1 6.0.7 diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerGatewayIntegrationTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerGatewayIntegrationTest.java index 22513c61..45c8d20f 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerGatewayIntegrationTest.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerGatewayIntegrationTest.java @@ -81,7 +81,7 @@ import static org.assertj.core.api.Assertions.assertThat; ) @AutoConfigureWireMock(port = 0) @ActiveProfiles("test-gateway") -@AutoConfigureWebTestClient(timeout = "10000") +@AutoConfigureWebTestClient(timeout = "1000000") public class PolarisCircuitBreakerGatewayIntegrationTest { private static final String TEST_SERVICE_NAME = "test-service-callee"; diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/endpoint/PolarisDiscoveryEndpointTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/endpoint/PolarisDiscoveryEndpointTest.java index 6d985da9..5a513cf4 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/endpoint/PolarisDiscoveryEndpointTest.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/endpoint/PolarisDiscoveryEndpointTest.java @@ -16,6 +16,7 @@ */ package com.tencent.cloud.polaris.endpoint; +import java.util.Collections; import java.util.Map; import com.tencent.cloud.polaris.PolarisDiscoveryProperties; @@ -38,6 +39,8 @@ import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST; import static com.tencent.polaris.test.common.Consts.PORT; import static com.tencent.polaris.test.common.Consts.SERVICE_PROVIDER; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; /** * Test for polaris discovery endpoint. @@ -75,14 +78,21 @@ public class PolarisDiscoveryEndpointTest { @Test public void testPolarisDiscoveryEndpoint() { this.contextRunner.run(context -> { - PolarisDiscoveryProperties polarisDiscoveryProperties = context.getBean(PolarisDiscoveryProperties.class); - DiscoveryClient discoveryClient = context.getBean(PolarisDiscoveryClient.class); + PolarisDiscoveryProperties polarisDiscoveryProperties = context + .getBean(PolarisDiscoveryProperties.class); + DiscoveryClient discoveryClient = context + .getBean(PolarisDiscoveryClient.class); + PolarisDiscoveryHandler polarisDiscoveryHandler = context.getBean(PolarisDiscoveryHandler.class); PolarisDiscoveryEndpoint polarisDiscoveryEndpoint = new PolarisDiscoveryEndpoint(polarisDiscoveryProperties, discoveryClient, polarisDiscoveryHandler); - Map mapInfo = polarisDiscoveryEndpoint.polarisDiscovery("java_provider_test"); - assertThat(polarisDiscoveryProperties).isEqualTo(mapInfo.get("PolarisDiscoveryProperties")); + + DiscoveryClient discoveryClient1 = mock(DiscoveryClient.class); + doReturn(Collections.singletonList("xx")).when(discoveryClient1).getServices(); + PolarisDiscoveryEndpoint polarisDiscoveryEndpoint1 = new PolarisDiscoveryEndpoint(polarisDiscoveryProperties, discoveryClient1, polarisDiscoveryHandler); + Map mapInfo2 = polarisDiscoveryEndpoint1.polarisDiscovery(null); + assertThat(polarisDiscoveryProperties).isEqualTo(mapInfo2.get("PolarisDiscoveryProperties")); }); } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java index ff8de26a..ebcc5ea4 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java @@ -76,9 +76,17 @@ public class PolarisRegistrationTest { doReturn(true).when(consulContextProperties).isRegister(); // mock NacosContextProperties - nacosContextProperties = mock(NacosContextProperties.class); - doReturn(true).when(nacosContextProperties).isEnabled(); - doReturn(true).when(nacosContextProperties).isRegisterEnabled(); + nacosContextProperties = new NacosContextProperties(); + nacosContextProperties.setEnabled(true); + nacosContextProperties.setRegisterEnabled(true); + nacosContextProperties.setContextPath("/"); + nacosContextProperties.setClusterName("cluster"); + nacosContextProperties.setGroup(""); + nacosContextProperties.setDiscoveryEnabled(true); + nacosContextProperties.setPassword(""); + nacosContextProperties.setUsername(""); + nacosContextProperties.setServerAddr(""); + nacosContextProperties.toString(); // mock SDKContext APIConfig apiConfig = mock(APIConfig.class); @@ -162,7 +170,7 @@ public class PolarisRegistrationTest { Map metadata = polarisRegistration1.getMetadata(); assertThat(metadata).isNotNull(); assertThat(metadata).isNotEmpty(); - assertThat(metadata.size()).isEqualTo(3); + assertThat(metadata.size()).isEqualTo(4); assertThat(metadata.get("key1")).isEqualTo("value1"); } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java index 4f9bd9f9..6470c0c7 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java @@ -33,6 +33,7 @@ import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.pojo.PolarisServiceInstance; import com.tencent.cloud.common.util.JacksonUtils; import com.tencent.cloud.polaris.router.resttemplate.PolarisLoadBalancerRequest; +import com.tencent.cloud.polaris.router.spi.InstanceTransformer; import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor; import com.tencent.cloud.polaris.router.spi.RouterResponseInterceptor; import com.tencent.polaris.api.exception.ErrorCode; @@ -73,14 +74,16 @@ public class PolarisRouterServiceInstanceListSupplier extends DelegatingServiceI private final RouterAPI routerAPI; private final List requestInterceptors; private final List responseInterceptors; + private final InstanceTransformer instanceTransformer; public PolarisRouterServiceInstanceListSupplier(ServiceInstanceListSupplier delegate, RouterAPI routerAPI, List requestInterceptors, - List responseInterceptors) { + List responseInterceptors, InstanceTransformer instanceTransformer) { super(delegate); this.routerAPI = routerAPI; this.requestInterceptors = requestInterceptors; this.responseInterceptors = responseInterceptors; + this.instanceTransformer = instanceTransformer; } @Override @@ -143,7 +146,7 @@ public class PolarisRouterServiceInstanceListSupplier extends DelegatingServiceI } Flux> doRouter(Flux> allServers, PolarisRouterContext routerContext) { - ServiceInstances serviceInstances = RouterUtils.transferServersToServiceInstances(allServers); + ServiceInstances serviceInstances = RouterUtils.transferServersToServiceInstances(allServers, instanceTransformer); List filteredInstances = new ArrayList<>(); if (serviceInstances.getInstances().size() > 0) { diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/RouterUtils.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/RouterUtils.java index 65078430..e2947a31 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/RouterUtils.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/RouterUtils.java @@ -25,8 +25,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import com.tencent.cloud.common.metadata.MetadataContext; -import com.tencent.cloud.common.pojo.PolarisServiceInstance; -import com.tencent.polaris.api.pojo.DefaultInstance; +import com.tencent.cloud.polaris.router.spi.InstanceTransformer; import com.tencent.polaris.api.pojo.DefaultServiceInstances; import com.tencent.polaris.api.pojo.Instance; import com.tencent.polaris.api.pojo.ServiceInstances; @@ -57,14 +56,14 @@ public final class RouterUtils { * @param servers servers * @return ServiceInstances */ - public static ServiceInstances transferServersToServiceInstances(Flux> servers) { + public static ServiceInstances transferServersToServiceInstances(Flux> servers, InstanceTransformer instanceTransformer) { CountDownLatch latch = new CountDownLatch(1); AtomicReference> instancesRef = new AtomicReference<>(); servers.subscribe(serviceInstances -> { instancesRef.set(serviceInstances .stream() - .map(RouterUtils::transferServerToServiceInstance) + .map(instanceTransformer::transform) .collect(Collectors.toList())); latch.countDown(); @@ -87,32 +86,4 @@ public final class RouterUtils { return new DefaultServiceInstances(serviceKey, instances); } - - /** - * transfer ServiceInstance to DefaultInstance. - * - * @param serviceInstance serviceInstance - * @return defaultInstance - */ - public static DefaultInstance transferServerToServiceInstance(ServiceInstance serviceInstance) { - DefaultInstance instance = new DefaultInstance(); - instance.setNamespace(MetadataContext.LOCAL_NAMESPACE); - instance.setService(serviceInstance.getServiceId()); - instance.setProtocol(serviceInstance.getScheme()); - instance.setId(serviceInstance.getInstanceId()); - instance.setHost(serviceInstance.getHost()); - instance.setPort(serviceInstance.getPort()); - instance.setMetadata(serviceInstance.getMetadata()); - - if (serviceInstance instanceof PolarisServiceInstance) { - PolarisServiceInstance polarisServiceInstance = (PolarisServiceInstance) serviceInstance; - instance.setRegion(polarisServiceInstance.getPolarisInstance().getRegion()); - instance.setZone(polarisServiceInstance.getPolarisInstance().getZone()); - instance.setCampus(polarisServiceInstance.getPolarisInstance().getCampus()); - instance.setWeight(polarisServiceInstance.getPolarisInstance().getWeight()); - - } - - return instance; - } } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfiguration.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfiguration.java index ce01715c..da0e6cce 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfiguration.java @@ -20,12 +20,17 @@ package com.tencent.cloud.polaris.router.config; import java.util.List; +import com.tencent.cloud.common.pojo.PolarisServiceInstance; import com.tencent.cloud.polaris.router.PolarisRouterServiceInstanceListSupplier; +import com.tencent.cloud.polaris.router.spi.InstanceTransformer; import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor; import com.tencent.cloud.polaris.router.spi.RouterResponseInterceptor; +import com.tencent.cloud.polaris.router.transformer.PolarisInstanceTransformer; import com.tencent.polaris.router.api.core.RouterAPI; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cloud.client.ConditionalOnBlockingDiscoveryEnabled; import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; import org.springframework.cloud.client.ConditionalOnReactiveDiscoveryEnabled; @@ -51,6 +56,13 @@ public class LoadBalancerConfiguration { */ private static final int REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER = 193827465; + @Bean + @ConditionalOnMissingBean + @ConditionalOnClass(PolarisServiceInstance.class) + public InstanceTransformer instanceTransformer() { + return new PolarisInstanceTransformer(); + } + @Configuration(proxyBeanMethods = false) @ConditionalOnReactiveDiscoveryEnabled @Order(REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER) @@ -61,12 +73,13 @@ public class LoadBalancerConfiguration { public ServiceInstanceListSupplier polarisRouterDiscoveryClientServiceInstanceListSupplier( ConfigurableApplicationContext context, RouterAPI routerAPI, List requestInterceptors, - List responseInterceptors) { + List responseInterceptors, InstanceTransformer instanceTransformer) { return new PolarisRouterServiceInstanceListSupplier( ServiceInstanceListSupplier.builder().withDiscoveryClient().build(context), routerAPI, requestInterceptors, - responseInterceptors); + responseInterceptors, + instanceTransformer); } } @@ -81,12 +94,13 @@ public class LoadBalancerConfiguration { public ServiceInstanceListSupplier polarisRouterDiscoveryClientServiceInstanceListSupplier( ConfigurableApplicationContext context, RouterAPI routerAPI, List requestInterceptors, - List responseInterceptors) { + List responseInterceptors, InstanceTransformer instanceTransformer) { return new PolarisRouterServiceInstanceListSupplier( ServiceInstanceListSupplier.builder().withBlockingDiscoveryClient().build(context), routerAPI, requestInterceptors, - responseInterceptors); + responseInterceptors, + instanceTransformer); } } } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/InstanceTransformer.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/InstanceTransformer.java new file mode 100644 index 00000000..f5684299 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/InstanceTransformer.java @@ -0,0 +1,53 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.polaris.router.spi; + +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.polaris.api.pojo.DefaultInstance; +import com.tencent.polaris.api.pojo.Instance; + +import org.springframework.cloud.client.ServiceInstance; + +/** + * InstanceTransformer. + * + * @author sean yu + */ +public interface InstanceTransformer { + + default Instance transform(ServiceInstance serviceInstance) { + DefaultInstance instance = new DefaultInstance(); + transformDefault(instance, serviceInstance); + transformCustom(instance, serviceInstance); + return instance; + } + + default void transformDefault(DefaultInstance instance, ServiceInstance serviceInstance) { + instance.setNamespace(MetadataContext.LOCAL_NAMESPACE); + instance.setService(serviceInstance.getServiceId()); + instance.setProtocol(serviceInstance.getScheme()); + instance.setId(serviceInstance.getInstanceId()); + instance.setHost(serviceInstance.getHost()); + instance.setPort(serviceInstance.getPort()); + instance.setMetadata(serviceInstance.getMetadata()); + } + + void transformCustom(DefaultInstance instance, ServiceInstance serviceInstance); + +} diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformer.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformer.java new file mode 100644 index 00000000..18309036 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformer.java @@ -0,0 +1,45 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.polaris.router.transformer; + +import com.tencent.cloud.common.pojo.PolarisServiceInstance; +import com.tencent.cloud.polaris.router.spi.InstanceTransformer; +import com.tencent.polaris.api.pojo.DefaultInstance; + +import org.springframework.cloud.client.ServiceInstance; + +/** + * PolarisInstanceTransformer. + * + * @author sean yu + */ +public class PolarisInstanceTransformer implements InstanceTransformer { + + @Override + public void transformCustom(DefaultInstance instance, ServiceInstance serviceInstance) { + if (serviceInstance instanceof PolarisServiceInstance) { + PolarisServiceInstance polarisServiceInstance = (PolarisServiceInstance) serviceInstance; + instance.setRegion(polarisServiceInstance.getPolarisInstance().getRegion()); + instance.setZone(polarisServiceInstance.getPolarisInstance().getZone()); + instance.setCampus(polarisServiceInstance.getPolarisInstance().getCampus()); + instance.setWeight(polarisServiceInstance.getPolarisInstance().getWeight()); + } + } + +} diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplierTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplierTest.java index 84d2a738..6ac5238a 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplierTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplierTest.java @@ -41,6 +41,7 @@ import com.tencent.cloud.polaris.router.interceptor.RuleBasedRouterRequestInterc import com.tencent.cloud.polaris.router.resttemplate.PolarisLoadBalancerRequest; import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor; import com.tencent.cloud.polaris.router.spi.RouterResponseInterceptor; +import com.tencent.cloud.polaris.router.transformer.PolarisInstanceTransformer; import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.api.pojo.DefaultInstance; import com.tencent.polaris.api.pojo.DefaultServiceInstances; @@ -120,7 +121,7 @@ public class PolarisRouterServiceInstanceListSupplierTest { setTransitiveMetadata(); PolarisRouterServiceInstanceListSupplier polarisSupplier = new PolarisRouterServiceInstanceListSupplier( - delegate, routerAPI, requestInterceptors, null); + delegate, routerAPI, requestInterceptors, null, new PolarisInstanceTransformer()); ServiceInstances serviceInstances = assembleServiceInstances(); PolarisRouterContext routerContext = assembleRouterContext(); @@ -157,7 +158,7 @@ public class PolarisRouterServiceInstanceListSupplierTest { setTransitiveMetadata(); PolarisRouterServiceInstanceListSupplier polarisSupplier = new PolarisRouterServiceInstanceListSupplier( - delegate, routerAPI, requestInterceptors, null); + delegate, routerAPI, requestInterceptors, null, new PolarisInstanceTransformer()); ServiceInstances serviceInstances = assembleServiceInstances(); PolarisRouterContext routerContext = assembleRouterContext(); @@ -195,7 +196,7 @@ public class PolarisRouterServiceInstanceListSupplierTest { setTransitiveMetadata(); PolarisRouterServiceInstanceListSupplier polarisSupplier = new PolarisRouterServiceInstanceListSupplier( - delegate, routerAPI, requestInterceptors, null); + delegate, routerAPI, requestInterceptors, null, new PolarisInstanceTransformer()); ServiceInstances serviceInstances = assembleServiceInstances(); PolarisRouterContext routerContext = assembleRouterContext(); @@ -222,7 +223,7 @@ public class PolarisRouterServiceInstanceListSupplierTest { setTransitiveMetadata(); PolarisRouterServiceInstanceListSupplier polarisSupplier = new PolarisRouterServiceInstanceListSupplier( - delegate, routerAPI, requestInterceptors, Collections.singletonList(new TestRouterResponseInterceptor())); + delegate, routerAPI, requestInterceptors, Collections.singletonList(new TestRouterResponseInterceptor()), new PolarisInstanceTransformer()); ProcessRoutersResponse assembleResponse = assembleProcessRoutersResponse(); when(routerAPI.processRouters(any())).thenReturn(assembleResponse); @@ -237,7 +238,7 @@ public class PolarisRouterServiceInstanceListSupplierTest { @Test public void buildRouterContext() { PolarisRouterServiceInstanceListSupplier polarisSupplier = new PolarisRouterServiceInstanceListSupplier( - delegate, routerAPI, requestInterceptors, null); + delegate, routerAPI, requestInterceptors, null, new PolarisInstanceTransformer()); HttpHeaders headers = new HttpHeaders(); PolarisRouterContext context = polarisSupplier.buildRouterContext(headers); @@ -259,7 +260,7 @@ public class PolarisRouterServiceInstanceListSupplierTest { @Test public void testGet01() { PolarisRouterServiceInstanceListSupplier polarisSupplier = new PolarisRouterServiceInstanceListSupplier( - delegate, routerAPI, requestInterceptors, null); + delegate, routerAPI, requestInterceptors, null, new PolarisInstanceTransformer()); assertThatThrownBy(() -> polarisSupplier.get()).isInstanceOf(PolarisException.class); } @@ -270,7 +271,7 @@ public class PolarisRouterServiceInstanceListSupplierTest { .thenReturn(testCallerService); PolarisRouterServiceInstanceListSupplier polarisSupplier = new PolarisRouterServiceInstanceListSupplier( - delegate, routerAPI, requestInterceptors, null); + delegate, routerAPI, requestInterceptors, null, new PolarisInstanceTransformer()); MockServerHttpRequest httpRequest = MockServerHttpRequest.get("/" + testCalleeService + "/users") .header("k1", "v1") @@ -294,7 +295,7 @@ public class PolarisRouterServiceInstanceListSupplierTest { .thenReturn(new ProcessRoutersResponse(new DefaultServiceInstances(null, new ArrayList<>()))); PolarisRouterServiceInstanceListSupplier polarisSupplier = new PolarisRouterServiceInstanceListSupplier( - delegate, routerAPI, requestInterceptors, null); + delegate, routerAPI, requestInterceptors, null, new PolarisInstanceTransformer()); MockServerHttpRequest httpRequest = MockServerHttpRequest.get("/" + testCalleeService + "/users") .header("k1", "v1") diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/RouterUtilsTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/RouterUtilsTest.java index 42fe721f..724c401e 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/RouterUtilsTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/RouterUtilsTest.java @@ -24,6 +24,7 @@ import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.pojo.PolarisServiceInstance; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; +import com.tencent.cloud.polaris.router.transformer.PolarisInstanceTransformer; import com.tencent.polaris.api.pojo.DefaultInstance; import com.tencent.polaris.api.pojo.Instance; import com.tencent.polaris.api.pojo.ServiceInstances; @@ -52,7 +53,7 @@ public class RouterUtilsTest { @Test public void testTransferEmptyInstances() { - ServiceInstances serviceInstances = RouterUtils.transferServersToServiceInstances(Flux.empty()); + ServiceInstances serviceInstances = RouterUtils.transferServersToServiceInstances(Flux.empty(), new PolarisInstanceTransformer()); assertThat(serviceInstances.getInstances()).isNotNull(); assertThat(serviceInstances.getInstances()).isEmpty(); } @@ -82,7 +83,7 @@ public class RouterUtilsTest { instances.add(new PolarisServiceInstance(instance)); } - ServiceInstances serviceInstances = RouterUtils.transferServersToServiceInstances(Flux.just(instances)); + ServiceInstances serviceInstances = RouterUtils.transferServersToServiceInstances(Flux.just(instances), new PolarisInstanceTransformer()); assertThat(serviceInstances.getInstances()).isNotNull(); assertThat(serviceInstances.getInstances().size()).isEqualTo(instanceSize); diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfigurationTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfigurationTest.java index c773bc7c..3f35570c 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfigurationTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfigurationTest.java @@ -20,6 +20,7 @@ package com.tencent.cloud.polaris.router.config; import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration; import com.tencent.cloud.polaris.router.PolarisRouterServiceInstanceListSupplier; +import com.tencent.cloud.polaris.router.transformer.PolarisInstanceTransformer; import com.tencent.polaris.router.api.core.RouterAPI; import org.junit.jupiter.api.Test; @@ -59,6 +60,7 @@ public class LoadBalancerConfigurationTest { PolarisContextAutoConfiguration.class)) .withBean(SimpleReactiveDiscoveryProperties.class) .withBean(SimpleReactiveDiscoveryClient.class) + .withBean(PolarisInstanceTransformer.class) .run(context -> { assertThat(context).hasSingleBean(LoadBalancerConfiguration.PolarisReactiveSupportConfiguration.class); assertThat(context).hasSingleBean(RouterAPI.class); @@ -75,6 +77,7 @@ public class LoadBalancerConfigurationTest { )) .withBean(SimpleDiscoveryProperties.class) .withBean(SimpleDiscoveryClient.class) + .withBean(PolarisInstanceTransformer.class) .run(context -> { assertThat(context).hasSingleBean(LoadBalancerConfiguration.PolarisBlockingSupportConfiguration.class); assertThat(context).hasSingleBean(DiscoveryClient.class); diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformerTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformerTest.java new file mode 100644 index 00000000..b723d46b --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformerTest.java @@ -0,0 +1,60 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.polaris.router.transformer; + +import com.tencent.cloud.common.pojo.PolarisServiceInstance; +import com.tencent.cloud.common.util.ApplicationContextAwareUtils; +import com.tencent.polaris.api.pojo.DefaultInstance; +import com.tencent.polaris.api.pojo.Instance; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * PolarisInstanceTransformerTest. + * + * @author sean yu + */ +public class PolarisInstanceTransformerTest { + + private static MockedStatic mockedApplicationContextAwareUtils; + + @BeforeAll + public static void beforeAll() { + mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class); + mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties("spring.cloud.polaris.namespace")) + .thenReturn("default"); + mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties("spring.cloud.polaris.service")) + .thenReturn("test"); + } + + + @Test + public void test() { + PolarisInstanceTransformer polarisInstanceTransformer = new PolarisInstanceTransformer(); + DefaultInstance instance = new DefaultInstance(); + instance.setZone("zone"); + PolarisServiceInstance polarisServiceInstance = new PolarisServiceInstance(instance); + Instance instance1 = polarisInstanceTransformer.transform(polarisServiceInstance); + assertThat(instance1.getZone()).isEqualTo("zone"); + } +} diff --git a/spring-cloud-tencent-coverage/pom.xml b/spring-cloud-tencent-coverage/pom.xml index 7a566190..433df7c7 100644 --- a/spring-cloud-tencent-coverage/pom.xml +++ b/spring-cloud-tencent-coverage/pom.xml @@ -64,6 +64,12 @@ spring-cloud-starter-tencent-polaris-config + + com.tencent.cloud + spring-cloud-starter-tencent-discovery-adapter-plugin + ${revision} + + com.tencent.cloud spring-cloud-tencent-featureenv-plugin diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 0d8defea..c643989c 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -70,10 +70,10 @@ - 1.11.0-2022.0.1-SNAPSHOT + 1.10.3-2022.0.1 - 1.11.3-SNAPSHOT + 1.11.3 31.1-jre 4.9.0 1.12.19 @@ -157,6 +157,12 @@ + + com.tencent.cloud + spring-cloud-starter-tencent-discovery-adapter-plugin + ${revision} + + com.tencent.cloud spring-cloud-tencent-featureenv-plugin @@ -228,6 +234,7 @@ ${system-stubs-jupiter.version} test + diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/pom.xml b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/pom.xml new file mode 100644 index 00000000..b649aa5e --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/pom.xml @@ -0,0 +1,61 @@ + + + + multiple-discovery-nacos-example + com.tencent.cloud + ${revision} + ../pom.xml + + 4.0.0 + + nacos-callee-service-a + + + + org.springframework.boot + spring-boot-starter-web + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + 2022.0.0.0-RC1 + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.0 + + + attach-sources + + jar + + + + + + + \ No newline at end of file diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceA.java b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceA.java new file mode 100644 index 00000000..3e2152dd --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceA.java @@ -0,0 +1,34 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.multiple.discovery.nacos; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Circuit breaker example callee application. + * + * @author Haotian Zhang + */ +@SpringBootApplication +public class NacosCalleeServiceA { + + public static void main(String[] args) { + SpringApplication.run(NacosCalleeServiceA.class, args); + } +} diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceAController.java b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceAController.java new file mode 100644 index 00000000..f325e14e --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceAController.java @@ -0,0 +1,50 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.multiple.discovery.nacos; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Service B Controller. + * + * @author Haotian Zhang + */ +@RestController +@RequestMapping("/example/service/b") +public class NacosCalleeServiceAController { + + /** + * Get service information. + * + * @return service information + */ + @GetMapping("/info") + public String info() { + return "hello world ! I'm a service B1"; + } + + @GetMapping("/health") + public String health() { + System.out.println("health check: 200 instance"); + return "hello world ! I'm a service B1"; + } + +} diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..654ef41a --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-a/src/main/resources/bootstrap.yml @@ -0,0 +1,16 @@ +server: + port: 48082 +spring: + application: + name: NacosCalleeService + cloud: + polaris: + address: grpc://183.47.111.80:8091 + namespace: default + enabled: true + stat: + enabled: true + port: 28083 + nacos: + discovery: + server-addr: 127.0.0.1:8848 diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/pom.xml b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/pom.xml new file mode 100644 index 00000000..ec234e4f --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/pom.xml @@ -0,0 +1,62 @@ + + + + multiple-discovery-nacos-example + com.tencent.cloud + ${revision} + ../pom.xml + + 4.0.0 + + nacos-callee-service-b + + + + org.springframework.boot + spring-boot-starter-web + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + 2022.0.0.0-RC1 + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.0 + + + attach-sources + + jar + + + + + + + + \ No newline at end of file diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceB.java b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceB.java new file mode 100644 index 00000000..8e4aa86d --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceB.java @@ -0,0 +1,34 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.multiple.discovery.nacos; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Circuit breaker example callee application. + * + * @author Haotian Zhang + */ +@SpringBootApplication +public class NacosCalleeServiceB { + + public static void main(String[] args) { + SpringApplication.run(NacosCalleeServiceB.class, args); + } +} diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceBController.java b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceBController.java new file mode 100644 index 00000000..cae686fb --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCalleeServiceBController.java @@ -0,0 +1,54 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.multiple.discovery.nacos; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +/** + * Service B Controller. + * + * @author Haotian Zhang + */ +@RestController +@RequestMapping("/example/service/b") +public class NacosCalleeServiceBController { + + /** + * Get service information. + * + * @return service information + */ + @GetMapping("/info") + @ResponseStatus(code = HttpStatus.BAD_GATEWAY) + public String info() { + return "BAD_GATEWAY ! from service B2"; + } + + @GetMapping("/health") + @ResponseStatus(value = HttpStatus.BAD_GATEWAY, reason = "failed for call my service") + public String health() { + System.out.println("health check: 502 instance"); + return "hello world ! I'm a service B1"; + } + +} diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..76c1bc56 --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-callee-service-b/src/main/resources/bootstrap.yml @@ -0,0 +1,17 @@ +server: + port: 48081 +spring: + application: + name: NacosCalleeService + cloud: + polaris: + address: grpc://183.47.111.80:8091 + namespace: default + enabled: true + stat: + enabled: true + port: 28083 + nacos: + discovery: + server-addr: 127.0.0.1:8848 + diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/pom.xml b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/pom.xml new file mode 100644 index 00000000..72366e55 --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/pom.xml @@ -0,0 +1,86 @@ + + + + multiple-discovery-nacos-example + com.tencent.cloud + ${revision} + ../pom.xml + + 4.0.0 + + nacos-discovery-caller + + + + org.springframework.boot + spring-boot-starter-web + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + 2022.0.0.0-RC1 + + + + com.tencent.cloud + spring-cloud-starter-tencent-polaris-router + + + + com.tencent.cloud + spring-cloud-starter-tencent-discovery-adapter-plugin + + + + com.tencent.cloud + spring-cloud-starter-tencent-polaris-circuitbreaker + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.0 + + + attach-sources + + jar + + + + + + + \ No newline at end of file diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCallerService.java b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCallerService.java new file mode 100644 index 00000000..dabb5ac9 --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCallerService.java @@ -0,0 +1,36 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.multiple.discovery.nacos; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; + +/** + * Circuit breaker example callee application. + * + * @author Haotian Zhang + */ +@SpringBootApplication +@EnableFeignClients +public class NacosCallerService { + + public static void main(String[] args) { + SpringApplication.run(NacosCallerService.class, args); + } +} diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCallerServiceController.java b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCallerServiceController.java new file mode 100644 index 00000000..6224592c --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/java/com/tencent/cloud/multiple/discovery/nacos/NacosCallerServiceController.java @@ -0,0 +1,42 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.multiple.discovery.nacos; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * NacosCallerServiceController. + * + * @author sean yu + */ +@RestController +@RequestMapping("/example/service/a") +public class NacosCallerServiceController { + + @Autowired + private ProviderB polarisServiceB; + + @GetMapping("/getBServiceInfo") + public String getBServiceInfoFallbackFromCode() { + return polarisServiceB.info(); + } + +} diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/java/com/tencent/cloud/multiple/discovery/nacos/ProviderB.java b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/java/com/tencent/cloud/multiple/discovery/nacos/ProviderB.java new file mode 100644 index 00000000..fbd226bd --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/java/com/tencent/cloud/multiple/discovery/nacos/ProviderB.java @@ -0,0 +1,38 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.multiple.discovery.nacos; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * Circuit breaker example callee provider. + * + * @author sean yu + */ +@FeignClient(name = "NacosCalleeService") +public interface ProviderB { + + /** + * Get info of service B. + * + * @return info of service B + */ + @GetMapping("/example/service/b/info") + String info(); +} diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..3133ebf4 --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/resources/bootstrap.yml @@ -0,0 +1,26 @@ +server: + port: 48080 +spring: + application: + name: NacosCallerService + cloud: + polaris: + address: grpc://183.47.111.80:8091 + namespace: default + enabled: true + loadbalancer: + enabled: true + circuitbreaker: + enabled: true + nacos: + discovery: + server-addr: 127.0.0.1:8848 + +feign: + circuitbreaker: + enabled: true + +logging: + level: + root: info + com.tencent.cloud: debug \ No newline at end of file diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/pom.xml b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/pom.xml new file mode 100644 index 00000000..fea82d02 --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/pom.xml @@ -0,0 +1,21 @@ + + + + multiple-discovery-example + com.tencent.cloud + ${revision} + ../pom.xml + + 4.0.0 + + multiple-discovery-nacos-example + + pom + + nacos-callee-service-a + nacos-callee-service-b + nacos-discovery-caller + + \ No newline at end of file diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/pom.xml b/spring-cloud-tencent-examples/multiple-discovery-example/pom.xml new file mode 100644 index 00000000..7586bb6d --- /dev/null +++ b/spring-cloud-tencent-examples/multiple-discovery-example/pom.xml @@ -0,0 +1,20 @@ + + + + spring-cloud-tencent-examples + com.tencent.cloud + ${revision} + ../pom.xml + + 4.0.0 + + multiple-discovery-example + Spring Cloud Starter Tencent Multiple Discovery Example + pom + + + multiple-discovery-nacos-example + + \ No newline at end of file diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/resources/bootstrap.yml index 919c12df..4cc768ed 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/resources/bootstrap.yml @@ -15,16 +15,6 @@ spring: enabled: true circuitbreaker: enabled: true -# stat: -# enabled: true -# port: 28081 -# tencent: -# rpc-enhancement: -# enabled: true -# reporter: -# ignore-internal-server-error: true -# series: server_error -# statuses: gateway_timeout, bad_gateway, service_unavailable logging: level: diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/resources/bootstrap.yml index 16fa8bd3..720c3df8 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/resources/bootstrap.yml @@ -12,16 +12,6 @@ spring: enabled: true circuitbreaker: enabled: true -# stat: -# enabled: true -# port: 28081 -# tencent: -# rpc-enhancement: -# enabled: true -# reporter: -# ignore-internal-server-error: true -# series: server_error -# statuses: gateway_timeout, bad_gateway, service_unavailable logging: level: diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/resources/bootstrap.yml index f84dffde..7e75556f 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/resources/bootstrap.yml @@ -12,16 +12,6 @@ spring: enabled: true circuitbreaker: enabled: true -# stat: -# enabled: true -# port: 28081 -# tencent: -# rpc-enhancement: -# enabled: true -# reporter: -# ignore-internal-server-error: true -# series: server_error -# statuses: gateway_timeout, bad_gateway, service_unavailable logging: level: diff --git a/spring-cloud-tencent-examples/pom.xml b/spring-cloud-tencent-examples/pom.xml index 2a4eb0ae..269b55d3 100644 --- a/spring-cloud-tencent-examples/pom.xml +++ b/spring-cloud-tencent-examples/pom.xml @@ -16,6 +16,7 @@ Examples of Spring Cloud Tencent + multiple-discovery-example polaris-discovery-example polaris-ratelimit-example polaris-circuitbreaker-example diff --git a/spring-cloud-tencent-plugin-starters/pom.xml b/spring-cloud-tencent-plugin-starters/pom.xml index 6487f9a8..bc2f153b 100644 --- a/spring-cloud-tencent-plugin-starters/pom.xml +++ b/spring-cloud-tencent-plugin-starters/pom.xml @@ -17,6 +17,7 @@ spring-cloud-tencent-featureenv-plugin spring-cloud-tencent-gateway-plugin + spring-cloud-starter-tencent-discovery-adapter-plugin diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/pom.xml b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/pom.xml new file mode 100644 index 00000000..771bf0e5 --- /dev/null +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/pom.xml @@ -0,0 +1,42 @@ + + + + spring-cloud-tencent-plugin-starters + com.tencent.cloud + ${revision} + ../pom.xml + + 4.0.0 + + spring-cloud-starter-tencent-discovery-adapter-plugin + Spring Cloud Starter Tencent Discovery Adapter Plugin + + + + + com.tencent.cloud + spring-cloud-starter-tencent-polaris-router + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + 2022.0.0.0-RC1 + test + + + + org.mockito + mockito-inline + test + + + diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfiguration.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfiguration.java new file mode 100644 index 00000000..08aaf665 --- /dev/null +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfiguration.java @@ -0,0 +1,52 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.plugin.discovery.adapter.config; + +import com.tencent.cloud.plugin.discovery.adapter.transformer.NacosInstanceTransformer; +import com.tencent.cloud.polaris.router.config.ConditionalOnPolarisRouterEnabled; +import com.tencent.cloud.polaris.router.config.LoadBalancerConfiguration; +import com.tencent.cloud.polaris.router.spi.InstanceTransformer; + +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * NacosDiscoveryAdapterAutoConfiguration. + * + * @author sean yu + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnDiscoveryEnabled +@AutoConfigureBefore(LoadBalancerConfiguration.class) +public class NacosDiscoveryAdapterAutoConfiguration { + + + @Bean + @ConditionalOnMissingBean + @ConditionalOnPolarisRouterEnabled + @ConditionalOnClass(name = "com.alibaba.cloud.nacos.NacosServiceInstance") + public InstanceTransformer instanceTransformer() { + return new NacosInstanceTransformer(); + } + +} diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/transformer/NacosInstanceTransformer.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/transformer/NacosInstanceTransformer.java new file mode 100644 index 00000000..498040c0 --- /dev/null +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/transformer/NacosInstanceTransformer.java @@ -0,0 +1,50 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.plugin.discovery.adapter.transformer; + +import com.tencent.cloud.polaris.router.spi.InstanceTransformer; +import com.tencent.polaris.api.pojo.DefaultInstance; +import org.apache.commons.lang.StringUtils; + +import org.springframework.cloud.client.ServiceInstance; + +/** + * NacosInstanceTransformer. + * + * @author sean yu + */ +public class NacosInstanceTransformer implements InstanceTransformer { + + @Override + public void transformCustom(DefaultInstance instance, ServiceInstance serviceInstance) { + if ("com.alibaba.cloud.nacos.NacosServiceInstance".equals(serviceInstance.getClass().getName())) { + String nacosWeight = serviceInstance.getMetadata().get("nacos.weight"); + instance.setWeight( + StringUtils.isBlank(nacosWeight) ? 100 : (int) Double.parseDouble(nacosWeight) * 100 + ); + String nacosHealthy = serviceInstance.getMetadata().get("nacos.healthy"); + instance.setHealthy( + !StringUtils.isBlank(nacosHealthy) && Boolean.parseBoolean(nacosHealthy) + ); + String nacosInstanceId = serviceInstance.getMetadata().get("nacos.instanceId"); + instance.setId(nacosInstanceId); + } + } + +} diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..bf7d0f1c --- /dev/null +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.tencent.cloud.plugin.discovery.adapter.config.NacosDiscoveryAdapterAutoConfiguration \ No newline at end of file diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/test/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfigurationTest.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/test/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfigurationTest.java new file mode 100644 index 00000000..cae2a60f --- /dev/null +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/test/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfigurationTest.java @@ -0,0 +1,51 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.plugin.discovery.adapter.config; + +import com.tencent.cloud.plugin.discovery.adapter.transformer.NacosInstanceTransformer; +import com.tencent.cloud.polaris.router.transformer.PolarisInstanceTransformer; +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * NacosDiscoveryAdapterAutoConfigurationTest. + * + * @author sean yu + */ +public class NacosDiscoveryAdapterAutoConfigurationTest { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of( + NacosDiscoveryAdapterAutoConfiguration.class, + LoadBalancerAutoConfiguration.class + )); + + @Test + public void testDefaultInitialization() { + this.contextRunner.run(context -> { + assertThat(context).hasSingleBean(NacosInstanceTransformer.class); + assertThat(context).doesNotHaveBean(PolarisInstanceTransformer.class); + }); + } +} diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/test/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosInstanceTransformerTest.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/test/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosInstanceTransformerTest.java new file mode 100644 index 00000000..dbb41f34 --- /dev/null +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/test/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosInstanceTransformerTest.java @@ -0,0 +1,66 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.plugin.discovery.adapter.config; + +import java.util.HashMap; + +import com.alibaba.cloud.nacos.NacosServiceInstance; +import com.tencent.cloud.common.util.ApplicationContextAwareUtils; +import com.tencent.cloud.plugin.discovery.adapter.transformer.NacosInstanceTransformer; +import com.tencent.polaris.api.pojo.Instance; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * NacosInstanceTransformerTest. + * + * @author sean yu + */ +public class NacosInstanceTransformerTest { + + private static MockedStatic mockedApplicationContextAwareUtils; + + @BeforeAll + public static void beforeAll() { + mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class); + mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties("spring.cloud.polaris.namespace")) + .thenReturn("default"); + mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties("spring.cloud.polaris.service")) + .thenReturn("test"); + } + + + @Test + public void test() { + NacosInstanceTransformer nacosInstanceTransformer = new NacosInstanceTransformer(); + NacosServiceInstance nacosServiceInstance = new NacosServiceInstance(); + nacosServiceInstance.setMetadata(new HashMap() {{ + put("nacos.weight", "0.01"); + put("nacos.healthy", "true"); + put("nacos.instanceId", "xxx"); + }}); + Instance instance = nacosInstanceTransformer.transform(nacosServiceInstance); + assertThat(instance.isHealthy()).isEqualTo(true); + } + +} diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/ReporterUtils.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/ReporterUtils.java index d56ecf32..c7e97404 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/ReporterUtils.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/ReporterUtils.java @@ -72,6 +72,11 @@ public final class ReporterUtils { resultRequest.setRetCode(response.status()); resultRequest.setRetStatus(retStatus); resultRequest.setDelay(delay); + String scheme = uri.getScheme(); + if (StringUtils.isBlank(scheme)) { + scheme = "http"; + } + resultRequest.setProtocol(scheme); String sourceNamespace = MetadataContext.LOCAL_NAMESPACE; String sourceService = MetadataContext.LOCAL_SERVICE; if (StringUtils.isNotBlank(sourceNamespace) && StringUtils.isNotBlank(sourceService)) {