diff --git a/CHANGELOG.md b/CHANGELOG.md index e5dc6f465..c26fdf2bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,3 +4,4 @@ - [fix: fix log feign response stream close bug.](https://github.com/Tencent/spring-cloud-tencent/pull/896) - [fix:remove the secondary report.](https://github.com/Tencent/spring-cloud-tencent/pull/900) - [fix:optimize instance circuit beaker.](https://github.com/Tencent/spring-cloud-tencent/pull/908) +- [fix:optimize multi service registration and discovery.](https://github.com/Tencent/spring-cloud-tencent/pull/914) diff --git a/pom.xml b/pom.xml index 7151ef15f..2a66edb35 100644 --- a/pom.xml +++ b/pom.xml @@ -88,16 +88,16 @@ - 1.11.0-2020.0.5-SNAPSHOT + 1.11.0-2020.0.6-SNAPSHOT - 5.3.21 + 5.3.26 2.4.13 - 2020.0.5 + 2020.0.6 0.8.8 diff --git a/spring-cloud-starter-tencent-polaris-discovery/pom.xml b/spring-cloud-starter-tencent-polaris-discovery/pom.xml index 417659911..62ff58198 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/pom.xml +++ b/spring-cloud-starter-tencent-polaris-discovery/pom.xml @@ -28,6 +28,18 @@ test + + com.tencent.polaris + connector-consul + test + + + + com.tencent.polaris + connector-nacos + test + + com.tencent.polaris polaris-test-mock-discovery diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/consul/ConsulConfigModifier.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/consul/ConsulConfigModifier.java index 70a4f703f..e9bed3e61 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/consul/ConsulConfigModifier.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/consul/ConsulConfigModifier.java @@ -31,6 +31,8 @@ import com.tencent.polaris.factory.config.global.ServerConnectorConfigImpl; import com.tencent.polaris.factory.config.provider.RegisterConfigImpl; import com.tencent.polaris.plugins.connector.common.constant.ConsulConstant; import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; @@ -38,6 +40,9 @@ import org.springframework.util.CollectionUtils; * @author lingxiao.wlx */ public class ConsulConfigModifier implements PolarisConfigModifier { + + private static final Logger LOGGER = LoggerFactory.getLogger(ConsulConfigModifier.class); + private static final String ID = "consul"; private final ConsulContextProperties consulContextProperties; @@ -49,6 +54,23 @@ public class ConsulConfigModifier implements PolarisConfigModifier { @Override public void modify(ConfigurationImpl configuration) { if (consulContextProperties != null && consulContextProperties.isEnabled()) { + // Check if Consul client Available + boolean consulAvailable = false; + try { + consulAvailable = null != Class.forName("com.ecwid.consul.v1.ConsulClient"); + } + catch (Throwable ignored) { + + } + if (!consulAvailable) { + LOGGER.error("Please import \"connector-consul\" dependency when enabling consul service registration and discovery.\n" + + "Add dependency configuration below to pom.xml:\n" + + "\n" + + "\tcom.tencent.polaris\n" + + "\tconnector-consul\n" + + ""); + throw new RuntimeException("Dependency \"connector-consul\" not found."); + } if (CollectionUtils.isEmpty(configuration.getGlobal().getServerConnectors())) { configuration.getGlobal().setServerConnectors(new ArrayList<>()); } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/nacos/NacosConfigModifier.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/nacos/NacosConfigModifier.java index ca80e5038..4f6838177 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/nacos/NacosConfigModifier.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/extend/nacos/NacosConfigModifier.java @@ -30,6 +30,8 @@ import com.tencent.polaris.factory.config.consumer.DiscoveryConfigImpl; import com.tencent.polaris.factory.config.global.ServerConnectorConfigImpl; import com.tencent.polaris.factory.config.provider.RegisterConfigImpl; import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; @@ -40,7 +42,6 @@ import org.springframework.util.CollectionUtils; */ public class NacosConfigModifier implements PolarisConfigModifier { - private static final String ID = "nacos"; /** * nacos username. */ @@ -53,7 +54,8 @@ public class NacosConfigModifier implements PolarisConfigModifier { * nacos contextPath. */ public static final String CONTEXT_PATH = "contextPath"; - + private static final Logger LOGGER = LoggerFactory.getLogger(NacosConfigModifier.class); + private static final String ID = "nacos"; private final NacosContextProperties nacosContextProperties; public NacosConfigModifier(NacosContextProperties nacosContextProperties) { @@ -65,6 +67,23 @@ public class NacosConfigModifier implements PolarisConfigModifier { if (Objects.isNull(nacosContextProperties) || !nacosContextProperties.isEnabled()) { return; } + // Check if Nacos Available + boolean nacosAvailable = false; + try { + nacosAvailable = null != Class.forName("com.alibaba.nacos.api.naming.NamingService"); + } + catch (Throwable ignored) { + + } + if (!nacosAvailable) { + LOGGER.error("Please import \"connector-nacos\" dependency when enabling nacos service registration and discovery.\n" + + "Add dependency configuration below to pom.xml:\n" + + "\n" + + "\tcom.tencent.polaris\n" + + "\tconnector-nacos\n" + + ""); + throw new RuntimeException("Dependency \"connector-nacos\" not found."); + } if (CollectionUtils.isEmpty(configuration.getGlobal().getServerConnectors())) { configuration.getGlobal().setServerConnectors(new ArrayList<>()); } 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 234807853..b4862ce05 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 @@ -111,14 +111,4 @@ public final class JacksonUtils { throw new RuntimeException("Json to map failed.", e); } } - - public static T json2JavaBean(String content, Class valueType) { - try { - return OM.readValue(content, valueType); - } - catch (Exception e) { - LOG.error("json {} to class {} failed. ", content, valueType, e); - throw new RuntimeException("json to class failed.", e); - } - } } diff --git a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/pojo/PolarisServiceInstanceTest.java b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/pojo/PolarisServiceInstanceTest.java index afa2eec25..107310331 100644 --- a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/pojo/PolarisServiceInstanceTest.java +++ b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/pojo/PolarisServiceInstanceTest.java @@ -17,6 +17,7 @@ package com.tencent.cloud.common.pojo; +import com.tencent.polaris.api.pojo.DefaultInstance; import com.tencent.polaris.api.pojo.Instance; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -38,7 +39,7 @@ public class PolarisServiceInstanceTest { @Test @DisplayName("test getters and setters.") - void test() { + public void test1() { Instance secureInstance = mock(Instance.class); doReturn("test-ID").when(secureInstance).getId(); doReturn(SERVICE_PROVIDER).when(secureInstance).getService(); @@ -53,6 +54,7 @@ public class PolarisServiceInstanceTest { assertThat(securePolarisServiceInstance.getPort()).isEqualTo(8080); assertThat(securePolarisServiceInstance.isSecure()).isTrue(); assertThat(securePolarisServiceInstance.getScheme()).isEqualTo("https"); + assertThat(securePolarisServiceInstance.getUri().toString()).isEqualTo("https://1.1.1.1:8080"); Instance insecureInstance = mock(Instance.class); doReturn("http").when(insecureInstance).getProtocol(); @@ -60,4 +62,37 @@ public class PolarisServiceInstanceTest { assertThat(insecurePolarisServiceInstance.isSecure()).isFalse(); assertThat(insecurePolarisServiceInstance.getScheme()).isEqualTo("http"); } + + + @Test + @DisplayName("test equals().") + public void test2() { + DefaultInstance instance1 = new DefaultInstance(); + instance1.setId("test-1"); + instance1.setProtocol("http"); + PolarisServiceInstance polarisServiceInstance1 = new PolarisServiceInstance(instance1); + + DefaultInstance instance2 = new DefaultInstance(); + instance2.setId("test-1"); + instance2.setProtocol("http"); + PolarisServiceInstance polarisServiceInstance2 = new PolarisServiceInstance(instance2); + + assertThat(polarisServiceInstance1.equals(polarisServiceInstance2)).isTrue(); + } + + @Test + @DisplayName("test hashCode().") + public void test3() { + DefaultInstance instance1 = new DefaultInstance(); + instance1.setId("test-1"); + instance1.setProtocol("http"); + PolarisServiceInstance polarisServiceInstance1 = new PolarisServiceInstance(instance1); + + DefaultInstance instance2 = new DefaultInstance(); + instance2.setId("test-1"); + instance2.setProtocol("http"); + PolarisServiceInstance polarisServiceInstance2 = new PolarisServiceInstance(instance2); + + assertThat(polarisServiceInstance1.hashCode()).isEqualTo(polarisServiceInstance2.hashCode()); + } } diff --git a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/BeanFactoryUtilsTest.java b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/BeanFactoryUtilsTest.java index 9a94a32e4..e4e6001f9 100644 --- a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/BeanFactoryUtilsTest.java +++ b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/BeanFactoryUtilsTest.java @@ -19,10 +19,16 @@ package com.tencent.cloud.common.util; import org.junit.jupiter.api.Test; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.core.ResolvableType; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; /** * Test for {@link BeanFactoryUtils}. @@ -41,6 +47,11 @@ public class BeanFactoryUtilsTest { assertThat(childBeanFactory.getBeansOfType(Foo.class)).isEmpty(); assertThat(BeanFactoryUtils.getBeans(childBeanFactory, Foo.class).size()).isEqualTo(1); assertThat(BeanFactoryUtils.getBeans(childBeanFactory, Bar.class)).isEmpty(); + + MockBeanFactory mockBeanFactory = new MockBeanFactory(); + assertThatThrownBy(() -> BeanFactoryUtils.getBeans(mockBeanFactory, Bar.class)) + .isExactlyInstanceOf(RuntimeException.class) + .hasMessageContaining("bean factory not support get list bean."); } static class Foo { @@ -50,4 +61,82 @@ public class BeanFactoryUtilsTest { static class Bar { } + + static class MockBeanFactory implements BeanFactory { + + @Override + public Object getBean(String s) throws BeansException { + return null; + } + + @Override + public T getBean(String s, Class aClass) throws BeansException { + return null; + } + + @Override + public Object getBean(String s, Object... objects) throws BeansException { + return null; + } + + @Override + public T getBean(Class aClass) throws BeansException { + return null; + } + + @Override + public T getBean(Class aClass, Object... objects) throws BeansException { + return null; + } + + @Override + public ObjectProvider getBeanProvider(Class aClass) { + return null; + } + + @Override + public ObjectProvider getBeanProvider(ResolvableType resolvableType) { + return null; + } + + @Override + public boolean containsBean(String s) { + return false; + } + + @Override + public boolean isSingleton(String s) throws NoSuchBeanDefinitionException { + return false; + } + + @Override + public boolean isPrototype(String s) throws NoSuchBeanDefinitionException { + return false; + } + + @Override + public boolean isTypeMatch(String s, ResolvableType resolvableType) throws NoSuchBeanDefinitionException { + return false; + } + + @Override + public boolean isTypeMatch(String s, Class aClass) throws NoSuchBeanDefinitionException { + return false; + } + + @Override + public Class getType(String s) throws NoSuchBeanDefinitionException { + return null; + } + + @Override + public Class getType(String s, boolean b) throws NoSuchBeanDefinitionException { + return null; + } + + @Override + public String[] getAliases(String s) { + return new String[0]; + } + } } 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 962f014a3..df2b3aa7b 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 @@ -25,6 +25,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.util.StringUtils; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -43,6 +45,7 @@ public class JacksonUtilsTest { sourceMap.put("k2", "v2"); sourceMap.put("k3", "v3"); assertThat(JacksonUtils.serialize2Json(sourceMap)).isEqualTo("{\"k1\":\"v1\",\"k2\":\"v2\",\"k3\":\"v3\"}"); + assertThat(StringUtils.trimAllWhitespace(JacksonUtils.serialize2Json(sourceMap, true))).isEqualTo("{\"k1\":\"v1\",\"k2\":\"v2\",\"k3\":\"v3\"}"); } @Test diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 4c44d7418..111ef0ad7 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -70,7 +70,7 @@ - 1.11.0-2020.0.5-SNAPSHOT + 1.11.0-2020.0.6-SNAPSHOT 1.11.2 diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml index f57ab7ac0..9b974df4c 100644 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml +++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml @@ -30,14 +30,14 @@ - - + + - - - - + + + + org.springframework.cloud diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml index 1d370e7f5..aadcea9ee 100644 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml +++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml @@ -28,15 +28,15 @@ spring-cloud-starter-tencent-polaris-discovery - - - - + + + + - - - - + + + + diff --git a/spring-cloud-tencent-polaris-context/pom.xml b/spring-cloud-tencent-polaris-context/pom.xml index 0b5ca61ea..2507beddd 100644 --- a/spring-cloud-tencent-polaris-context/pom.xml +++ b/spring-cloud-tencent-polaris-context/pom.xml @@ -75,16 +75,6 @@ - - com.tencent.polaris - connector-consul - - - - com.tencent.polaris - connector-nacos - - com.tencent.polaris connector-composite