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