diff --git a/CHANGELOG.md b/CHANGELOG.md index 69e61a60de..01c3ee905c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,3 +8,4 @@ - [feat:support ipv6.](https://github.com/Tencent/spring-cloud-tencent/pull/1598) - [feat:support config all recover enabled.](https://github.com/Tencent/spring-cloud-tencent/pull/1604) - [feat:support stat reporting path aggregation.](https://github.com/Tencent/spring-cloud-tencent/pull/1608) +- [feat:support namespace exports configuration if not created.](https://github.com/Tencent/spring-cloud-tencent/pull/1613) diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisDiscoveryProperties.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisDiscoveryProperties.java index f0f0ce5974..fead815b3f 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisDiscoveryProperties.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisDiscoveryProperties.java @@ -122,6 +122,11 @@ public class PolarisDiscoveryProperties { */ private Boolean allRecoverEnabled = true; + /** + * namespace exports if not created. + */ + private String namespaceExports; + public String getInstanceId() { return instanceId; } @@ -265,6 +270,14 @@ public void setRegisterEnabled(Boolean registerEnabled) { this.registerEnabled = registerEnabled; } + public String getNamespaceExports() { + return namespaceExports; + } + + public void setNamespaceExports(String namespaceExports) { + this.namespaceExports = namespaceExports; + } + @Override public String toString() { return "PolarisDiscoveryProperties{" + @@ -284,6 +297,7 @@ public String toString() { ", zeroProtectionNeedTestConnectivity=" + zeroProtectionNeedTestConnectivity + ", preferIpv6=" + preferIpv6 + ", allRecoverEnabled=" + allRecoverEnabled + + ", namespaceExports='" + namespaceExports + '\'' + '}'; } } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/NamespaceRegistrationCustomizer.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/NamespaceRegistrationCustomizer.java new file mode 100644 index 0000000000..834c1637f5 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/NamespaceRegistrationCustomizer.java @@ -0,0 +1,43 @@ +/* + * Tencent is pleased to support the open source community by making spring-cloud-tencent available. + * + * Copyright (C) 2021 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.registry; + +import com.tencent.cloud.polaris.PolarisDiscoveryProperties; +import com.tencent.polaris.api.utils.StringUtils; + +/** + * 服务注册时端口相关逻辑. + * + * @author Haotian Zhang + */ +public class NamespaceRegistrationCustomizer implements PolarisRegistrationCustomizer { + + private final PolarisDiscoveryProperties polarisDiscoveryProperties; + + public NamespaceRegistrationCustomizer(PolarisDiscoveryProperties polarisDiscoveryProperties) { + this.polarisDiscoveryProperties = polarisDiscoveryProperties; + } + + @Override + public void customize(PolarisRegistration registration) { + String namespaceExports = polarisDiscoveryProperties.getNamespaceExports(); + if (StringUtils.isNotBlank(namespaceExports)) { + registration.getMetadata().put("POLARIS_INTERNAL_NAMESPACE_EXPORTS", namespaceExports); + } + } +} 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 4a4be95386..624811ca08 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 @@ -95,4 +95,9 @@ public PolarisAutoServiceRegistration polarisAutoServiceRegistration( public PolarisWebApplicationCheck polarisWebApplicationCheck() { return new PolarisWebApplicationCheck(); } + + @Bean + public NamespaceRegistrationCustomizer namespaceRegistrationCustomizer(PolarisDiscoveryProperties polarisDiscoveryProperties) { + return new NamespaceRegistrationCustomizer(polarisDiscoveryProperties); + } } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-starter-tencent-polaris-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json index aa4fe5f874..16bf023ece 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -90,6 +90,11 @@ "defaultValue": true, "description": "is all recover enable. Default: true." }, + { + "name": "spring.cloud.polaris.discovery.namespace-exports", + "type": "java.lang.String", + "description": "namespace exports if not created." + }, { "name": "spring.cloud.polaris.discovery.eager-load.enabled", "type": "java.lang.Boolean", diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/PolarisDiscoveryPropertiesTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/PolarisDiscoveryPropertiesTest.java index 7daee945fc..5aaae1d00e 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/PolarisDiscoveryPropertiesTest.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/PolarisDiscoveryPropertiesTest.java @@ -94,6 +94,9 @@ public void testGetAndSet() { polarisDiscoveryProperties.setAllRecoverEnabled(false); assertThat(polarisDiscoveryProperties.getAllRecoverEnabled()).isFalse(); + polarisDiscoveryProperties.setNamespaceExports("*"); + assertThat(polarisDiscoveryProperties.getNamespaceExports()).isEqualTo("*"); + assertThat(polarisDiscoveryProperties.toString()) .isEqualTo("PolarisDiscoveryProperties{" + "namespace='Test'" @@ -110,6 +113,7 @@ public void testGetAndSet() { + ", zeroProtectionEnabled=false" + ", zeroProtectionNeedTestConnectivity=false" + ", preferIpv6=true" - + ", allRecoverEnabled=false}"); + + ", allRecoverEnabled=false" + + ", namespaceExports='*'}"); } } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationCustomizerTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationCustomizerTest.java index c51014e1eb..be8524a262 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationCustomizerTest.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationCustomizerTest.java @@ -62,7 +62,7 @@ public void testCustomize() { this.contextRunner.run(context -> { PolarisRegistration polarisRegistration = context.getBean(PolarisRegistration.class); polarisRegistration.customize(); - PolarisRegistrationCustomizer customizer = context.getBean(PolarisRegistrationCustomizer.class); + TestPolarisRegistrationCustomizer customizer = context.getBean(TestPolarisRegistrationCustomizer.class); verify(customizer, times(1)).customize(any(PolarisRegistration.class)); }); } @@ -71,8 +71,14 @@ public void testCustomize() { @EnableAutoConfiguration static class PolarisServiceRegistryAutoConfiguration { @Bean - public PolarisRegistrationCustomizer polarisRegistrationCustomizer() { - return mock(PolarisRegistrationCustomizer.class); + public TestPolarisRegistrationCustomizer testPolarisRegistrationCustomizer() { + return mock(TestPolarisRegistrationCustomizer.class); + } + } + + static class TestPolarisRegistrationCustomizer implements PolarisRegistrationCustomizer { + @Override + public void customize(PolarisRegistration polarisRegistration) { } } } diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/spi/impl/DefaultInstanceMetadataProvider.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/spi/impl/DefaultInstanceMetadataProvider.java index 5a4b1fe4b5..b5829c81ea 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/spi/impl/DefaultInstanceMetadataProvider.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/spi/impl/DefaultInstanceMetadataProvider.java @@ -25,6 +25,9 @@ import com.tencent.cloud.common.spi.InstanceMetadataProvider; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; +import com.tencent.cloud.common.util.inet.PolarisInetUtils; +import com.tencent.polaris.api.utils.StringUtils; +import com.tencent.polaris.metadata.core.constant.MetadataConstants; import static com.tencent.cloud.common.constant.MetadataConstant.DefaultMetadata.DEFAULT_METADATA_SOURCE_SERVICE_NAME; import static com.tencent.cloud.common.constant.MetadataConstant.DefaultMetadata.DEFAULT_METADATA_SOURCE_SERVICE_NAMESPACE; @@ -48,10 +51,20 @@ public DefaultInstanceMetadataProvider(ApplicationContextAwareUtils applicationC @Override public Map getMetadata() { - return new HashMap() {{ - put(DEFAULT_METADATA_SOURCE_SERVICE_NAMESPACE, LOCAL_NAMESPACE); - put(DEFAULT_METADATA_SOURCE_SERVICE_NAME, LOCAL_SERVICE); - }}; + HashMap defaultInstanceMetadata = new HashMap<>(); + defaultInstanceMetadata.put(DEFAULT_METADATA_SOURCE_SERVICE_NAMESPACE, LOCAL_NAMESPACE); + defaultInstanceMetadata.put(DEFAULT_METADATA_SOURCE_SERVICE_NAME, LOCAL_SERVICE); + + String ipv4Address = PolarisInetUtils.getIpString(false); + if (StringUtils.isNotBlank(ipv4Address)) { + defaultInstanceMetadata.put(MetadataConstants.ADDRESS_IPV4, ipv4Address); + } + String ipv6Address = PolarisInetUtils.getIpString(true); + if (StringUtils.isNotBlank(ipv6Address)) { + defaultInstanceMetadata.put(MetadataConstants.ADDRESS_IPV6, ipv6Address); + } + + return defaultInstanceMetadata; } @Override diff --git a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/StaticMetadataManagerTest.java b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/StaticMetadataManagerTest.java index b8ae720ba9..75c9694cdb 100644 --- a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/StaticMetadataManagerTest.java +++ b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/StaticMetadataManagerTest.java @@ -57,6 +57,7 @@ @ExtendWith({MockitoExtension.class, SystemStubsExtension.class}) public class StaticMetadataManagerTest { + private static MockedStatic mockedApplicationContextAwareUtils; /** * EnvironmentVariablesRule. */ @@ -65,8 +66,6 @@ public class StaticMetadataManagerTest { @Mock private MetadataLocalProperties metadataLocalProperties; - private static MockedStatic mockedApplicationContextAwareUtils; - @BeforeAll static void beforeAll() { mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class); @@ -137,7 +136,7 @@ public void testCustomSPIMetadata() { Arrays.asList(new MockedMetadataProvider(), new DefaultInstanceMetadataProvider(null))); Map metadata = metadataManager.getAllCustomMetadata(); - assertThat(metadata.size()).isEqualTo(5); + assertThat(metadata.size()).isEqualTo(6); assertThat(metadata.get("k1")).isEqualTo("v1"); assertThat(metadata.get("k2")).isEqualTo("v22"); assertThat(metadata.get("k3")).isEqualTo("v33"); @@ -182,7 +181,7 @@ public void testMergedMetadata() { Arrays.asList(new MockedMetadataProvider(), new DefaultInstanceMetadataProvider(null))); Map metadata = metadataManager.getMergedStaticMetadata(); - assertThat(metadata.size()).isEqualTo(8); + assertThat(metadata.size()).isEqualTo(9); assertThat(metadata.get("k1")).isEqualTo("v1"); assertThat(metadata.get("k2")).isEqualTo("v22"); assertThat(metadata.get("k3")).isEqualTo("v33"); diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextEnvironmentPostProcessor.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextEnvironmentPostProcessor.java index f5622a210f..63b7904ff2 100644 --- a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextEnvironmentPostProcessor.java +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextEnvironmentPostProcessor.java @@ -100,6 +100,12 @@ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringAp polarisEnvProperties.put("spring.cloud.tencent.metadata.content.zone", zone); } + // global namespace enabled + String globalNamespaceEnabled = environment.getProperty("global_namespace_enabled"); + if (StringUtils.isNotBlank(globalNamespaceEnabled) && StringUtils.equals("true", globalNamespaceEnabled)) { + polarisEnvProperties.put("spring.cloud.polaris.discovery.namespace-exports", "*"); + } + MapPropertySource propertySource = new MapPropertySource("polaris-env-properties", polarisEnvProperties); environment.getPropertySources().addFirst(propertySource); }