From 90a7beda268a6d03e852bdfd2250dddbecd2cf6d Mon Sep 17 00:00:00 2001 From: kennylong Date: Fri, 7 Apr 2023 16:22:09 +0800 Subject: [PATCH 1/2] feature: add config for customized local port (#956) --- CHANGELOG.md | 1 + .../polaris/registry/PolarisRegistration.java | 5 +++ ...larisServiceRegistryAutoConfiguration.java | 4 +- .../registry/PolarisRegistrationTest.java | 42 ++++++++++++------- .../PolarisContextAutoConfiguration.java | 3 +- .../config/PolarisContextProperties.java | 18 +++++++- 6 files changed, 56 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b014e5a4c..3e57251d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,3 +5,4 @@ - [feat:support webclient and gateway report call metrics](https://github.com/Tencent/spring-cloud-tencent/pull/942) - [docs:prevent the release of the final version of the sdk.](https://github.com/Tencent/spring-cloud-tencent/pull/945) - [fix: fix nacos CircuitBreaker disable bug.](https://github.com/Tencent/spring-cloud-tencent/pull/947) +- [feature: add config for customized local port.](https://github.com/Tencent/spring-cloud-tencent/pull/956) diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistration.java index 7a5fb4609..1c9d902f9 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistration.java @@ -25,6 +25,7 @@ import java.util.Objects; import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.polaris.PolarisDiscoveryProperties; +import com.tencent.cloud.polaris.context.config.PolarisContextProperties; import com.tencent.cloud.polaris.extend.consul.ConsulContextProperties; import com.tencent.cloud.polaris.extend.nacos.NacosContextProperties; import com.tencent.polaris.client.api.SDKContext; @@ -76,6 +77,7 @@ public class PolarisRegistration implements Registration { public PolarisRegistration( PolarisDiscoveryProperties polarisDiscoveryProperties, + @Nullable PolarisContextProperties polarisContextProperties, @Nullable ConsulContextProperties consulContextProperties, SDKContext context, StaticMetadataManager staticMetadataManager, @Nullable NacosContextProperties nacosContextProperties, @@ -89,6 +91,9 @@ public class PolarisRegistration implements Registration { this.servletWebServerApplicationContext = servletWebServerApplicationContext; this.reactiveWebServerApplicationContext = reactiveWebServerApplicationContext; host = polarisContext.getConfig().getGlobal().getAPI().getBindIP(); + if (polarisContextProperties != null) { + port = polarisContextProperties.getLocalPort(); + } } @Override diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java index a421ec307..be5d244f9 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java @@ -20,6 +20,7 @@ package com.tencent.cloud.polaris.registry; import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.polaris.PolarisDiscoveryProperties; +import com.tencent.cloud.polaris.context.config.PolarisContextProperties; import com.tencent.cloud.polaris.discovery.PolarisDiscoveryAutoConfiguration; import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler; import com.tencent.cloud.polaris.extend.consul.ConsulContextProperties; @@ -65,11 +66,12 @@ public class PolarisServiceRegistryAutoConfiguration { @ConditionalOnBean(AutoServiceRegistrationProperties.class) public PolarisRegistration polarisRegistration( PolarisDiscoveryProperties polarisDiscoveryProperties, + PolarisContextProperties polarisContextProperties, @Autowired(required = false) ConsulContextProperties consulContextProperties, SDKContext context, StaticMetadataManager staticMetadataManager, NacosContextProperties nacosContextProperties, @Autowired(required = false) ServletWebServerApplicationContext servletWebServerApplicationContext, @Autowired(required = false) ReactiveWebServerApplicationContext reactiveWebServerApplicationContext) { - return new PolarisRegistration(polarisDiscoveryProperties, consulContextProperties, context, + return new PolarisRegistration(polarisDiscoveryProperties, polarisContextProperties, consulContextProperties, context, staticMetadataManager, nacosContextProperties, servletWebServerApplicationContext, reactiveWebServerApplicationContext); } 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 ebcc5ea4b..742ce4052 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 @@ -22,6 +22,7 @@ import java.util.Map; import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.polaris.PolarisDiscoveryProperties; +import com.tencent.cloud.polaris.context.config.PolarisContextProperties; import com.tencent.cloud.polaris.extend.consul.ConsulContextProperties; import com.tencent.cloud.polaris.extend.nacos.NacosContextProperties; import com.tencent.polaris.api.config.Configuration; @@ -62,6 +63,10 @@ public class PolarisRegistrationTest { private PolarisRegistration polarisRegistration3; + private PolarisRegistration polarisRegistration4; + + private static int testLocalPort = 10086; + @BeforeEach void setUp() { // mock PolarisDiscoveryProperties @@ -70,23 +75,27 @@ public class PolarisRegistrationTest { doReturn("http").when(polarisDiscoveryProperties).getProtocol(); doReturn(true).when(polarisDiscoveryProperties).isRegisterEnabled(); + // mock PolarisContextProperties + PolarisContextProperties polarisContextProperties = mock(PolarisContextProperties.class); + doReturn(testLocalPort).when(polarisContextProperties).getLocalPort(); + // mock ConsulContextProperties ConsulContextProperties consulContextProperties = mock(ConsulContextProperties.class); doReturn(true).when(consulContextProperties).isEnabled(); doReturn(true).when(consulContextProperties).isRegister(); // mock NacosContextProperties - 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 NacosContextProperties + nacosContextProperties = mock(NacosContextProperties.class); + doReturn(true).when(nacosContextProperties).isEnabled(); + doReturn(true).when(nacosContextProperties).isRegisterEnabled(); + doReturn("/").when(nacosContextProperties).getContextPath(); + doReturn("cluster").when(nacosContextProperties).getClusterName(); + doReturn("").when(nacosContextProperties).getGroup(); + doReturn(true).when(nacosContextProperties).isDiscoveryEnabled(); + doReturn("").when(nacosContextProperties).getPassword(); + doReturn("").when(nacosContextProperties).getUsername(); + doReturn("").when(nacosContextProperties).getServerAddr(); // mock SDKContext APIConfig apiConfig = mock(APIConfig.class); @@ -114,15 +123,19 @@ public class PolarisRegistrationTest { ReactiveWebServerApplicationContext reactiveWebServerApplicationContext = mock(ReactiveWebServerApplicationContext.class); doReturn(reactiveWebServer).when(reactiveWebServerApplicationContext).getWebServer(); - polarisRegistration1 = new PolarisRegistration(polarisDiscoveryProperties, consulContextProperties, + polarisRegistration1 = new PolarisRegistration(polarisDiscoveryProperties, null, consulContextProperties, polarisContext, staticMetadataManager, nacosContextProperties, servletWebServerApplicationContext, null); - polarisRegistration2 = new PolarisRegistration(polarisDiscoveryProperties, consulContextProperties, + polarisRegistration2 = new PolarisRegistration(polarisDiscoveryProperties, null, consulContextProperties, polarisContext, staticMetadataManager, nacosContextProperties, null, reactiveWebServerApplicationContext); - polarisRegistration3 = new PolarisRegistration(polarisDiscoveryProperties, consulContextProperties, + polarisRegistration3 = new PolarisRegistration(polarisDiscoveryProperties, null, consulContextProperties, + polarisContext, staticMetadataManager, nacosContextProperties, + null, null); + + polarisRegistration4 = new PolarisRegistration(polarisDiscoveryProperties, polarisContextProperties, consulContextProperties, polarisContext, staticMetadataManager, nacosContextProperties, null, null); } @@ -147,6 +160,7 @@ public class PolarisRegistrationTest { catch (RuntimeException e) { assertThat(e.getMessage()).isEqualTo("Unsupported web type."); } + assertThat(polarisRegistration4.getPort()).isEqualTo(testLocalPort); } @Test diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java index d51cf35a4..298d89fa4 100644 --- a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java @@ -52,7 +52,8 @@ public class PolarisContextAutoConfiguration { @ConditionalOnMissingBean public SDKContext polarisContext(PolarisContextProperties properties, Environment environment, List modifierList) throws PolarisException { return SDKContext.initContextByConfig(properties.configuration(modifierList, - () -> environment.getProperty("spring.cloud.client.ip-address"))); + () -> environment.getProperty("spring.cloud.client.ip-address"), + () -> environment.getProperty("spring.cloud.polaris.local-port", Integer.class, 0))); } @Bean diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextProperties.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextProperties.java index 696218a28..f77eaa4f5 100644 --- a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextProperties.java +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextProperties.java @@ -52,6 +52,11 @@ public class PolarisContextProperties { */ private String localIpAddress; + /** + * current server local port. + */ + private Integer localPort; + /** * If polaris enabled. */ @@ -67,7 +72,7 @@ public class PolarisContextProperties { */ private String service; - public Configuration configuration(List modifierList, Supplier ipAddressSupplier) { + public Configuration configuration(List modifierList, Supplier ipAddressSupplier, Supplier portSupplier) { // 1. Read user-defined polaris.yml configuration ConfigurationImpl configuration = (ConfigurationImpl) ConfigAPIFactory .defaultConfig(ConfigProvider.DEFAULT_CONFIG); @@ -78,6 +83,9 @@ public class PolarisContextProperties { defaultHost = ipAddressSupplier.get(); this.localIpAddress = defaultHost; } + if (this.localPort == null || this.localPort <= 0) { + this.localPort = portSupplier.get(); + } configuration.getGlobal().getAPI().setBindIP(defaultHost); @@ -110,6 +118,14 @@ public class PolarisContextProperties { this.localIpAddress = localIpAddress; } + public Integer getLocalPort() { + return localPort; + } + + public void setLocalPort(Integer localPort) { + this.localPort = localPort; + } + public Boolean getEnabled() { return enabled; } From df61753f7668933485d25790d72ffd70a931c8c7 Mon Sep 17 00:00:00 2001 From: Haotian Zhang <928016560@qq.com> Date: Sun, 9 Apr 2023 09:22:21 +0800 Subject: [PATCH 2/2] refactor:refactor reactor code in router module. (#958) --- CHANGELOG.md | 1 + ...olarisLoadBalancerClientConfiguration.java | 2 ++ .../cloud/polaris/router/RouterUtils.java | 36 ++++++------------- ...itional-spring-configuration-metadata.json | 8 ++++- 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e57251d0..1ae35736a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,3 +6,4 @@ - [docs:prevent the release of the final version of the sdk.](https://github.com/Tencent/spring-cloud-tencent/pull/945) - [fix: fix nacos CircuitBreaker disable bug.](https://github.com/Tencent/spring-cloud-tencent/pull/947) - [feature: add config for customized local port.](https://github.com/Tencent/spring-cloud-tencent/pull/956) +- [refactor:refactor reactor code in router module.](https://github.com/Tencent/spring-cloud-tencent/pull/958) diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java index cce8b0a9f..da5377b63 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java @@ -25,6 +25,7 @@ import com.tencent.polaris.factory.api.DiscoveryAPIFactory; 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.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.ConditionalOnBlockingDiscoveryEnabled; @@ -72,6 +73,7 @@ public class PolarisLoadBalancerClientConfiguration { @Bean @ConditionalOnMissingBean + @ConditionalOnClass(name = "org.springframework.web.reactive.function.client.ClientRequest") public LoadBalancerClientRequestTransformer polarisLoadBalancerClientRequestTransformer(SDKContext sdkContext) { ConsumerAPI consumerAPI = DiscoveryAPIFactory.createConsumerAPIByContext(sdkContext); return new PolarisLoadBalancerClientRequestTransformer(consumerAPI); 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 e2947a317..1dfe01fc9 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 @@ -17,11 +17,10 @@ package com.tencent.cloud.polaris.router; +import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; import java.util.stream.Collectors; import com.tencent.cloud.common.metadata.MetadataContext; @@ -30,6 +29,7 @@ import com.tencent.polaris.api.pojo.DefaultServiceInstances; import com.tencent.polaris.api.pojo.Instance; import com.tencent.polaris.api.pojo.ServiceInstances; import com.tencent.polaris.api.pojo.ServiceKey; +import org.reactivestreams.Publisher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; @@ -57,33 +57,19 @@ public final class RouterUtils { * @return ServiceInstances */ 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(instanceTransformer::transform) - .collect(Collectors.toList())); - - latch.countDown(); - }); - - try { - latch.await(WAIT_TIME, TimeUnit.SECONDS); - } - catch (InterruptedException e) { - LOGGER.error("Wait get instance result error. ", e); - } + List instanceList = Collections.synchronizedList(new ArrayList<>()); + servers.flatMap((Function, Publisher>) serviceInstances -> + Flux.fromIterable(serviceInstances.stream() + .map(instanceTransformer::transform) + .collect(Collectors.toList()))).subscribe(instance -> instanceList.add((Instance) instance)); String serviceName = ""; - if (!CollectionUtils.isEmpty(instancesRef.get())) { - serviceName = instancesRef.get().get(0).getService(); + if (!CollectionUtils.isEmpty(instanceList)) { + serviceName = instanceList.get(0).getService(); } ServiceKey serviceKey = new ServiceKey(MetadataContext.LOCAL_NAMESPACE, serviceName); - List instances = instancesRef.get() == null ? Collections.emptyList() : instancesRef.get(); - return new DefaultServiceInstances(serviceKey, instances); + return new DefaultServiceInstances(serviceKey, instanceList); } } diff --git a/spring-cloud-tencent-polaris-context/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-tencent-polaris-context/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 7bb1d6596..5c0ddb2da 100644 --- a/spring-cloud-tencent-polaris-context/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-tencent-polaris-context/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -38,7 +38,13 @@ "name": "spring.cloud.polaris.local-ip-address", "type": "java.lang.String", "defaultValue": "", - "description": "current server local ip address." + "description": "current server local ip address to be registered." + }, + { + "name": "spring.cloud.polaris.local-port", + "type": "java.lang.Integer", + "defaultValue": "", + "description": "current server local port to be registered." } ], "hints": []