From f0a9d99746dfda8fdb7710983ba046568b812aa8 Mon Sep 17 00:00:00 2001 From: SkyeBeFreeman <928016560@qq.com> Date: Wed, 1 Jun 2022 16:04:10 +0800 Subject: [PATCH 1/4] fix:fix consul connect bug. --- CHANGELOG.md | 13 +-- changes/changes-1.5.0.md | 15 ++++ pom.xml | 2 +- .../consul/ConsulContextProperties.java | 16 ++++ .../consul/ConsulContextPropertiesTest.java | 80 +++++++++---------- .../src/test/resources/application-test.yml | 24 ++++++ spring-cloud-tencent-dependencies/pom.xml | 2 +- 7 files changed, 98 insertions(+), 54 deletions(-) create mode 100644 changes/changes-1.5.0.md create mode 100644 spring-cloud-starter-tencent-polaris-discovery/src/test/resources/application-test.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index e1f9edede..a582e3497 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,4 @@ # Change Log --- -- [Feature: Support parse ratelimit rule expression labels.](https://github.com/Tencent/spring-cloud-tencent/pull/183) -- [Feature: Router support request label.](https://github.com/Tencent/spring-cloud-tencent/pull/165) -- [Feature: Support router expression label](https://github.com/Tencent/spring-cloud-tencent/pull/190) -- [Add metadata transfer example.](https://github.com/Tencent/spring-cloud-tencent/pull/184) -- [Feature: Support metadata router.](https://github.com/Tencent/spring-cloud-tencent/pull/191) -- [Feature: Misc optimize metadata router.](https://github.com/Tencent/spring-cloud-tencent/pull/192) -- [Feature:Support near by router.](https://github.com/Tencent/spring-cloud-tencent/pull/196) -- [Feature: Load application.yml and application-${profile}.yml from polaris server.](https://github.com/Tencent/spring-cloud-tencent/pull/199) -- [feat:add rate limit of unirate.](https://github.com/Tencent/spring-cloud-tencent/pull/197) -- [test:add junit test to polaris-circuitbreaker.](https://github.com/Tencent/spring-cloud-tencent/pull/202) -- [test:add junit test to polaris-discovery.](https://github.com/Tencent/spring-cloud-tencent/pull/205) -- [Example:set example polaris address to demo environment.](https://github.com/Tencent/spring-cloud-tencent/pull/206) +- [fix:fix consul connect bug.](https://github.com/Tencent/spring-cloud-tencent/pull/217) diff --git a/changes/changes-1.5.0.md b/changes/changes-1.5.0.md new file mode 100644 index 000000000..e1f9edede --- /dev/null +++ b/changes/changes-1.5.0.md @@ -0,0 +1,15 @@ +# Change Log +--- + +- [Feature: Support parse ratelimit rule expression labels.](https://github.com/Tencent/spring-cloud-tencent/pull/183) +- [Feature: Router support request label.](https://github.com/Tencent/spring-cloud-tencent/pull/165) +- [Feature: Support router expression label](https://github.com/Tencent/spring-cloud-tencent/pull/190) +- [Add metadata transfer example.](https://github.com/Tencent/spring-cloud-tencent/pull/184) +- [Feature: Support metadata router.](https://github.com/Tencent/spring-cloud-tencent/pull/191) +- [Feature: Misc optimize metadata router.](https://github.com/Tencent/spring-cloud-tencent/pull/192) +- [Feature:Support near by router.](https://github.com/Tencent/spring-cloud-tencent/pull/196) +- [Feature: Load application.yml and application-${profile}.yml from polaris server.](https://github.com/Tencent/spring-cloud-tencent/pull/199) +- [feat:add rate limit of unirate.](https://github.com/Tencent/spring-cloud-tencent/pull/197) +- [test:add junit test to polaris-circuitbreaker.](https://github.com/Tencent/spring-cloud-tencent/pull/202) +- [test:add junit test to polaris-discovery.](https://github.com/Tencent/spring-cloud-tencent/pull/205) +- [Example:set example polaris address to demo environment.](https://github.com/Tencent/spring-cloud-tencent/pull/206) diff --git a/pom.xml b/pom.xml index 1fea09f43..a23de3dc1 100644 --- a/pom.xml +++ b/pom.xml @@ -86,7 +86,7 @@ - 1.5.0-Hoxton.SR9 + 1.5.1-Hoxton.SR9-SNAPSHOT Hoxton.SR9 diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/consul/ConsulContextProperties.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/consul/ConsulContextProperties.java index b24c72897..2efbd93d6 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/consul/ConsulContextProperties.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/consul/ConsulContextProperties.java @@ -73,6 +73,22 @@ public class ConsulContextProperties { @Value("${spring.cloud.consul.discovery.prefer-ip-address:#{'false'}}") private boolean preferIpAddress; + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + public boolean isEnabled() { return enabled; } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/extend/consul/ConsulContextPropertiesTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/extend/consul/ConsulContextPropertiesTest.java index ac4afe13a..9366eed7d 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/extend/consul/ConsulContextPropertiesTest.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/extend/consul/ConsulContextPropertiesTest.java @@ -20,16 +20,16 @@ package com.tencent.cloud.polaris.extend.consul; import java.util.List; import java.util.Map; -import com.tencent.cloud.polaris.DiscoveryPropertiesAutoConfiguration; -import com.tencent.cloud.polaris.context.PolarisContextAutoConfiguration; import com.tencent.polaris.client.api.SDKContext; import com.tencent.polaris.factory.config.global.ServerConnectorConfigImpl; import org.junit.Test; +import org.junit.runner.RunWith; -import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; import static com.tencent.polaris.plugins.connector.common.constant.ConsulConstant.MetadataMapKey.INSTANCE_ID_KEY; import static com.tencent.polaris.plugins.connector.common.constant.ConsulConstant.MetadataMapKey.IP_ADDRESS_KEY; @@ -44,47 +44,47 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Haotian Zhang */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConsulContextPropertiesTest.TestApplication.class) +@ActiveProfiles("test") public class ConsulContextPropertiesTest { + @Autowired + private ConsulContextProperties consulContextProperties; + + @Autowired + private SDKContext sdkContext; + + @Test + public void testDefaultInitialization() { + assertThat(consulContextProperties).isNotNull(); + assertThat(consulContextProperties.isEnabled()).isTrue(); + assertThat(consulContextProperties.getHost()).isEqualTo("127.0.0.1"); + assertThat(consulContextProperties.getPort()).isEqualTo(8500); + assertThat(consulContextProperties.isRegister()).isTrue(); + assertThat(consulContextProperties.isDiscoveryEnabled()).isTrue(); + } + @Test public void testModify() { - ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner().withConfiguration( - AutoConfigurations.of(PolarisContextAutoConfiguration.class, - ConsulContextPropertiesTest.TestConfiguration.class, - DiscoveryPropertiesAutoConfiguration.class)) - .withPropertyValues("spring.cloud.consul.discovery.register=true") - .withPropertyValues("spring.cloud.consul.discovery.enabled=true") - .withPropertyValues("spring.application.name=" + SERVICE_PROVIDER) - .withPropertyValues("spring.cloud.consul.discovery.instance-id=ins-test") - .withPropertyValues("spring.cloud.consul.discovery.prefer-ip-address=true") - .withPropertyValues("spring.cloud.consul.discovery.ip-address=" + HOST); - applicationContextRunner.run(context -> { - assertThat(context).hasSingleBean(SDKContext.class); - SDKContext sdkContext = context.getBean(SDKContext.class); - com.tencent.polaris.api.config.Configuration configuration = sdkContext.getConfig(); - List serverConnectorConfigs = configuration.getGlobal().getServerConnectors(); - Map metadata = null; - for (ServerConnectorConfigImpl serverConnectorConfig : serverConnectorConfigs) { - if (serverConnectorConfig.getId().equals("consul")) { - metadata = serverConnectorConfig.getMetadata(); - } + assertThat(sdkContext).isNotNull(); + com.tencent.polaris.api.config.Configuration configuration = sdkContext.getConfig(); + List serverConnectorConfigs = configuration.getGlobal().getServerConnectors(); + Map metadata = null; + for (ServerConnectorConfigImpl serverConnectorConfig : serverConnectorConfigs) { + if (serverConnectorConfig.getId().equals("consul")) { + metadata = serverConnectorConfig.getMetadata(); } - assertThat(metadata).isNotNull(); - assertThat(metadata.get(SERVICE_NAME_KEY)).isEqualTo(SERVICE_PROVIDER); - assertThat(metadata.get(INSTANCE_ID_KEY)).isEqualTo("ins-test"); - assertThat(metadata.get(PREFER_IP_ADDRESS_KEY)).isEqualTo("true"); - assertThat(metadata.get(IP_ADDRESS_KEY)).isEqualTo(HOST); - }); + } + assertThat(metadata).isNotNull(); + assertThat(metadata.get(SERVICE_NAME_KEY)).isEqualTo(SERVICE_PROVIDER); + assertThat(metadata.get(INSTANCE_ID_KEY)).isEqualTo("ins-test"); + assertThat(metadata.get(PREFER_IP_ADDRESS_KEY)).isEqualTo("true"); + assertThat(metadata.get(IP_ADDRESS_KEY)).isEqualTo(HOST); } - @Configuration - static class TestConfiguration { + @SpringBootApplication + protected static class TestApplication { - @Bean - public ConsulContextProperties consulContextProperties() { - ConsulContextProperties consulContextProperties = new ConsulContextProperties(); - consulContextProperties.setEnabled(true); - return consulContextProperties; - } } } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/resources/application-test.yml b/spring-cloud-starter-tencent-polaris-discovery/src/test/resources/application-test.yml new file mode 100644 index 000000000..8fbdbcc48 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/resources/application-test.yml @@ -0,0 +1,24 @@ +server: + port: 48084 +spring: + application: + name: java_provider_test + cloud: + polaris: + address: grpc://127.0.0.1:8091 + namespace: Test + enabled: true + discovery: + enabled: true + register: true + consul: + port: 8500 + host: 127.0.0.1 + enabled: true + discovery: + enabled: true + register: true + instance-id: ins-test + service-name: ${spring.application.name} + ip-address: 127.0.0.1 + prefer-ip-address: true diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 7da3cf8bc..24c8ef382 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -70,7 +70,7 @@ - 1.5.0-Hoxton.SR9 + 1.5.1-Hoxton.SR9-SNAPSHOT 1.6.0 4.5.1 1.12.10 From 5f25bc807ddc050383a768fc965a418f19dc12df Mon Sep 17 00:00:00 2001 From: SkyeBeFreeman <928016560@qq.com> Date: Wed, 1 Jun 2022 19:09:26 +0800 Subject: [PATCH 2/4] fix:fix PolarisRegistration cannot get metadata bug. --- .../polaris/registry/PolarisRegistration.java | 29 +++- .../registry/PolarisServiceRegistry.java | 14 +- ...larisServiceRegistryAutoConfiguration.java | 5 +- .../PolarisAutoServiceRegistrationTest.java | 144 ++++++++++++++++++ .../registry/PolarisRegistrationTest.java | 133 ++++++++++++++++ .../registry/PolarisServiceRegistryTest.java | 19 ++- 6 files changed, 321 insertions(+), 23 deletions(-) create mode 100644 spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisAutoServiceRegistrationTest.java create mode 100644 spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java 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 ed8baacc9..bf83ee293 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 @@ -19,9 +19,10 @@ package com.tencent.cloud.polaris.registry; import java.net.URI; -import java.util.Collections; +import java.util.HashMap; import java.util.Map; +import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.polaris.DiscoveryPropertiesAutoConfiguration; import com.tencent.cloud.polaris.PolarisDiscoveryProperties; import com.tencent.polaris.client.api.SDKContext; @@ -30,6 +31,7 @@ import org.apache.commons.lang.StringUtils; import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.util.CollectionUtils; /** * Registration object of Polaris. @@ -44,12 +46,17 @@ public class PolarisRegistration implements Registration, ServiceInstance { private final SDKContext polarisContext; + private final StaticMetadataManager staticMetadataManager; + + private Map metadata; + public PolarisRegistration( DiscoveryPropertiesAutoConfiguration discoveryPropertiesAutoConfiguration, - PolarisDiscoveryProperties polarisDiscoveryProperties, SDKContext context) { + PolarisDiscoveryProperties polarisDiscoveryProperties, SDKContext context, StaticMetadataManager staticMetadataManager) { this.discoveryPropertiesAutoConfiguration = discoveryPropertiesAutoConfiguration; this.polarisDiscoveryProperties = polarisDiscoveryProperties; this.polarisContext = context; + this.staticMetadataManager = staticMetadataManager; } @Override @@ -84,7 +91,13 @@ public class PolarisRegistration implements Registration, ServiceInstance { @Override public Map getMetadata() { - return Collections.emptyMap(); + if (CollectionUtils.isEmpty(metadata)) { + metadata = new HashMap<>(); + metadata.putAll(staticMetadataManager.getMergedStaticMetadata()); + // location info will be putted both in metadata and instance's field + metadata.putAll(staticMetadataManager.getLocationMetadata()); + } + return metadata; } public PolarisDiscoveryProperties getPolarisProperties() { @@ -97,8 +110,12 @@ public class PolarisRegistration implements Registration, ServiceInstance { @Override public String toString() { - return "PolarisRegistration{" + "polarisDiscoveryProperties=" - + polarisDiscoveryProperties + ", polarisContext=" + polarisContext + '}'; + return "PolarisRegistration{" + + "discoveryPropertiesAutoConfiguration=" + discoveryPropertiesAutoConfiguration + + ", polarisDiscoveryProperties=" + polarisDiscoveryProperties + + ", polarisContext=" + polarisContext + + ", staticMetadataManager=" + staticMetadataManager + + ", metadata=" + metadata + + '}'; } - } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistry.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistry.java index 401b16a1a..b68b2b10f 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistry.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistry.java @@ -18,8 +18,6 @@ package com.tencent.cloud.polaris.registry; -import java.util.HashMap; -import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -103,7 +101,7 @@ public class PolarisServiceRegistry implements ServiceRegistry { if (null != heartbeatExecutor) { instanceRegisterRequest.setTtl(ttl); } - instanceRegisterRequest.setMetadata(getInstanceMetadata()); + instanceRegisterRequest.setMetadata(registration.getMetadata()); instanceRegisterRequest.setProtocol(polarisDiscoveryProperties.getProtocol()); instanceRegisterRequest.setVersion(polarisDiscoveryProperties.getVersion()); try { @@ -128,16 +126,6 @@ public class PolarisServiceRegistry implements ServiceRegistry { } } - private Map getInstanceMetadata() { - Map metadata = new HashMap<>(); - - metadata.putAll(staticMetadataManager.getMergedStaticMetadata()); - // location info will be putted both in metadata and instance's field - metadata.putAll(staticMetadataManager.getLocationMetadata()); - - return metadata; - } - @Override public void deregister(Registration registration) { 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 c3f370a67..5eadee573 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 @@ -61,9 +61,10 @@ public class PolarisServiceRegistryAutoConfiguration { @ConditionalOnBean(AutoServiceRegistrationProperties.class) public PolarisRegistration polarisRegistration( DiscoveryPropertiesAutoConfiguration discoveryPropertiesAutoConfiguration, - PolarisDiscoveryProperties polarisDiscoveryProperties, SDKContext context) { + PolarisDiscoveryProperties polarisDiscoveryProperties, SDKContext context, + StaticMetadataManager staticMetadataManager) { return new PolarisRegistration(discoveryPropertiesAutoConfiguration, - polarisDiscoveryProperties, context); + polarisDiscoveryProperties, context, staticMetadataManager); } @Bean diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisAutoServiceRegistrationTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisAutoServiceRegistrationTest.java new file mode 100644 index 000000000..26aaf8efa --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisAutoServiceRegistrationTest.java @@ -0,0 +1,144 @@ +/* + * 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.registry; + +import com.tencent.cloud.polaris.PolarisDiscoveryProperties; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties; +import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.cloud.client.serviceregistry.ServiceRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.core.env.Environment; + +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.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.nullable; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; + +/** + * Test for {@link PolarisAutoServiceRegistration}. + * + * @author Haotian Zhang + */ +@RunWith(MockitoJUnitRunner.class) +public class PolarisAutoServiceRegistrationTest { + + @Mock + private ServiceRegistry serviceRegistry; + + @Mock + private AutoServiceRegistrationProperties autoServiceRegistrationProperties; + + @Mock + private PolarisDiscoveryProperties polarisDiscoveryProperties; + + @Mock + private ApplicationContext applicationContext; + + @Mock + private Environment environment; + + @Mock + private PolarisRegistration registration; + + private PolarisAutoServiceRegistration polarisAutoServiceRegistration; + + @Before + public void setUp() { + doReturn(polarisDiscoveryProperties).when(registration).getPolarisProperties(); + + doNothing().when(serviceRegistry).register(nullable(Registration.class)); + + polarisAutoServiceRegistration = + new PolarisAutoServiceRegistration(serviceRegistry, autoServiceRegistrationProperties, registration); + + doReturn(environment).when(applicationContext).getEnvironment(); + polarisAutoServiceRegistration.setApplicationContext(applicationContext); + } + + @Test + public void testRegister() { + doReturn(false).when(registration).isRegisterEnabled(); + try { + polarisAutoServiceRegistration.register(); + } + catch (Exception e) { + fail(); + } + + doReturn(true).when(registration).isRegisterEnabled(); + doReturn(-1).when(registration).getPort(); + try { + polarisAutoServiceRegistration.register(); + } + catch (Exception e) { + fail(); + } + + doReturn(PORT).when(registration).getPort(); + try { + polarisAutoServiceRegistration.register(); + } + catch (Exception e) { + fail(); + } + } + + @Test + public void testGetManagementRegistration() { + assertThat(polarisAutoServiceRegistration.getManagementRegistration()).isNull(); + } + + @Test + public void testRegisterManagement() { + doReturn(false).when(registration).isRegisterEnabled(); + try { + polarisAutoServiceRegistration.registerManagement(); + } + catch (Exception e) { + fail(); + } + + doReturn(true).when(registration).isRegisterEnabled(); + try { + polarisAutoServiceRegistration.registerManagement(); + } + catch (Exception e) { + fail(); + } + } + + @Test + public void testGetAppName() { + doReturn("application").when(environment).getProperty(anyString(), anyString()); + assertThat(polarisAutoServiceRegistration.getAppName()).isEqualTo("application"); + + doReturn(SERVICE_PROVIDER).when(polarisDiscoveryProperties).getService(); + assertThat(polarisAutoServiceRegistration.getAppName()).isEqualTo(SERVICE_PROVIDER); + } + +} 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 new file mode 100644 index 000000000..a81d69d2a --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java @@ -0,0 +1,133 @@ +/* + * 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.registry; + +import java.util.Collections; +import java.util.Map; + +import com.tencent.cloud.common.metadata.StaticMetadataManager; +import com.tencent.cloud.polaris.DiscoveryPropertiesAutoConfiguration; +import com.tencent.cloud.polaris.PolarisDiscoveryProperties; +import com.tencent.polaris.api.config.Configuration; +import com.tencent.polaris.api.config.global.APIConfig; +import com.tencent.polaris.api.config.global.GlobalConfig; +import com.tencent.polaris.client.api.SDKContext; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; + +import static com.tencent.polaris.test.common.Consts.HOST; +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 {@link PolarisRegistration}. + * + * @author Haotian Zhang + */ +@RunWith(MockitoJUnitRunner.class) +public class PolarisRegistrationTest { + + private PolarisRegistration polarisRegistration; + + @Before + public void setUp() { + // mock DiscoveryPropertiesAutoConfiguration + DiscoveryPropertiesAutoConfiguration discoveryPropertiesAutoConfiguration = + mock(DiscoveryPropertiesAutoConfiguration.class); + doReturn(true).when(discoveryPropertiesAutoConfiguration).isRegisterEnabled(); + + // mock PolarisDiscoveryProperties + PolarisDiscoveryProperties polarisDiscoveryProperties = mock(PolarisDiscoveryProperties.class); + doReturn(SERVICE_PROVIDER).when(polarisDiscoveryProperties).getService(); + doReturn(PORT).when(polarisDiscoveryProperties).getPort(); + doReturn("http").when(polarisDiscoveryProperties).getProtocol(); + + // mock SDKContext + APIConfig apiConfig = mock(APIConfig.class); + doReturn(HOST).when(apiConfig).getBindIP(); + GlobalConfig globalConfig = mock(GlobalConfig.class); + doReturn(apiConfig).when(globalConfig).getAPI(); + Configuration configuration = mock(Configuration.class); + doReturn(globalConfig).when(configuration).getGlobal(); + SDKContext polarisContext = mock(SDKContext.class); + doReturn(configuration).when(polarisContext).getConfig(); + + // mock StaticMetadataManager + StaticMetadataManager staticMetadataManager = mock(StaticMetadataManager.class); + doReturn(Collections.singletonMap("key1", "value1")).when(staticMetadataManager).getMergedStaticMetadata(); + doReturn(Collections.singletonMap("key2", "value2")).when(staticMetadataManager).getLocationMetadata(); + + polarisRegistration = new PolarisRegistration( + discoveryPropertiesAutoConfiguration, polarisDiscoveryProperties, polarisContext, staticMetadataManager); + } + + @Test + public void testGetServiceId() { + assertThat(polarisRegistration.getServiceId()).isEqualTo(SERVICE_PROVIDER); + } + + @Test + public void testGetHost() { + assertThat(polarisRegistration.getHost()).isEqualTo(HOST); + } + + @Test + public void testGetPort() { + assertThat(polarisRegistration.getPort()).isEqualTo(PORT); + } + + @Test + public void testIsSecure() { + assertThat(polarisRegistration.isSecure()).isFalse(); + } + + @Test + public void testGetUri() { + assertThat(polarisRegistration.getUri().toString()).isEqualTo("http://" + HOST + ":" + PORT); + } + + @Test + public void testGetMetadata() { + Map metadata = polarisRegistration.getMetadata(); + assertThat(metadata).isNotNull(); + assertThat(metadata).isNotEmpty(); + assertThat(metadata.size()).isEqualTo(2); + assertThat(metadata.get("key1")).isEqualTo("value1"); + assertThat(metadata.get("key2")).isEqualTo("value2"); + } + + @Test + public void testGetPolarisProperties() { + assertThat(polarisRegistration.getPolarisProperties()).isNotNull(); + } + + @Test + public void testIsRegisterEnabled() { + assertThat(polarisRegistration.isRegisterEnabled()).isTrue(); + } + + @Test + public void testToString() { + System.out.println(polarisRegistration); + } +} diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryTest.java index f37ed344c..77bdde224 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryTest.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryTest.java @@ -30,7 +30,6 @@ import org.mockito.Mockito; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.annotation.Configuration; import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST; @@ -38,6 +37,7 @@ 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.junit.Assert.fail; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; /** @@ -111,9 +111,24 @@ public class PolarisServiceRegistryTest { }); } + @Test + public void testDeRegister() { + this.contextRunner.run(context -> { + PolarisServiceRegistry registry = context + .getBean(PolarisServiceRegistry.class); + PolarisRegistration registration = Mockito.mock(PolarisRegistration.class); + doReturn(null).when(registration).getServiceId(); + try { + registry.deregister(registration); + } + catch (Throwable throwable) { + fail(); + } + }); + } + @Configuration @EnableAutoConfiguration - @EnableDiscoveryClient static class PolarisPropertiesConfiguration { } From 95d673654e7535a6e1e43eadf81b609589c9ee02 Mon Sep 17 00:00:00 2001 From: SkyeBeFreeman <928016560@qq.com> Date: Wed, 1 Jun 2022 19:24:51 +0800 Subject: [PATCH 3/4] release:release 1.5.1-Hoxton.SR9. --- CHANGELOG.md | 1 + pom.xml | 2 +- spring-cloud-tencent-dependencies/pom.xml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a582e3497..a846de737 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,3 +2,4 @@ --- - [fix:fix consul connect bug.](https://github.com/Tencent/spring-cloud-tencent/pull/217) +- [fix:fix PolarisRegistration cannot get metadata bug.](https://github.com/Tencent/spring-cloud-tencent/pull/218) diff --git a/pom.xml b/pom.xml index a23de3dc1..120684410 100644 --- a/pom.xml +++ b/pom.xml @@ -86,7 +86,7 @@ - 1.5.1-Hoxton.SR9-SNAPSHOT + 1.5.1-Hoxton.SR9 Hoxton.SR9 diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 24c8ef382..529b4e7b9 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -70,7 +70,7 @@ - 1.5.1-Hoxton.SR9-SNAPSHOT + 1.5.1-Hoxton.SR9 1.6.0 4.5.1 1.12.10 From 70f5261ecfe1dd210619d8becd27f869b8554be2 Mon Sep 17 00:00:00 2001 From: SkyeBeFreeman <928016560@qq.com> Date: Wed, 8 Jun 2022 10:56:39 +0800 Subject: [PATCH 4/4] fix:use 1.6.1 version of polaris-java and fix some bug. --- CHANGELOG.md | 3 +- changes/changes-1.5.1.md | 5 +++ pom.xml | 23 +++------- ...sRefreshApplicationReadyEventListener.java | 2 +- .../common/metadata/MetadataContext.java | 12 ++++-- .../util/ApplicationContextAwareUtils.java | 4 +- .../cloud/common/util/JacksonUtils.java | 7 ++- .../cloud/common/util/JacksonUtilsTest.java | 43 +++++++++++++++---- spring-cloud-tencent-dependencies/pom.xml | 11 ++++- .../metadata-transfer-example/README.md | 3 +- .../cloud/polaris/config/example/Person.java | 8 ++-- 11 files changed, 80 insertions(+), 41 deletions(-) create mode 100644 changes/changes-1.5.1.md diff --git a/CHANGELOG.md b/CHANGELOG.md index a846de737..629c26467 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,4 @@ # Change Log --- -- [fix:fix consul connect bug.](https://github.com/Tencent/spring-cloud-tencent/pull/217) -- [fix:fix PolarisRegistration cannot get metadata bug.](https://github.com/Tencent/spring-cloud-tencent/pull/218) +- [fix:use 1.6.1 version of polaris-java and fix some bug.](https://github.com/Tencent/spring-cloud-tencent/pull/221) \ No newline at end of file diff --git a/changes/changes-1.5.1.md b/changes/changes-1.5.1.md new file mode 100644 index 000000000..a846de737 --- /dev/null +++ b/changes/changes-1.5.1.md @@ -0,0 +1,5 @@ +# Change Log +--- + +- [fix:fix consul connect bug.](https://github.com/Tencent/spring-cloud-tencent/pull/217) +- [fix:fix PolarisRegistration cannot get metadata bug.](https://github.com/Tencent/spring-cloud-tencent/pull/218) diff --git a/pom.xml b/pom.xml index 120684410..3e6f7a8b1 100644 --- a/pom.xml +++ b/pom.xml @@ -86,14 +86,11 @@ - 1.5.1-Hoxton.SR9 + 1.5.2-Hoxton.SR9 Hoxton.SR9 - - 1.2.7 - 0.8.3 3.2.0 @@ -109,15 +106,6 @@ - - - org.springframework.cloud - spring-cloud-dependencies - ${spring.cloud.version} - pom - import - - com.tencent.cloud @@ -127,10 +115,13 @@ import + - ch.qos.logback - logback-classic - ${logback.version} + org.springframework.cloud + spring-cloud-dependencies + ${spring.cloud.version} + pom + import diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/refresh/PolarisRefreshApplicationReadyEventListener.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/refresh/PolarisRefreshApplicationReadyEventListener.java index d80accc57..9591cb389 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/refresh/PolarisRefreshApplicationReadyEventListener.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/refresh/PolarisRefreshApplicationReadyEventListener.java @@ -40,7 +40,7 @@ import static com.tencent.cloud.polaris.discovery.refresh.PolarisServiceStatusCh */ public class PolarisRefreshApplicationReadyEventListener implements ApplicationListener, ApplicationEventPublisherAware { - private static final Logger LOG = LoggerFactory.getLogger(PolarisRefreshConfiguration.class); + private static final Logger LOG = LoggerFactory.getLogger(PolarisRefreshApplicationReadyEventListener.class); private static final int DELAY = 60; private final PolarisDiscoveryHandler polarisDiscoveryHandler; private final PolarisServiceStatusChangeListener polarisServiceStatusChangeListener; diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContext.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContext.java index e7d6c7948..90148cd22 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContext.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContext.java @@ -24,6 +24,8 @@ import java.util.concurrent.ConcurrentHashMap; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; import com.tencent.cloud.common.util.JacksonUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; @@ -38,6 +40,7 @@ public class MetadataContext { * transitive context. */ public static final String FRAGMENT_TRANSITIVE = "transitive"; + private static final Logger LOG = LoggerFactory.getLogger(MetadataContext.class); /** * Namespace of local instance. */ @@ -48,9 +51,6 @@ public class MetadataContext { */ public static String LOCAL_SERVICE; - - private final Map> fragmentContexts; - static { String namespace = ApplicationContextAwareUtils .getProperties("spring.cloud.polaris.namespace"); @@ -60,6 +60,8 @@ public class MetadataContext { } if (StringUtils.isEmpty(namespace)) { + LOG.error("namespace should not be blank. please configure spring.cloud.polaris.namespace or " + + "spring.cloud.polaris.discovery.namespace"); throw new RuntimeException("namespace should not be blank. please configure spring.cloud.polaris.namespace or " + "spring.cloud.polaris.discovery.namespace"); } @@ -75,12 +77,16 @@ public class MetadataContext { } if (StringUtils.isEmpty(serviceName)) { + LOG.error("service name should not be blank. please configure spring.cloud.polaris.service or " + + "spring.cloud.polaris.discovery.service or spring.application.name"); throw new RuntimeException("service name should not be blank. please configure spring.cloud.polaris.service or " + "spring.cloud.polaris.discovery.service or spring.application.name"); } LOCAL_SERVICE = serviceName; } + private final Map> fragmentContexts; + public MetadataContext() { this.fragmentContexts = new ConcurrentHashMap<>(); } diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ApplicationContextAwareUtils.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ApplicationContextAwareUtils.java index e945a7a2a..9c6aff74d 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ApplicationContextAwareUtils.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ApplicationContextAwareUtils.java @@ -40,8 +40,8 @@ public class ApplicationContextAwareUtils implements ApplicationContextAware { return applicationContext; } - public void setApplicationContext(ApplicationContext applicationContext) - throws BeansException { + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ApplicationContextAwareUtils.applicationContext = applicationContext; } diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/JacksonUtils.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/JacksonUtils.java index 628c718a1..a30fc8bc1 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/JacksonUtils.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/JacksonUtils.java @@ -69,7 +69,12 @@ public final class JacksonUtils { public static Map deserialize2Map(String jsonStr) { try { if (StringUtils.hasText(jsonStr)) { - return OM.readValue(jsonStr, Map.class); + Map temp = OM.readValue(jsonStr, Map.class); + Map result = new HashMap<>(); + temp.forEach((key, value) -> { + result.put(String.valueOf(key), String.valueOf(value)); + }); + return result; } return new HashMap<>(); } diff --git a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/JacksonUtilsTest.java b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/JacksonUtilsTest.java index 5bd61a7d6..db0868dff 100644 --- a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/JacksonUtilsTest.java +++ b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/JacksonUtilsTest.java @@ -21,30 +21,55 @@ package com.tencent.cloud.common.util; import java.util.HashMap; import java.util.Map; -import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; + /** - * test for {@link JacksonUtils} - *@author lepdou 2022-05-27 + * Test for {@link JacksonUtils}. + * + * @author lepdou, Haotian Zhang */ @RunWith(MockitoJUnitRunner.class) public class JacksonUtilsTest { @Test - public void test() { + public void testSerialize2Json() { Map sourceMap = new HashMap<>(); sourceMap.put("k1", "v1"); sourceMap.put("k2", "v2"); sourceMap.put("k3", "v3"); - Map map = JacksonUtils.deserialize2Map(JacksonUtils.serialize2Json(sourceMap)); + String jsonStr = JacksonUtils.serialize2Json(sourceMap); + + assertThat(jsonStr).isEqualTo("{\"k1\":\"v1\",\"k2\":\"v2\",\"k3\":\"v3\"}"); + } + + @Test + public void testDeserialize2Map() { + String jsonStr = "{\"k1\":\"v1\",\"k2\":\"v2\",\"k3\":\"v3\"}"; + Map map = JacksonUtils.deserialize2Map(jsonStr); + assertThat(map.size()).isEqualTo(3); + assertThat(map.get("k1")).isEqualTo("v1"); + assertThat(map.get("k2")).isEqualTo("v2"); + assertThat(map.get("k3")).isEqualTo("v3"); + + assertThat(JacksonUtils.deserialize2Map("")).isNotNull(); + assertThat(JacksonUtils.deserialize2Map("")).isEmpty(); - Assert.assertEquals(sourceMap.size(), map.size()); - Assert.assertEquals(sourceMap.get("k1"), map.get("k1")); - Assert.assertEquals(sourceMap.get("k2"), map.get("k2")); - Assert.assertEquals(sourceMap.get("k3"), map.get("k3")); + jsonStr = "{\"k1\":\"v1\",\"k2\":\"v2\",\"k3\":\"v3\""; + try { + JacksonUtils.deserialize2Map(jsonStr); + fail("RuntimeException should be thrown."); + } + catch (RuntimeException exception) { + assertThat(exception.getMessage()).isEqualTo("Json to map failed."); + } + catch (Throwable throwable) { + fail("RuntimeException should be thrown."); + } } } diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 529b4e7b9..25031745d 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -70,8 +70,9 @@ - 1.5.1-Hoxton.SR9 - 1.6.0 + 1.5.2-Hoxton.SR9 + 1.6.1 + 1.2.7 4.5.1 1.12.10 @@ -146,6 +147,12 @@ ${revision} + + ch.qos.logback + logback-classic + ${logback.version} + + org.mockito mockito-inline diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/README.md b/spring-cloud-tencent-examples/metadata-transfer-example/README.md index 8697f1a26..c89a12d7b 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/README.md +++ b/spring-cloud-tencent-examples/metadata-transfer-example/README.md @@ -2,7 +2,8 @@ ## Example Introduction -This example shows how to use ```spring-cloud-starter-tencent-metadata-transfer`` in Spring Cloud project for its features. +This example shows how to use ```spring-cloud-starter-tencent-metadata-transfer``` in Spring Cloud project for its +features. This example contains ```metadata-callee-service```、```metadata-caller-service```. diff --git a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/Person.java b/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/Person.java index 492af0a8b..1d97d1fb9 100644 --- a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/Person.java +++ b/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/Person.java @@ -34,19 +34,19 @@ public class Person { private int age; - String getName() { + public String getName() { return name; } - void setName(String name) { + public void setName(String name) { this.name = name; } - int getAge() { + public int getAge() { return age; } - void setAge(int age) { + public void setAge(int age) { this.age = age; }