From b88ff4d187cdc0e269f60d0d0361e2a7f0c0056f Mon Sep 17 00:00:00 2001 From: Haotian Zhang <928016560@qq.com> Date: Wed, 22 Mar 2023 19:12:36 +0800 Subject: [PATCH] fix:optimize multi service registration and discovery. (#915) --- CHANGELOG.md | 1 + pom.xml | 4 +- .../pom.xml | 12 +++ .../extend/consul/ConsulConfigModifier.java | 22 +++++ .../extend/nacos/NacosConfigModifier.java | 23 ++++- .../cloud/common/util/JacksonUtils.java | 10 --- .../pojo/PolarisServiceInstanceTest.java | 37 +++++++- .../common/util/BeanFactoryUtilsTest.java | 89 +++++++++++++++++++ .../cloud/common/util/JacksonUtilsTest.java | 3 + .../discovery-callee-service/pom.xml | 12 +-- .../discovery-caller-service/pom.xml | 16 ++-- spring-cloud-tencent-polaris-context/pom.xml | 10 --- 12 files changed, 200 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8176614f..05eea37c 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/898) - [fix:remove the secondary report.](https://github.com/Tencent/spring-cloud-tencent/pull/901) - [fix:optimize instance circuit beaker.](https://github.com/Tencent/spring-cloud-tencent/pull/910) +- [fix:optimize multi service registration and discovery.](https://github.com/Tencent/spring-cloud-tencent/pull/915) diff --git a/pom.xml b/pom.xml index a8bc7fd7..b44db92b 100644 --- a/pom.xml +++ b/pom.xml @@ -91,10 +91,10 @@ 1.11.0-2022.0.1-SNAPSHOT - 6.0.5 + 6.0.7 - 3.0.3 + 3.0.4 2022.0.1 diff --git a/spring-cloud-starter-tencent-polaris-discovery/pom.xml b/spring-cloud-starter-tencent-polaris-discovery/pom.xml index 41765991..62ff5819 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 70a4f703..e9bed3e6 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 01426a73..03ffb939 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 @@ -31,6 +31,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; @@ -41,7 +43,6 @@ import org.springframework.util.CollectionUtils; */ public class NacosConfigModifier implements PolarisConfigModifier { - private static final String ID = "nacos"; /** * nacos username. */ @@ -54,7 +55,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) { @@ -66,6 +68,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 23480785..b4862ce0 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 afa2eec2..10731033 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 9a94a32e..e4e6001f 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 962f014a..df2b3aa7 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-examples/polaris-discovery-example/discovery-callee-service/pom.xml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml index f57ab7ac..9b974df4 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 fed05b95..6d97ca90 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 @@ -24,15 +24,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 d25bf6e0..5b6c5cca 100644 --- a/spring-cloud-tencent-polaris-context/pom.xml +++ b/spring-cloud-tencent-polaris-context/pom.xml @@ -70,16 +70,6 @@ - - com.tencent.polaris - connector-consul - - - - com.tencent.polaris - connector-nacos - - com.tencent.polaris connector-composite