map = new ConcurrentHashMap<>();
diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigPropertyAutoRefresher.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigPropertyAutoRefresher.java
index 7dead1773..f79c01fd6 100644
--- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigPropertyAutoRefresher.java
+++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigPropertyAutoRefresher.java
@@ -23,6 +23,7 @@ import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import com.tencent.cloud.polaris.config.config.PolarisConfigProperties;
+import com.tencent.cloud.polaris.config.logger.PolarisConfigLoggerContext;
import com.tencent.polaris.configuration.api.core.ConfigKVFileChangeListener;
import com.tencent.polaris.configuration.api.core.ConfigPropertyChangeInfo;
import org.slf4j.Logger;
@@ -33,6 +34,8 @@ import org.springframework.context.ApplicationListener;
import org.springframework.lang.NonNull;
import org.springframework.util.CollectionUtils;
+
+
/**
* 1. Listen to the Polaris server configuration publishing event 2. Write the changed
* configuration content to propertySource 3. Refresh the context through contextRefresher
@@ -96,6 +99,18 @@ public abstract class PolarisConfigPropertyAutoRefresher
LOGGER.info("[SCT Config] changed property = {}", configPropertyChangeInfo);
+ // 新增动态改变日志级别的能力
+ try {
+ if (changedKey.startsWith("logging.level") && changedKey.length() >= 14) {
+ String loggerName = changedKey.substring(14);
+ String newValue = configPropertyChangeInfo.getNewValue();
+ LOGGER.info("[SCT Config] set logging.level loggerName:{}, newValue:{}", loggerName, newValue);
+ PolarisConfigLoggerContext.setLevel(loggerName, newValue);
+ }
+ }
+ catch (Exception e) {
+ LOGGER.error("[SCT Config] set logging.level exception,", e);
+ }
switch (configPropertyChangeInfo.getChangeType()) {
case MODIFIED:
case ADDED:
diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigRefreshScopeAnnotationDetector.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigRefreshScopeAnnotationDetector.java
new file mode 100644
index 000000000..5c26342ce
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigRefreshScopeAnnotationDetector.java
@@ -0,0 +1,94 @@
+/*
+ * 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.config.adapter;
+
+import java.lang.annotation.Annotation;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.core.Ordered;
+import org.springframework.core.PriorityOrdered;
+import org.springframework.lang.NonNull;
+
+/**
+ * Mainly used to detect whether the annotation class {@link org.springframework.cloud.context.config.annotation.RefreshScope}
+ * exists, and whether the user has configured beans using this annotation in their business system.
+ * If the annotation {@code @RefreshScope} exists and is used, the auto-optimization will be triggered
+ * in listener {@link com.tencent.cloud.polaris.config.listener.PolarisConfigRefreshOptimizationListener}.
+ *
+ * This bean will only be created and initialized when the config refresh type is {@code RefreshType.REFLECT}.
+ *
+ * @author jarvisxiong
+ */
+@SuppressWarnings({"unchecked", "rawtypes"})
+public class PolarisConfigRefreshScopeAnnotationDetector implements BeanPostProcessor, InitializingBean, PriorityOrdered {
+
+ private final AtomicBoolean isRefreshScopeAnnotationUsed = new AtomicBoolean(false);
+
+ private Class refreshScopeAnnotationClass;
+
+ private String annotatedRefreshScopeBeanName;
+
+ @Override
+ public Object postProcessBeforeInitialization(@NonNull Object bean, @NonNull String beanName)
+ throws BeansException {
+ return bean;
+ }
+
+ @Override
+ public Object postProcessAfterInitialization(@NonNull Object bean, @NonNull String beanName)
+ throws BeansException {
+ if (isRefreshScopeAnnotationUsed() || refreshScopeAnnotationClass == null) {
+ return bean;
+ }
+ Annotation[] refreshScopeAnnotations = bean.getClass().getAnnotationsByType(refreshScopeAnnotationClass);
+ if (refreshScopeAnnotations.length > 0) {
+ if (isRefreshScopeAnnotationUsed.compareAndSet(false, true)) {
+ annotatedRefreshScopeBeanName = beanName;
+ }
+ }
+ return bean;
+ }
+
+ @Override
+ public void afterPropertiesSet() {
+ try {
+ refreshScopeAnnotationClass = Class.forName(
+ "org.springframework.cloud.context.config.annotation.RefreshScope",
+ false,
+ getClass().getClassLoader());
+ }
+ catch (ClassNotFoundException ignored) {
+ }
+ }
+
+ @Override
+ public int getOrder() {
+ return Ordered.LOWEST_PRECEDENCE;
+ }
+
+ public boolean isRefreshScopeAnnotationUsed() {
+ return isRefreshScopeAnnotationUsed.get();
+ }
+
+ public String getAnnotatedRefreshScopeBeanName() {
+ return annotatedRefreshScopeBeanName;
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/config/PolarisConfigProperties.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/config/PolarisConfigProperties.java
index 50e8fde54..6a014aa04 100644
--- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/config/PolarisConfigProperties.java
+++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/config/PolarisConfigProperties.java
@@ -15,15 +15,16 @@
* specific language governing permissions and limitations under the License.
*
*/
-
package com.tencent.cloud.polaris.config.config;
import java.util.List;
import com.tencent.cloud.polaris.config.enums.RefreshType;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
+
/**
* polaris config module bootstrap configs.
*
@@ -31,26 +32,29 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
*/
@ConfigurationProperties("spring.cloud.polaris.config")
public class PolarisConfigProperties {
-
/**
* Whether to open the configuration center.
*/
+ @Value("${spring.cloud.polaris.config.enabled:#{'true'}}")
private boolean enabled = true;
/**
* Configuration center service address list.
*/
+ @Value("${spring.cloud.polaris.config.address:}")
private String address;
/**
* Polaris config grpc port.
*/
+ @Value("${spring.cloud.polaris.config.port:#{'8093'}}")
private int port = 8093;
/**
* Whether to automatically update to the spring context when the configuration file.
* is updated
*/
+ @Value("${spring.cloud.polaris.config.autoRefresh:#{'true'}}")
private boolean autoRefresh = true;
private boolean shutdownIfConnectToConfigServerFailed = true;
diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigRefreshOptimizationListener.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigRefreshOptimizationListener.java
new file mode 100644
index 000000000..30e256dca
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigRefreshOptimizationListener.java
@@ -0,0 +1,132 @@
+/*
+ * 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.config.listener;
+
+import java.util.Collections;
+
+import com.tencent.cloud.polaris.config.adapter.PolarisConfigRefreshScopeAnnotationDetector;
+import com.tencent.cloud.polaris.config.adapter.PolarisPropertySourceManager;
+import com.tencent.cloud.polaris.config.adapter.PolarisRefreshEntireContextRefresher;
+import com.tencent.cloud.polaris.config.config.PolarisConfigProperties;
+import com.tencent.cloud.polaris.config.enums.RefreshType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.beans.factory.config.ConstructorArgumentValues;
+import org.springframework.beans.factory.support.AbstractBeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.DefaultListableBeanFactory;
+import org.springframework.cloud.context.refresh.ContextRefresher;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.core.env.MutablePropertySources;
+import org.springframework.lang.NonNull;
+
+import static com.tencent.cloud.polaris.config.condition.ReflectRefreshTypeCondition.POLARIS_CONFIG_REFRESH_TYPE;
+
+/**
+ * When {@link com.tencent.cloud.polaris.config.adapter.PolarisConfigRefreshScopeAnnotationDetector} detects that
+ * the annotation {@code @RefreshScope} exists and is used, but the config refresh type
+ * {@code spring.cloud.polaris.config.refresh-type} is still {@code RefreshType.REFLECT}, then the framework will
+ * automatically switch the config refresh type to {@code RefreshType.REFRESH_CONTEXT}.
+ *
+ *
The purpose of this optimization is to omit additional configuration, and facilitate for users to use the
+ * dynamic configuration refresh strategy of Spring Cloud Context.
+ *
+ * @author jarvisxiong
+ */
+public class PolarisConfigRefreshOptimizationListener implements ApplicationListener {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(PolarisConfigRefreshOptimizationListener.class);
+
+ private static final String CONFIG_REFRESH_TYPE_PROPERTY = "configRefreshTypeProperty";
+
+ private static final String REFLECT_REBINDER_BEAN_NAME = "affectedConfigurationPropertiesRebinder";
+
+ private static final String REFLECT_REFRESHER_BEAN_NAME = "polarisReflectPropertySourceAutoRefresher";
+
+ private static final String REFRESH_CONTEXT_REFRESHER_BEAN_NAME = "polarisRefreshContextPropertySourceAutoRefresher";
+
+
+ @Override
+ public void onApplicationEvent(@NonNull ContextRefreshedEvent event) {
+ ConfigurableApplicationContext applicationContext = (ConfigurableApplicationContext) event.getApplicationContext();
+ PolarisConfigRefreshScopeAnnotationDetector detector = applicationContext.getBean(PolarisConfigRefreshScopeAnnotationDetector.class);
+ boolean isRefreshScopeAnnotationUsed = detector.isRefreshScopeAnnotationUsed();
+ String annotatedRefreshScopeBeanName = detector.getAnnotatedRefreshScopeBeanName();
+ // using System.setProperty to set spring.cloud.polaris.config.refresh-type
+ String value = System.getProperty("spring.cloud.polaris.config.refresh-type");
+ boolean isSystemSetRefreshType = RefreshType.REFRESH_CONTEXT.toString().equalsIgnoreCase(value);
+ // a bean is using @RefreshScope, but the config refresh type is still [reflect], switch automatically
+ if (isRefreshScopeAnnotationUsed || isSystemSetRefreshType) {
+ if (isRefreshScopeAnnotationUsed) {
+ LOGGER.warn("Detected that the bean [{}] is using @RefreshScope annotation, but the config refresh type is still [reflect]. " + "[SCT] will automatically switch to [refresh_context].", annotatedRefreshScopeBeanName);
+ }
+ if (isSystemSetRefreshType) {
+ LOGGER.warn("Detected that using System.setProperty to set spring.cloud.polaris.config.refresh-type = refresh_context, but the config refresh type is still [reflect]. " + "[SCT] will automatically switch to [refresh_context].");
+ }
+ switchConfigRefreshTypeProperty(applicationContext);
+ modifyPolarisConfigPropertiesBean(applicationContext);
+ // remove related bean of type [reflect]
+ removeRelatedBeansOfReflect(applicationContext);
+ // register a new refresher bean of type [refresh_context]
+ registerRefresherBeanOfRefreshContext(applicationContext);
+ // add the new refresher to context as a listener
+ addRefresherBeanAsListener(applicationContext);
+ }
+ }
+
+ private void switchConfigRefreshTypeProperty(ConfigurableApplicationContext applicationContext) {
+ MutablePropertySources propertySources = applicationContext.getEnvironment().getPropertySources();
+ propertySources.addFirst(new MapPropertySource(CONFIG_REFRESH_TYPE_PROPERTY, Collections.singletonMap(POLARIS_CONFIG_REFRESH_TYPE, RefreshType.REFRESH_CONTEXT)));
+ }
+
+ private void modifyPolarisConfigPropertiesBean(ConfigurableApplicationContext applicationContext) {
+ PolarisConfigProperties polarisConfigProperties = applicationContext.getBean(PolarisConfigProperties.class);
+ polarisConfigProperties.setRefreshType(RefreshType.REFRESH_CONTEXT);
+ }
+
+ private void removeRelatedBeansOfReflect(ConfigurableApplicationContext applicationContext) {
+ DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getBeanFactory();
+ beanFactory.removeBeanDefinition(REFLECT_REFRESHER_BEAN_NAME);
+ beanFactory.removeBeanDefinition(REFLECT_REBINDER_BEAN_NAME);
+ }
+
+ private void registerRefresherBeanOfRefreshContext(ConfigurableApplicationContext applicationContext) {
+ DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getBeanFactory();
+ AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
+ beanDefinition.setBeanClass(PolarisRefreshEntireContextRefresher.class);
+ PolarisConfigProperties polarisConfigProperties = beanFactory.getBean(PolarisConfigProperties.class);
+ PolarisPropertySourceManager polarisPropertySourceManager = beanFactory.getBean(PolarisPropertySourceManager.class);
+ ContextRefresher contextRefresher = beanFactory.getBean(ContextRefresher.class);
+ ConstructorArgumentValues constructorArgumentValues = beanDefinition.getConstructorArgumentValues();
+ constructorArgumentValues.addIndexedArgumentValue(0, polarisConfigProperties);
+ constructorArgumentValues.addIndexedArgumentValue(1, polarisPropertySourceManager);
+ constructorArgumentValues.addIndexedArgumentValue(2, contextRefresher);
+ beanFactory.registerBeanDefinition(REFRESH_CONTEXT_REFRESHER_BEAN_NAME, beanDefinition);
+ }
+
+
+ private void addRefresherBeanAsListener(ConfigurableApplicationContext applicationContext) {
+ PolarisRefreshEntireContextRefresher refresher = (PolarisRefreshEntireContextRefresher) applicationContext.getBean(REFRESH_CONTEXT_REFRESHER_BEAN_NAME);
+ applicationContext.addApplicationListener(refresher);
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/logger/Level.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/logger/Level.java
new file mode 100644
index 000000000..17babf0a7
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/logger/Level.java
@@ -0,0 +1,28 @@
+package com.tencent.cloud.polaris.config.logger;
+
+/**
+ * @author juanyinyang
+ */
+public enum Level {
+
+ /** 日志级别. */
+ TRACE("TRACE"), DEBUG("DEBUG"), INFO("INFO"), WARN("WARN"), ERROR("ERROR"), FATAL("FATAL"), OFF("OFF");
+
+ private String level;
+
+ Level(String level) {
+ this.level = level;
+ }
+ public String getLevel() {
+ return level;
+ }
+
+ public static Level levelOf(String level) {
+ for (Level l : Level.values()) {
+ if (l.level.equalsIgnoreCase(level)) {
+ return l;
+ }
+ }
+ return null;
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/logger/PolarisConfigLoggerApplicationListener.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/logger/PolarisConfigLoggerApplicationListener.java
new file mode 100644
index 000000000..f834b2c50
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/logger/PolarisConfigLoggerApplicationListener.java
@@ -0,0 +1,35 @@
+package com.tencent.cloud.polaris.config.logger;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.boot.context.event.ApplicationStartedEvent;
+import org.springframework.boot.logging.LoggingSystem;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+
+/**
+ * @author juanyinyang
+ */
+public class PolarisConfigLoggerApplicationListener implements ApplicationListener {
+ private static final Logger LOGGER = LoggerFactory.getLogger(PolarisConfigLoggerApplicationListener.class);
+ /**
+ * @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent)
+ */
+ @Override
+ public void onApplicationEvent(ApplicationEvent event) {
+ try {
+ // Initialize application loggingSystem.
+ if (event instanceof ApplicationStartedEvent) {
+ ApplicationStartedEvent startedEvent = (ApplicationStartedEvent) event;
+ ClassLoader classLoader = startedEvent.getSpringApplication().getClassLoader();
+ LoggingSystem loggingSystem = LoggingSystem.get(classLoader);
+ LOGGER.info("PolarisConfigLoggerApplicationListener onApplicationEvent init loggingSystem:{}", loggingSystem);
+ PolarisConfigLoggerContext.setLogSystem(loggingSystem);
+ }
+ }
+ catch (Exception e) {
+ LOGGER.error("PolarisConfigLoggerApplicationListener onApplicationEvent exception:", e);
+ }
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/logger/PolarisConfigLoggerContext.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/logger/PolarisConfigLoggerContext.java
new file mode 100644
index 000000000..9bda215f8
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/logger/PolarisConfigLoggerContext.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2018 www.tencent.com.
+ * All Rights Reserved.
+ * This program is the confidential and proprietary information of
+ * www.tencent.com ("Confidential Information"). You shall not disclose such
+ * Confidential Information and shall use it only in accordance with
+ * the terms of the license agreement you entered into with www.tencent.com.
+ */
+
+package com.tencent.cloud.polaris.config.logger;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.boot.logging.LogLevel;
+import org.springframework.boot.logging.LoggingSystem;
+import org.springframework.util.Assert;
+
+import static org.springframework.boot.logging.LoggingSystem.ROOT_LOGGER_NAME;
+
+/**
+ * @author juanyinyang
+ */
+public final class PolarisConfigLoggerContext {
+
+ private static LoggingSystem loggingSystem;
+
+ private PolarisConfigLoggerContext() {
+
+ }
+ protected static void setLogSystem(LoggingSystem logSystem) {
+ Assert.notNull(logSystem, "Logging System should not be null");
+ PolarisConfigLoggerContext.loggingSystem = logSystem;
+ }
+
+ public static void setLevel(String loggerName, String level) {
+ if (loggingSystem == null) {
+ printLog("[SCT Config] PolarisConfigLoggerContext logger: [" + loggerName + "] change to target level fail. caused by internal exception:" + level, Level.WARN);
+ return;
+ }
+ Level loggerLevel = Level.levelOf(level);
+ if (loggerLevel == null) {
+ printLog("[SCT Config] PolarisConfigLoggerContext logger: [" + loggerName + "] change to target level fail. caused by level is not support, level:" + level, Level.WARN);
+ return;
+ }
+ LogLevel logLevel = null;
+ switch (loggerLevel) {
+ case TRACE:
+ logLevel = LogLevel.TRACE;
+ break;
+ case DEBUG:
+ logLevel = LogLevel.DEBUG;
+ break;
+ case OFF:
+ logLevel = LogLevel.OFF;
+ break;
+ case INFO:
+ logLevel = LogLevel.INFO;
+ break;
+ case WARN:
+ logLevel = LogLevel.WARN;
+ break;
+ case ERROR:
+ logLevel = LogLevel.ERROR;
+ break;
+ case FATAL:
+ logLevel = LogLevel.FATAL;
+ break;
+ default:
+ printLog("[SCT Config] PolarisConfigLoggerContext logger: [" + loggerName + "] setLevel fail. caused by level is not support, level: " + level, Level.WARN);
+ }
+ loggingSystem.setLogLevel(loggerName, logLevel);
+ printLog("[SCT Config] PolarisConfigLoggerContext logger: [" + loggerName + "] changed to level:" + level, Level.INFO);
+ }
+ /**
+ * 打印日志.
+ */
+ private static void printLog(String message, Level level) {
+ Logger logger = LoggerFactory.getLogger(ROOT_LOGGER_NAME);
+ if (level.ordinal() <= Level.INFO.ordinal()) {
+ if (logger != null) {
+ logger.info(message);
+ }
+ else {
+ StdLog.info(message);
+ }
+ }
+ else {
+ if (logger != null) {
+ logger.warn(message);
+ }
+ else {
+ StdLog.warn(message);
+ }
+ }
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/logger/StdLog.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/logger/StdLog.java
new file mode 100644
index 000000000..df9eddafd
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/logger/StdLog.java
@@ -0,0 +1,79 @@
+package com.tencent.cloud.polaris.config.logger;
+
+import java.io.PrintStream;
+import java.util.Calendar;
+
+/**
+ * internal output logger.
+ * @author juanyinyang
+ */
+public final class StdLog {
+
+ private static final String CLASS_INFO = StdLog.class.getName();
+
+
+ protected static boolean debugEnabled = false;
+
+ /**
+ * *enable info level log.
+ */
+ protected static boolean infoEnabled = true;
+
+ /**
+ * quite mode will out put nothing.
+ */
+ protected static boolean quietMode = false;
+
+ private static final String DEBUG_FIX = "StdLog:DEBUG: ";
+
+ private static final String INFO_FIX = "StdLog:INFO: ";
+
+ private static final String WARN_FIX = "StdLog:WARN: ";
+
+ private StdLog() {
+ }
+
+ public static void setQuietMode(boolean quietMode) {
+ StdLog.quietMode = quietMode;
+ }
+
+ public static void setInfoEnabled(boolean infoEnabled) {
+ StdLog.infoEnabled = infoEnabled;
+ }
+
+ public static void setDebugEnabled(boolean debugEnabled) {
+ StdLog.debugEnabled = debugEnabled;
+ }
+
+ public static void debug(String msg) {
+ if (debugEnabled && !quietMode) {
+ println(System.out, DEBUG_FIX + msg);
+ }
+ }
+
+ public static void info(String msg) {
+ if (infoEnabled && !quietMode) {
+ println(System.out, INFO_FIX + msg);
+ }
+ }
+
+ public static void warn(String msg) {
+ if (infoEnabled && !quietMode) {
+ println(System.err, WARN_FIX + msg);
+ }
+ }
+
+ public static void warn(String msg, Throwable t) {
+ if (quietMode) {
+ return;
+ }
+ println(System.err, WARN_FIX + msg);
+ if (t != null) {
+ t.printStackTrace();
+ }
+ }
+
+ private static void println(PrintStream out, String msg) {
+ out.println(Calendar.getInstance().getTime().toString() + " " + CLASS_INFO + " " + msg);
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFileLocatorTest.java b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFileLocatorTest.java
index 61e6706dc..acdeb050c 100644
--- a/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFileLocatorTest.java
+++ b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFileLocatorTest.java
@@ -81,8 +81,10 @@ public class PolarisConfigFileLocatorTest {
Map emptyMap = new HashMap<>();
ConfigKVFile emptyConfigFile = new MockedConfigKVFile(emptyMap);
when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "application.yml")).thenReturn(emptyConfigFile);
+ when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "application.yaml")).thenReturn(emptyConfigFile);
when(configFileService.getConfigPropertiesFile(testNamespace, testServiceName, "bootstrap.properties")).thenReturn(emptyConfigFile);
when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "bootstrap.yml")).thenReturn(emptyConfigFile);
+ when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "bootstrap.yaml")).thenReturn(emptyConfigFile);
when(polarisConfigProperties.getGroups()).thenReturn(null);
when(environment.getActiveProfiles()).thenReturn(new String[] {});
@@ -121,11 +123,15 @@ public class PolarisConfigFileLocatorTest {
Map emptyMap = new HashMap<>();
ConfigKVFile emptyConfigFile = new MockedConfigKVFile(emptyMap);
when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "application.yml")).thenReturn(emptyConfigFile);
+ when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "application.yaml")).thenReturn(emptyConfigFile);
when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "application-dev.yml")).thenReturn(emptyConfigFile);
+ when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "application-dev.yaml")).thenReturn(emptyConfigFile);
when(configFileService.getConfigPropertiesFile(testNamespace, testServiceName, "bootstrap.properties")).thenReturn(emptyConfigFile);
when(configFileService.getConfigPropertiesFile(testNamespace, testServiceName, "bootstrap-dev.properties")).thenReturn(emptyConfigFile);
when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "bootstrap.yml")).thenReturn(emptyConfigFile);
+ when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "bootstrap.yaml")).thenReturn(emptyConfigFile);
when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "bootstrap-dev.yml")).thenReturn(emptyConfigFile);
+ when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "bootstrap-dev.yaml")).thenReturn(emptyConfigFile);
when(polarisConfigProperties.getGroups()).thenReturn(null);
when(environment.getActiveProfiles()).thenReturn(new String[] {"dev"});
@@ -150,8 +156,10 @@ public class PolarisConfigFileLocatorTest {
when(configFileService.getConfigPropertiesFile(testNamespace, testServiceName, "application.properties")).thenReturn(emptyConfigFile);
when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "application.yml")).thenReturn(emptyConfigFile);
+ when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "application.yaml")).thenReturn(emptyConfigFile);
when(configFileService.getConfigPropertiesFile(testNamespace, testServiceName, "bootstrap.properties")).thenReturn(emptyConfigFile);
when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "bootstrap.yml")).thenReturn(emptyConfigFile);
+ when(configFileService.getConfigYamlFile(testNamespace, testServiceName, "bootstrap.yaml")).thenReturn(emptyConfigFile);
List customFiles = new LinkedList<>();
ConfigFileGroup configFileGroup = new ConfigFileGroup();
diff --git a/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigRefreshScopeAnnotationDetectorTest.java b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigRefreshScopeAnnotationDetectorTest.java
new file mode 100644
index 000000000..31e3c1d57
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigRefreshScopeAnnotationDetectorTest.java
@@ -0,0 +1,101 @@
+/*
+ * 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.config.adapter;
+
+import com.tencent.cloud.polaris.config.PolarisConfigAutoConfiguration;
+import com.tencent.cloud.polaris.config.PolarisConfigBootstrapAutoConfiguration;
+import org.assertj.core.api.InstanceOfAssertFactories;
+import org.junit.jupiter.api.Test;
+
+import org.springframework.boot.autoconfigure.AutoConfigurations;
+import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration;
+import org.springframework.cloud.autoconfigure.RefreshAutoConfiguration;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+
+import static org.assertj.core.api.Assertions.as;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * test for {@link PolarisConfigRefreshScopeAnnotationDetector}.
+ */
+@SuppressWarnings("rawtypes")
+public class PolarisConfigRefreshScopeAnnotationDetectorTest {
+
+ private static Class refreshScopeAnnotationClass = null;
+
+ static {
+ try {
+ refreshScopeAnnotationClass = Class.forName(
+ "org.springframework.cloud.context.config.annotation.RefreshScope",
+ false,
+ PolarisConfigRefreshScopeAnnotationDetectorTest.class.getClassLoader());
+ }
+ catch (ClassNotFoundException ignored) {
+ }
+ }
+
+ @Test
+ public void testUseRefreshScope() {
+ ApplicationContextRunner contextRunner = new ApplicationContextRunner()
+ .withConfiguration(AutoConfigurations.of(PolarisConfigBootstrapAutoConfiguration.class))
+ .withConfiguration(AutoConfigurations.of(PolarisConfigAutoConfiguration.class))
+ .withConfiguration(AutoConfigurations.of(RefreshAutoConfiguration.class))
+ .withConfiguration(AutoConfigurations.of(ConfigurationPropertiesRebinderAutoConfiguration.class))
+ .withBean("testBeanWithRefreshScope", TestBeanWithRefreshScope.class)
+ .withPropertyValues("spring.application.name=" + "polarisConfigRefreshScopeAnnotationDetectorTest")
+ .withPropertyValues("server.port=" + 8080)
+ .withPropertyValues("spring.cloud.polaris.address=grpc://127.0.0.1:10081")
+ .withPropertyValues("spring.cloud.polaris.config.connect-remote-server=false");
+ contextRunner.run(context -> {
+ assertThat(context).hasSingleBean(PolarisConfigRefreshScopeAnnotationDetector.class);
+ PolarisConfigRefreshScopeAnnotationDetector detector = context.getBean(PolarisConfigRefreshScopeAnnotationDetector.class);
+ assertThat(detector.isRefreshScopeAnnotationUsed()).isTrue();
+ assertThat(detector.getAnnotatedRefreshScopeBeanName()).isEqualTo("scopedTarget.testBeanWithRefreshScope");
+ assertThat(detector).extracting("refreshScopeAnnotationClass", as(InstanceOfAssertFactories.type(Class.class)))
+ .isEqualTo(refreshScopeAnnotationClass);
+ });
+ }
+
+ @Test
+ public void testNotUseRefreshScope() {
+ ApplicationContextRunner contextRunner = new ApplicationContextRunner()
+ .withConfiguration(AutoConfigurations.of(PolarisConfigBootstrapAutoConfiguration.class))
+ .withConfiguration(AutoConfigurations.of(PolarisConfigAutoConfiguration.class))
+ .withConfiguration(AutoConfigurations.of(RefreshAutoConfiguration.class))
+ .withConfiguration(AutoConfigurations.of(ConfigurationPropertiesRebinderAutoConfiguration.class))
+ .withPropertyValues("spring.application.name=" + "polarisConfigRefreshScopeAnnotationDetectorTest")
+ .withPropertyValues("server.port=" + 8080)
+ .withPropertyValues("spring.cloud.polaris.address=grpc://127.0.0.1:10081")
+ .withPropertyValues("spring.cloud.polaris.config.connect-remote-server=false");
+ contextRunner.run(context -> {
+ assertThat(context).hasSingleBean(PolarisConfigRefreshScopeAnnotationDetector.class);
+ PolarisConfigRefreshScopeAnnotationDetector detector = context.getBean(PolarisConfigRefreshScopeAnnotationDetector.class);
+ assertThat(detector.isRefreshScopeAnnotationUsed()).isFalse();
+ assertThat(detector.getAnnotatedRefreshScopeBeanName()).isNull();
+ assertThat(detector).extracting("refreshScopeAnnotationClass", as(InstanceOfAssertFactories.type(Class.class)))
+ .isEqualTo(refreshScopeAnnotationClass);
+ });
+ }
+
+ @RefreshScope
+ protected static class TestBeanWithRefreshScope {
+
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/listener/PolarisConfigRefreshOptimizationListenerNotTriggeredTest.java b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/listener/PolarisConfigRefreshOptimizationListenerNotTriggeredTest.java
new file mode 100644
index 000000000..2a0444a01
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/listener/PolarisConfigRefreshOptimizationListenerNotTriggeredTest.java
@@ -0,0 +1,154 @@
+/*
+ * 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.config.listener;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+import com.tencent.cloud.polaris.config.adapter.MockedConfigKVFile;
+import com.tencent.cloud.polaris.config.adapter.PolarisPropertySource;
+import com.tencent.cloud.polaris.config.adapter.PolarisPropertySourceManager;
+import com.tencent.cloud.polaris.config.adapter.PolarisRefreshAffectedContextRefresher;
+import com.tencent.cloud.polaris.config.config.PolarisConfigProperties;
+import com.tencent.cloud.polaris.config.enums.RefreshType;
+import com.tencent.polaris.configuration.api.core.ChangeType;
+import com.tencent.polaris.configuration.api.core.ConfigKVFileChangeEvent;
+import com.tencent.polaris.configuration.api.core.ConfigPropertyChangeInfo;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mockito;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.context.refresh.ContextRefresher;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.stereotype.Component;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import static com.tencent.cloud.polaris.config.condition.ReflectRefreshTypeCondition.POLARIS_CONFIG_REFRESH_TYPE;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT;
+
+/**
+ * test for {@link PolarisConfigRefreshOptimizationListener}.
+ */
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(webEnvironment = DEFINED_PORT, classes = PolarisConfigRefreshOptimizationListenerNotTriggeredTest.TestApplication.class,
+ properties = {
+ "server.port=8081",
+ "spring.cloud.polaris.address=grpc://127.0.0.1:10081",
+ "spring.cloud.polaris.config.connect-remote-server=false",
+ "spring.cloud.polaris.config.refresh-type=reflect",
+ "spring.config.location = classpath:application-test.yml"
+ })
+public class PolarisConfigRefreshOptimizationListenerNotTriggeredTest {
+
+ private static final String REFLECT_REFRESHER_BEAN_NAME = "polarisReflectPropertySourceAutoRefresher";
+
+ private static final String TEST_NAMESPACE = "testNamespace";
+
+ private static final String TEST_SERVICE_NAME = "testServiceName";
+
+ private static final String TEST_FILE_NAME = "application.properties";
+
+ @Autowired
+ private ConfigurableApplicationContext context;
+
+ @Test
+ public void testNotSwitchConfigRefreshType() {
+ RefreshType actualRefreshType = context.getEnvironment()
+ .getProperty(POLARIS_CONFIG_REFRESH_TYPE, RefreshType.class);
+ assertThat(actualRefreshType).isEqualTo(RefreshType.REFLECT);
+ PolarisConfigProperties polarisConfigProperties = context.getBean(PolarisConfigProperties.class);
+ assertThat(polarisConfigProperties.getRefreshType()).isEqualTo(RefreshType.REFLECT);
+ assertThat(context.containsBean(REFLECT_REFRESHER_BEAN_NAME)).isTrue();
+ PolarisRefreshAffectedContextRefresher refresher = context
+ .getBean(REFLECT_REFRESHER_BEAN_NAME, PolarisRefreshAffectedContextRefresher.class);
+ assertThat(((AbstractApplicationContext) context).getApplicationListeners().contains(refresher)).isTrue();
+ }
+
+ @Test
+ public void testConfigFileChanged() {
+ Map content = new HashMap<>();
+ content.put("k1", "v1");
+ content.put("k2", "v2");
+ content.put("k3", "v3");
+ MockedConfigKVFile file = new MockedConfigKVFile(content);
+
+ PolarisPropertySource polarisPropertySource = new PolarisPropertySource(TEST_NAMESPACE, TEST_SERVICE_NAME, TEST_FILE_NAME,
+ file, content);
+ PolarisPropertySourceManager manager = context.getBean(PolarisPropertySourceManager.class);
+ when(manager.getAllPropertySources()).thenReturn(Lists.newArrayList(polarisPropertySource));
+
+ PolarisRefreshAffectedContextRefresher refresher = context.getBean(PolarisRefreshAffectedContextRefresher.class);
+ PolarisRefreshAffectedContextRefresher spyRefresher = Mockito.spy(refresher);
+
+ spyRefresher.onApplicationEvent(null);
+
+ ConfigPropertyChangeInfo changeInfo = new ConfigPropertyChangeInfo("k1", "v1", "v11", ChangeType.MODIFIED);
+ ConfigPropertyChangeInfo changeInfo2 = new ConfigPropertyChangeInfo("k4", null, "v4", ChangeType.ADDED);
+ ConfigPropertyChangeInfo changeInfo3 = new ConfigPropertyChangeInfo("k2", "v2", null, ChangeType.DELETED);
+ Map changeInfos = new HashMap<>();
+ changeInfos.put("k1", changeInfo);
+ changeInfos.put("k2", changeInfo3);
+ changeInfos.put("k4", changeInfo2);
+ ConfigKVFileChangeEvent event = new ConfigKVFileChangeEvent(changeInfos);
+ file.fireChangeListener(event);
+
+ ContextRefresher mockContextRefresher = context.getBean(ContextRefresher.class);
+ when(mockContextRefresher.refresh()).thenReturn(event.changedKeys());
+
+ Mockito.verify(spyRefresher, Mockito.times(1))
+ .refreshSpringValue("k1");
+ Mockito.verify(spyRefresher, Mockito.times(1))
+ .refreshSpringValue("k2");
+ Mockito.verify(spyRefresher, Mockito.times(1))
+ .refreshSpringValue("k4");
+ Mockito.verify(spyRefresher, Mockito.times(1))
+ .refreshConfigurationProperties(event.changedKeys());
+ }
+
+ @SpringBootApplication
+ protected static class TestApplication {
+
+ @Primary
+ @Bean
+ public PolarisPropertySourceManager polarisPropertySourceManager() {
+ return mock(PolarisPropertySourceManager.class);
+ }
+
+ @Primary
+ @Bean
+ public ContextRefresher contextRefresher() {
+ return mock(ContextRefresher.class);
+ }
+
+ @Component
+ protected static class TestBeanWithoutRefreshScope {
+
+ }
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/listener/PolarisConfigRefreshOptimizationListenerTriggeredTest.java b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/listener/PolarisConfigRefreshOptimizationListenerTriggeredTest.java
new file mode 100644
index 000000000..e62937326
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/listener/PolarisConfigRefreshOptimizationListenerTriggeredTest.java
@@ -0,0 +1,156 @@
+/*
+ * 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.config.listener;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+import com.tencent.cloud.polaris.config.adapter.MockedConfigKVFile;
+import com.tencent.cloud.polaris.config.adapter.PolarisPropertySource;
+import com.tencent.cloud.polaris.config.adapter.PolarisPropertySourceManager;
+import com.tencent.cloud.polaris.config.adapter.PolarisRefreshEntireContextRefresher;
+import com.tencent.cloud.polaris.config.config.PolarisConfigProperties;
+import com.tencent.cloud.polaris.config.enums.RefreshType;
+import com.tencent.polaris.configuration.api.core.ChangeType;
+import com.tencent.polaris.configuration.api.core.ConfigKVFileChangeEvent;
+import com.tencent.polaris.configuration.api.core.ConfigPropertyChangeInfo;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mockito;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.cloud.context.refresh.ContextRefresher;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.stereotype.Component;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import static com.tencent.cloud.polaris.config.condition.ReflectRefreshTypeCondition.POLARIS_CONFIG_REFRESH_TYPE;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT;
+
+/**
+ * test for {@link PolarisConfigRefreshOptimizationListener}.
+ */
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(webEnvironment = DEFINED_PORT, classes = PolarisConfigRefreshOptimizationListenerTriggeredTest.TestApplication.class,
+ properties = {
+ "server.port=8081",
+ "spring.cloud.polaris.address=grpc://127.0.0.1:10081",
+ "spring.cloud.polaris.config.connect-remote-server=false",
+ "spring.cloud.polaris.config.refresh-type=reflect",
+ "spring.config.location = classpath:application-test.yml"
+ })
+public class PolarisConfigRefreshOptimizationListenerTriggeredTest {
+
+ private static final String REFRESH_CONTEXT_REFRESHER_BEAN_NAME = "polarisRefreshContextPropertySourceAutoRefresher";
+
+ private static final String TEST_NAMESPACE = "testNamespace";
+
+ private static final String TEST_SERVICE_NAME = "testServiceName";
+
+ private static final String TEST_FILE_NAME = "application.properties";
+
+ @Autowired
+ private ConfigurableApplicationContext context;
+
+ @Test
+ public void testSwitchConfigRefreshType() {
+ RefreshType actualRefreshType = context.getEnvironment()
+ .getProperty(POLARIS_CONFIG_REFRESH_TYPE, RefreshType.class);
+ assertThat(actualRefreshType).isEqualTo(RefreshType.REFRESH_CONTEXT);
+ PolarisConfigProperties polarisConfigProperties = context.getBean(PolarisConfigProperties.class);
+ assertThat(polarisConfigProperties.getRefreshType()).isEqualTo(RefreshType.REFRESH_CONTEXT);
+ assertThat(context.containsBean(REFRESH_CONTEXT_REFRESHER_BEAN_NAME)).isTrue();
+ PolarisRefreshEntireContextRefresher refresher = context
+ .getBean(REFRESH_CONTEXT_REFRESHER_BEAN_NAME, PolarisRefreshEntireContextRefresher.class);
+ assertThat(((AbstractApplicationContext) context).getApplicationListeners().contains(refresher)).isTrue();
+ }
+
+ @Test
+ public void testConfigFileChanged() {
+ Map content = new HashMap<>();
+ content.put("k1", "v1");
+ content.put("k2", "v2");
+ content.put("k3", "v3");
+ MockedConfigKVFile file = new MockedConfigKVFile(content);
+
+ PolarisPropertySource polarisPropertySource = new PolarisPropertySource(TEST_NAMESPACE, TEST_SERVICE_NAME, TEST_FILE_NAME,
+ file, content);
+ PolarisPropertySourceManager manager = context.getBean(PolarisPropertySourceManager.class);
+ when(manager.getAllPropertySources()).thenReturn(Lists.newArrayList(polarisPropertySource));
+
+ PolarisRefreshEntireContextRefresher refresher = context.getBean(PolarisRefreshEntireContextRefresher.class);
+ PolarisRefreshEntireContextRefresher spyRefresher = Mockito.spy(refresher);
+
+ spyRefresher.onApplicationEvent(null);
+
+ ConfigPropertyChangeInfo changeInfo = new ConfigPropertyChangeInfo("k1", "v1", "v11", ChangeType.MODIFIED);
+ ConfigPropertyChangeInfo changeInfo2 = new ConfigPropertyChangeInfo("k4", null, "v4", ChangeType.ADDED);
+ ConfigPropertyChangeInfo changeInfo3 = new ConfigPropertyChangeInfo("k2", "v2", null, ChangeType.DELETED);
+ Map changeInfos = new HashMap<>();
+ changeInfos.put("k1", changeInfo);
+ changeInfos.put("k2", changeInfo3);
+ changeInfos.put("k4", changeInfo2);
+ ConfigKVFileChangeEvent event = new ConfigKVFileChangeEvent(changeInfos);
+ file.fireChangeListener(event);
+
+ ContextRefresher mockContextRefresher = context.getBean(ContextRefresher.class);
+ when(mockContextRefresher.refresh()).thenReturn(event.changedKeys());
+
+ Mockito.verify(spyRefresher, Mockito.times(1))
+ .refreshSpringValue("k1");
+ Mockito.verify(spyRefresher, Mockito.times(1))
+ .refreshSpringValue("k2");
+ Mockito.verify(spyRefresher, Mockito.times(1))
+ .refreshSpringValue("k4");
+ Mockito.verify(spyRefresher, Mockito.times(1))
+ .refreshConfigurationProperties(event.changedKeys());
+ }
+
+ @SpringBootApplication
+ protected static class TestApplication {
+
+ @Primary
+ @Bean
+ public PolarisPropertySourceManager polarisPropertySourceManager() {
+ return mock(PolarisPropertySourceManager.class);
+ }
+
+ @Primary
+ @Bean
+ public ContextRefresher contextRefresher() {
+ return mock(ContextRefresher.class);
+ }
+
+ @Component
+ @RefreshScope
+ protected static class TestBeanWithRefreshScope {
+
+ }
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfiguration.java
index 258ba7799..8d4a751b6 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfiguration.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfiguration.java
@@ -18,14 +18,12 @@
package com.tencent.cloud.polaris;
import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler;
import com.tencent.cloud.polaris.extend.consul.ConsulConfigModifier;
import com.tencent.cloud.polaris.extend.consul.ConsulContextProperties;
import com.tencent.cloud.polaris.extend.nacos.NacosConfigModifier;
import com.tencent.cloud.polaris.extend.nacos.NacosContextProperties;
-import com.tencent.polaris.api.core.ConsumerAPI;
-import com.tencent.polaris.api.core.ProviderAPI;
-import com.tencent.polaris.client.api.SDKContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -46,9 +44,8 @@ public class DiscoveryPropertiesAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public PolarisDiscoveryHandler polarisDiscoveryHandler(PolarisDiscoveryProperties polarisDiscoveryProperties,
- ProviderAPI providerAPI, SDKContext sdkContext,
- ConsumerAPI polarisConsumer) {
- return new PolarisDiscoveryHandler(polarisDiscoveryProperties, providerAPI, sdkContext, polarisConsumer);
+ PolarisSDKContextManager polarisSDKContextManager) {
+ return new PolarisDiscoveryHandler(polarisDiscoveryProperties, polarisSDKContextManager);
}
@Bean
@@ -65,13 +62,13 @@ public class DiscoveryPropertiesAutoConfiguration {
@Bean
@ConditionalOnMissingBean
- public NacosConfigModifier nacosConfigModifier(@Autowired(required = false) NacosContextProperties nacosContextProperties) {
- return new NacosConfigModifier(nacosContextProperties);
+ public PolarisDiscoveryConfigModifier polarisDiscoveryConfigModifier(PolarisDiscoveryProperties polarisDiscoveryProperties) {
+ return new PolarisDiscoveryConfigModifier(polarisDiscoveryProperties);
}
@Bean
@ConditionalOnMissingBean
- public PolarisDiscoveryConfigModifier polarisDiscoveryConfigModifier(PolarisDiscoveryProperties polarisDiscoveryProperties) {
- return new PolarisDiscoveryConfigModifier(polarisDiscoveryProperties);
+ public NacosConfigModifier nacosConfigModifier(@Autowired(required = false) NacosContextProperties nacosContextProperties) {
+ return new NacosConfigModifier(nacosContextProperties);
}
}
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisDiscoveryProperties.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisDiscoveryProperties.java
index ea480d406..3f83bfd44 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisDiscoveryProperties.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisDiscoveryProperties.java
@@ -45,6 +45,11 @@ public class PolarisDiscoveryProperties {
@Value("${spring.cloud.polaris.discovery.service:${spring.cloud.polaris.service:${spring.application.name:}}}")
private String service;
+ /**
+ * Service instance id.
+ */
+ private String instanceId;
+
/**
* The polaris authentication token.
*/
@@ -96,6 +101,14 @@ public class PolarisDiscoveryProperties {
*/
private Long serviceListRefreshInterval = 60000L;
+ public String getInstanceId() {
+ return instanceId;
+ }
+
+ public void setInstanceId(String instanceId) {
+ this.instanceId = instanceId;
+ }
+
public String getNamespace() {
return namespace;
}
@@ -204,6 +217,7 @@ public class PolarisDiscoveryProperties {
return "PolarisDiscoveryProperties{" +
"namespace='" + namespace + '\'' +
", service='" + service + '\'' +
+ ", instanceId='" + instanceId + '\'' +
", token='" + token + '\'' +
", weight=" + weight +
", version='" + version + '\'' +
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandler.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandler.java
index 688562d76..cce659d14 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandler.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandler.java
@@ -19,14 +19,13 @@
package com.tencent.cloud.polaris.discovery;
import com.tencent.cloud.polaris.PolarisDiscoveryProperties;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.polaris.api.core.ConsumerAPI;
-import com.tencent.polaris.api.core.ProviderAPI;
import com.tencent.polaris.api.rpc.GetAllInstancesRequest;
import com.tencent.polaris.api.rpc.GetHealthyInstancesRequest;
import com.tencent.polaris.api.rpc.GetServicesRequest;
import com.tencent.polaris.api.rpc.InstancesResponse;
import com.tencent.polaris.api.rpc.ServicesResponse;
-import com.tencent.polaris.client.api.SDKContext;
/**
* Discovery Handler for Polaris.
@@ -37,18 +36,12 @@ public class PolarisDiscoveryHandler {
private final PolarisDiscoveryProperties polarisDiscoveryProperties;
- private final ProviderAPI providerAPI;
-
- private final SDKContext sdkContext;
-
private final ConsumerAPI polarisConsumer;
public PolarisDiscoveryHandler(PolarisDiscoveryProperties polarisDiscoveryProperties,
- ProviderAPI providerAPI, SDKContext sdkContext, ConsumerAPI polarisConsumer) {
+ PolarisSDKContextManager polarisSDKContextManager) {
this.polarisDiscoveryProperties = polarisDiscoveryProperties;
- this.providerAPI = providerAPI;
- this.sdkContext = sdkContext;
- this.polarisConsumer = polarisConsumer;
+ this.polarisConsumer = polarisSDKContextManager.getConsumerAPI();
}
/**
@@ -75,15 +68,7 @@ public class PolarisDiscoveryHandler {
GetAllInstancesRequest request = new GetAllInstancesRequest();
request.setNamespace(namespace);
request.setService(service);
- return polarisConsumer.getAllInstance(request);
- }
-
- public ProviderAPI getProviderAPI() {
- return providerAPI;
- }
-
- public SDKContext getSdkContext() {
- return sdkContext;
+ return polarisConsumer.getAllInstances(request);
}
/**
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClient.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClient.java
index 09f50f2a7..70140f1bc 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClient.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClient.java
@@ -48,7 +48,7 @@ public class PolarisReactiveDiscoveryClient implements ReactiveDiscoveryClient {
@Override
public String description() {
- return "Spring Cloud Tencent Polaris Reactive Discovery Client.";
+ return "Spring Cloud Tencent Polaris Reactive Discovery Client";
}
@Override
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClientConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClientConfiguration.java
index 2f3d8e201..47302b50c 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClientConfiguration.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClientConfiguration.java
@@ -22,23 +22,28 @@ import com.tencent.cloud.polaris.discovery.PolarisServiceDiscovery;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.client.ConditionalOnDiscoveryHealthIndicatorEnabled;
import org.springframework.cloud.client.ConditionalOnReactiveDiscoveryEnabled;
import org.springframework.cloud.client.ReactiveCommonsClientAutoConfiguration;
import org.springframework.cloud.client.discovery.composite.reactive.ReactiveCompositeDiscoveryClientAutoConfiguration;
+import org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIndicatorProperties;
+import org.springframework.cloud.client.discovery.health.reactive.ReactiveDiscoveryClientHealthIndicator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Reactive Discovery Client Configuration for Polaris.
*
- * @author Haotian Zhang, Andrew Shan, Jie Cheng
+ * @author Haotian Zhang, Andrew Shan, Jie Cheng, youta
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnReactiveDiscoveryEnabled
-@AutoConfigureAfter({ PolarisDiscoveryAutoConfiguration.class,
- ReactiveCompositeDiscoveryClientAutoConfiguration.class })
-@AutoConfigureBefore({ ReactiveCommonsClientAutoConfiguration.class })
+@EnableConfigurationProperties(DiscoveryClientHealthIndicatorProperties.class)
+@AutoConfigureAfter({PolarisDiscoveryAutoConfiguration.class, ReactiveCompositeDiscoveryClientAutoConfiguration.class})
+@AutoConfigureBefore({ReactiveCommonsClientAutoConfiguration.class})
public class PolarisReactiveDiscoveryClientConfiguration {
@Bean
@@ -47,4 +52,12 @@ public class PolarisReactiveDiscoveryClientConfiguration {
PolarisServiceDiscovery polarisServiceDiscovery) {
return new PolarisReactiveDiscoveryClient(polarisServiceDiscovery);
}
+
+ @Bean
+ @ConditionalOnClass(name = "org.springframework.boot.actuate.health.ReactiveHealthIndicator")
+ @ConditionalOnDiscoveryHealthIndicatorEnabled
+ public ReactiveDiscoveryClientHealthIndicator polarisReactiveDiscoveryClientHealthIndicator(
+ PolarisReactiveDiscoveryClient client, DiscoveryClientHealthIndicatorProperties properties) {
+ return new ReactiveDiscoveryClientHealthIndicator(client, properties);
+ }
}
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 cab572985..6bbe9b2db 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
@@ -21,7 +21,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
-import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.polaris.client.util.NamedThreadFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -45,14 +45,14 @@ public class PolarisRefreshApplicationReadyEventListener
private static final Logger LOG = LoggerFactory.getLogger(PolarisRefreshApplicationReadyEventListener.class);
private static final int DELAY = 60;
- private final PolarisDiscoveryHandler polarisDiscoveryHandler;
+ private final PolarisSDKContextManager polarisSDKContextManager;
private final PolarisServiceStatusChangeListener polarisServiceStatusChangeListener;
private final ScheduledExecutorService refreshExecutor;
private ApplicationEventPublisher publisher;
- public PolarisRefreshApplicationReadyEventListener(PolarisDiscoveryHandler polarisDiscoveryHandler,
+ public PolarisRefreshApplicationReadyEventListener(PolarisSDKContextManager polarisSDKContextManager,
PolarisServiceStatusChangeListener polarisServiceStatusChangeListener) {
- this.polarisDiscoveryHandler = polarisDiscoveryHandler;
+ this.polarisSDKContextManager = polarisSDKContextManager;
this.polarisServiceStatusChangeListener = polarisServiceStatusChangeListener;
this.refreshExecutor = Executors.newSingleThreadScheduledExecutor(
new NamedThreadFactory("polaris-service-refresh"));
@@ -61,7 +61,7 @@ public class PolarisRefreshApplicationReadyEventListener
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
// Register service change listener.
- polarisDiscoveryHandler.getSdkContext().getExtensions().getLocalRegistry()
+ polarisSDKContextManager.getSDKContext().getExtensions().getLocalRegistry()
.registerResourceListener(polarisServiceStatusChangeListener);
// Begin scheduled refresh thread.
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/refresh/PolarisRefreshConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/refresh/PolarisRefreshConfiguration.java
index c0523fa51..d8abf683c 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/refresh/PolarisRefreshConfiguration.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/refresh/PolarisRefreshConfiguration.java
@@ -18,7 +18,7 @@
package com.tencent.cloud.polaris.discovery.refresh;
import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled;
-import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
@@ -42,8 +42,8 @@ public class PolarisRefreshConfiguration {
@Bean
@ConditionalOnMissingBean
public PolarisRefreshApplicationReadyEventListener polarisServiceStatusApplicationReadyEventListener(
- PolarisDiscoveryHandler polarisDiscoveryHandler,
+ PolarisSDKContextManager polarisSDKContextManager,
PolarisServiceStatusChangeListener polarisServiceStatusChangeListener) {
- return new PolarisRefreshApplicationReadyEventListener(polarisDiscoveryHandler, polarisServiceStatusChangeListener);
+ return new PolarisRefreshApplicationReadyEventListener(polarisSDKContextManager, polarisServiceStatusChangeListener);
}
}
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisAutoServiceRegistration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisAutoServiceRegistration.java
index 772956882..ade24e792 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisAutoServiceRegistration.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisAutoServiceRegistration.java
@@ -17,6 +17,10 @@
package com.tencent.cloud.polaris.registry;
+import com.tencent.cloud.common.metadata.MetadataContext;
+import com.tencent.cloud.polaris.PolarisDiscoveryProperties;
+import com.tencent.polaris.api.pojo.ServiceKey;
+import com.tencent.polaris.assembly.api.AssemblyAPI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -32,15 +36,25 @@ import org.springframework.util.StringUtils;
*/
public class PolarisAutoServiceRegistration extends AbstractAutoServiceRegistration {
- private static final Logger LOG = LoggerFactory.getLogger(PolarisAutoServiceRegistration.class);
+ private static final Logger log = LoggerFactory.getLogger(PolarisAutoServiceRegistration.class);
private final PolarisRegistration registration;
- public PolarisAutoServiceRegistration(ServiceRegistry serviceRegistry,
+ private final PolarisDiscoveryProperties polarisDiscoveryProperties;
+
+ private final AssemblyAPI assemblyAPI;
+
+ public PolarisAutoServiceRegistration(
+ ServiceRegistry serviceRegistry,
AutoServiceRegistrationProperties autoServiceRegistrationProperties,
- PolarisRegistration registration) {
+ PolarisRegistration registration,
+ PolarisDiscoveryProperties polarisDiscoveryProperties,
+ AssemblyAPI assemblyAPI
+ ) {
super(serviceRegistry, autoServiceRegistrationProperties);
this.registration = registration;
+ this.polarisDiscoveryProperties = polarisDiscoveryProperties;
+ this.assemblyAPI = assemblyAPI;
}
@Override
@@ -56,9 +70,12 @@ public class PolarisAutoServiceRegistration extends AbstractAutoServiceRegistrat
@Override
protected void register() {
if (!this.registration.isRegisterEnabled()) {
- LOG.debug("Registration disabled.");
+ log.debug("Registration disabled.");
return;
}
+ if (assemblyAPI != null) {
+ assemblyAPI.initService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, MetadataContext.LOCAL_SERVICE));
+ }
super.register();
}
@@ -73,7 +90,7 @@ public class PolarisAutoServiceRegistration extends AbstractAutoServiceRegistrat
@Override
protected Object getConfiguration() {
- return this.registration.getPolarisProperties();
+ return this.polarisDiscoveryProperties;
}
@Override
@@ -84,7 +101,7 @@ public class PolarisAutoServiceRegistration extends AbstractAutoServiceRegistrat
@Override
@SuppressWarnings("deprecation")
protected String getAppName() {
- String appName = registration.getPolarisProperties().getService();
+ String appName = registration.getServiceId();
return StringUtils.isEmpty(appName) ? super.getAppName() : appName;
}
}
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 a37b159ee..b0c33cce3 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
@@ -13,13 +13,13 @@
* 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.net.URI;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -55,24 +55,18 @@ public class PolarisRegistration implements Registration {
private final PolarisDiscoveryProperties polarisDiscoveryProperties;
- private final ConsulContextProperties consulContextProperties;
-
private final SDKContext polarisContext;
private final StaticMetadataManager staticMetadataManager;
- private final NacosContextProperties nacosContextProperties;
-
+ private final String serviceId;
+ private final String host;
+ private final boolean isSecure;
private final ServletWebServerApplicationContext servletWebServerApplicationContext;
-
private final ReactiveWebServerApplicationContext reactiveWebServerApplicationContext;
-
+ private boolean registerEnabled = false;
private Map metadata;
-
- private String host;
-
private int port;
-
private String instanceId;
public PolarisRegistration(
@@ -84,32 +78,95 @@ public class PolarisRegistration implements Registration {
@Nullable ServletWebServerApplicationContext servletWebServerApplicationContext,
@Nullable ReactiveWebServerApplicationContext reactiveWebServerApplicationContext) {
this.polarisDiscoveryProperties = polarisDiscoveryProperties;
- this.consulContextProperties = consulContextProperties;
this.polarisContext = context;
this.staticMetadataManager = staticMetadataManager;
- this.nacosContextProperties = nacosContextProperties;
this.servletWebServerApplicationContext = servletWebServerApplicationContext;
this.reactiveWebServerApplicationContext = reactiveWebServerApplicationContext;
- host = polarisContext.getConfig().getGlobal().getAPI().getBindIP();
- if (polarisContextProperties != null) {
- port = polarisContextProperties.getLocalPort();
- }
- }
- @Override
- public String getServiceId() {
+ // generate serviceId
if (Objects.isNull(nacosContextProperties)) {
- return polarisDiscoveryProperties.getService();
+ serviceId = polarisDiscoveryProperties.getService();
}
else {
String group = nacosContextProperties.getGroup();
if (StringUtils.isNotBlank(group) && !DEFAULT_GROUP.equals(group)) {
- return String.format(GROUP_SERVER_ID_FORMAT, group, polarisDiscoveryProperties.getService());
+ serviceId = String.format(GROUP_SERVER_ID_FORMAT, group, polarisDiscoveryProperties.getService());
}
else {
- return polarisDiscoveryProperties.getService();
+ serviceId = polarisDiscoveryProperties.getService();
}
}
+
+ // generate host
+ host = polarisContext.getConfig().getGlobal().getAPI().getBindIP();
+
+ // generate port
+ if (polarisContextProperties != null) {
+ port = polarisContextProperties.getLocalPort();
+ }
+
+ // generate isSecure
+ isSecure = StringUtils.equalsIgnoreCase(polarisDiscoveryProperties.getProtocol(), "https");
+
+ // generate metadata
+ if (CollectionUtils.isEmpty(metadata)) {
+ Map instanceMetadata = new HashMap<>();
+
+ // put internal metadata
+ instanceMetadata.put(METADATA_KEY_IP, host);
+ instanceMetadata.put(METADATA_KEY_ADDRESS, host + ":" + port);
+
+ // put internal-nacos-cluster if necessary
+ if (Objects.nonNull(nacosContextProperties)) {
+ String clusterName = nacosContextProperties.getClusterName();
+ if (StringUtils.isNotBlank(clusterName) && !DEFAULT_CLUSTER.equals(clusterName)) {
+ instanceMetadata.put(NACOS_CLUSTER, clusterName);
+ }
+ }
+
+ instanceMetadata.putAll(staticMetadataManager.getMergedStaticMetadata());
+
+ this.metadata = instanceMetadata;
+ }
+
+ // generate registerEnabled
+ if (null != polarisDiscoveryProperties) {
+ registerEnabled = polarisDiscoveryProperties.isRegisterEnabled();
+ }
+ if (null != consulContextProperties && consulContextProperties.isEnabled()) {
+ registerEnabled |= consulContextProperties.isRegister();
+ }
+ if (null != nacosContextProperties && nacosContextProperties.isEnabled()) {
+ registerEnabled |= nacosContextProperties.isRegisterEnabled();
+ }
+ }
+
+ public static PolarisRegistration registration(PolarisDiscoveryProperties polarisDiscoveryProperties,
+ @Nullable PolarisContextProperties polarisContextProperties,
+ @Nullable ConsulContextProperties consulContextProperties,
+ SDKContext context, StaticMetadataManager staticMetadataManager,
+ @Nullable NacosContextProperties nacosContextProperties,
+ @Nullable ServletWebServerApplicationContext servletWebServerApplicationContext,
+ @Nullable ReactiveWebServerApplicationContext reactiveWebServerApplicationContext,
+ @Nullable List registrationCustomizers) {
+ PolarisRegistration polarisRegistration = new PolarisRegistration(polarisDiscoveryProperties,
+ polarisContextProperties, consulContextProperties, context, staticMetadataManager,
+ nacosContextProperties, servletWebServerApplicationContext, reactiveWebServerApplicationContext);
+ customize(registrationCustomizers, polarisRegistration);
+ return polarisRegistration;
+ }
+
+ public static void customize(List registrationCustomizers, PolarisRegistration registration) {
+ if (registrationCustomizers != null) {
+ for (PolarisRegistrationCustomizer customizer : registrationCustomizers) {
+ customizer.customize(registration);
+ }
+ }
+ }
+
+ @Override
+ public String getServiceId() {
+ return serviceId;
}
@Override
@@ -139,7 +196,7 @@ public class PolarisRegistration implements Registration {
@Override
public boolean isSecure() {
- return StringUtils.equalsIgnoreCase(polarisDiscoveryProperties.getProtocol(), "https");
+ return isSecure;
}
@Override
@@ -149,30 +206,9 @@ public class PolarisRegistration implements Registration {
@Override
public Map getMetadata() {
- if (CollectionUtils.isEmpty(metadata)) {
- Map instanceMetadata = new HashMap<>();
-
- // put internal metadata
- instanceMetadata.put(METADATA_KEY_IP, host);
- instanceMetadata.put(METADATA_KEY_ADDRESS, host + ":" + port);
-
- // put internal-nacos-cluster if necessary
- String clusterName = nacosContextProperties.getClusterName();
- if (StringUtils.isNotBlank(clusterName) && !DEFAULT_CLUSTER.equals(clusterName)) {
- instanceMetadata.put(NACOS_CLUSTER, clusterName);
- }
-
- instanceMetadata.putAll(staticMetadataManager.getMergedStaticMetadata());
-
- this.metadata = instanceMetadata;
- }
return metadata;
}
- public PolarisDiscoveryProperties getPolarisProperties() {
- return polarisDiscoveryProperties;
- }
-
@Override
public String getInstanceId() {
return instanceId;
@@ -183,18 +219,6 @@ public class PolarisRegistration implements Registration {
}
public boolean isRegisterEnabled() {
-
- boolean registerEnabled = false;
-
- if (null != polarisDiscoveryProperties) {
- registerEnabled = polarisDiscoveryProperties.isRegisterEnabled();
- }
- if (null != consulContextProperties && consulContextProperties.isEnabled()) {
- registerEnabled |= consulContextProperties.isRegister();
- }
- if (null != nacosContextProperties && nacosContextProperties.isEnabled()) {
- registerEnabled |= nacosContextProperties.isRegisterEnabled();
- }
return registerEnabled;
}
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistrationCustomizer.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistrationCustomizer.java
new file mode 100644
index 000000000..76df55f47
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistrationCustomizer.java
@@ -0,0 +1,27 @@
+/*
+ * 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;
+
+/**
+ * Customizer for {@link PolarisRegistration}.
+ *
+ * @author Haotian Zhang
+ */
+public interface PolarisRegistrationCustomizer {
+ void customize(PolarisRegistration registration);
+}
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 e320ed531..87509c641 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
@@ -26,6 +26,7 @@ import java.util.concurrent.ScheduledExecutorService;
import com.tencent.cloud.common.metadata.StaticMetadataManager;
import com.tencent.cloud.polaris.PolarisDiscoveryProperties;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler;
import com.tencent.cloud.polaris.util.OkHttpUtil;
import com.tencent.cloud.rpc.enhancement.stat.config.PolarisStatProperties;
@@ -33,6 +34,7 @@ import com.tencent.polaris.api.config.global.StatReporterConfig;
import com.tencent.polaris.api.core.ProviderAPI;
import com.tencent.polaris.api.exception.PolarisException;
import com.tencent.polaris.api.plugin.common.PluginTypes;
+import com.tencent.polaris.api.plugin.stat.ReporterMetaInfo;
import com.tencent.polaris.api.plugin.stat.StatReporter;
import com.tencent.polaris.api.pojo.Instance;
import com.tencent.polaris.api.rpc.InstanceDeregisterRequest;
@@ -47,6 +49,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.DisposableBean;
import org.springframework.cloud.client.serviceregistry.ServiceRegistry;
import org.springframework.http.HttpHeaders;
@@ -58,24 +61,25 @@ import static org.springframework.util.ReflectionUtils.rethrowRuntimeException;
*
* @author Haotian Zhang, Andrew Shan, Jie Cheng, changjin wei(魏昌进)
*/
-public class PolarisServiceRegistry implements ServiceRegistry {
+public class PolarisServiceRegistry implements ServiceRegistry, DisposableBean {
private static final Logger LOGGER = LoggerFactory.getLogger(PolarisServiceRegistry.class);
private final PolarisDiscoveryProperties polarisDiscoveryProperties;
+ private final PolarisSDKContextManager polarisSDKContextManager;
+
private final PolarisDiscoveryHandler polarisDiscoveryHandler;
private final StaticMetadataManager staticMetadataManager;
-
- private final ScheduledExecutorService heartbeatExecutor;
-
private final PolarisStatProperties polarisStatProperties;
+ private final ScheduledExecutorService heartbeatExecutor;
public PolarisServiceRegistry(PolarisDiscoveryProperties polarisDiscoveryProperties,
- PolarisDiscoveryHandler polarisDiscoveryHandler,
+ PolarisSDKContextManager polarisSDKContextManager, PolarisDiscoveryHandler polarisDiscoveryHandler,
StaticMetadataManager staticMetadataManager, PolarisStatProperties polarisStatProperties) {
this.polarisDiscoveryProperties = polarisDiscoveryProperties;
+ this.polarisSDKContextManager = polarisSDKContextManager;
this.polarisDiscoveryHandler = polarisDiscoveryHandler;
this.staticMetadataManager = staticMetadataManager;
@@ -113,8 +117,9 @@ public class PolarisServiceRegistry implements ServiceRegistry registrationCustomizers) {
+ return PolarisRegistration.registration(polarisDiscoveryProperties, polarisContextProperties, consulContextProperties,
+ polarisSDKContextManager.getSDKContext(), staticMetadataManager, nacosContextProperties,
+ servletWebServerApplicationContext, reactiveWebServerApplicationContext, registrationCustomizers);
}
@Bean
@@ -82,8 +85,12 @@ public class PolarisServiceRegistryAutoConfiguration {
public PolarisAutoServiceRegistration polarisAutoServiceRegistration(
PolarisServiceRegistry registry,
AutoServiceRegistrationProperties autoServiceRegistrationProperties,
- PolarisRegistration registration) {
- return new PolarisAutoServiceRegistration(registry, autoServiceRegistrationProperties, registration);
+ PolarisRegistration registration,
+ PolarisDiscoveryProperties polarisDiscoveryProperties,
+ PolarisSDKContextManager polarisSDKContextManager
+ ) {
+ return new PolarisAutoServiceRegistration(registry, autoServiceRegistrationProperties, registration,
+ polarisDiscoveryProperties, polarisSDKContextManager.getAssemblyAPI());
}
@Bean
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfigurationTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfigurationTest.java
index 5fde947d1..d77e36c6f 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfigurationTest.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfigurationTest.java
@@ -20,8 +20,6 @@ package com.tencent.cloud.polaris;
import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler;
import com.tencent.cloud.polaris.extend.consul.ConsulContextProperties;
-import com.tencent.polaris.api.core.ConsumerAPI;
-import com.tencent.polaris.api.core.ProviderAPI;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -48,8 +46,6 @@ public class DiscoveryPropertiesAutoConfigurationTest {
assertThat(context).hasSingleBean(DiscoveryPropertiesAutoConfiguration.class);
assertThat(context).hasSingleBean(PolarisDiscoveryProperties.class);
assertThat(context).hasSingleBean(ConsulContextProperties.class);
- assertThat(context).hasSingleBean(ProviderAPI.class);
- assertThat(context).hasSingleBean(ConsumerAPI.class);
assertThat(context).hasSingleBean(PolarisDiscoveryHandler.class);
assertThat(context).hasSingleBean(DiscoveryConfigModifier.class);
});
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/PolarisDiscoveryPropertiesTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/PolarisDiscoveryPropertiesTest.java
index 5e7b958a4..1a5e875dc 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/PolarisDiscoveryPropertiesTest.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/PolarisDiscoveryPropertiesTest.java
@@ -85,10 +85,15 @@ public class PolarisDiscoveryPropertiesTest {
polarisDiscoveryProperties.setServiceListRefreshInterval(1000L);
assertThat(polarisDiscoveryProperties.getServiceListRefreshInterval()).isEqualTo(1000L);
+ // InstanceId
+ polarisDiscoveryProperties.setInstanceId("test-ins-id");
+ assertThat(polarisDiscoveryProperties.getInstanceId()).isEqualTo("test-ins-id");
+
assertThat(polarisDiscoveryProperties.toString())
.isEqualTo("PolarisDiscoveryProperties{"
+ "namespace='Test'"
+ ", service='java_provider_test'"
+ + ", instanceId='test-ins-id'"
+ ", token='19485a7674294e3c88dba293373c1534'"
+ ", weight=10, version='1.0.0'"
+ ", protocol='HTTP'"
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryAutoConfigurationTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryAutoConfigurationTest.java
index 53cc72930..895fd05a8 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryAutoConfigurationTest.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryAutoConfigurationTest.java
@@ -19,12 +19,12 @@
package com.tencent.cloud.polaris.discovery;
import com.tencent.cloud.polaris.PolarisDiscoveryProperties;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
-import com.tencent.polaris.api.core.ConsumerAPI;
-import com.tencent.polaris.api.core.ProviderAPI;
import com.tencent.polaris.test.mock.discovery.NamingServer;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -49,8 +49,7 @@ public class PolarisDiscoveryAutoConfigurationTest {
.withConfiguration(AutoConfigurations.of(
PolarisContextAutoConfiguration.class,
PolarisDiscoveryAutoConfiguration.class,
- PolarisDiscoveryClientConfiguration.class,
- PolarisContextAutoConfiguration.class))
+ PolarisDiscoveryClientConfiguration.class))
.withPropertyValues("spring.application.name=" + SERVICE_PROVIDER)
.withPropertyValues("server.port=" + PORT)
.withPropertyValues("spring.cloud.polaris.address=grpc://127.0.0.1:10081");
@@ -67,11 +66,14 @@ public class PolarisDiscoveryAutoConfigurationTest {
}
}
+ @BeforeEach
+ void setUp() {
+ PolarisSDKContextManager.innerDestroy();
+ }
+
@Test
public void testDefaultInitialization() {
this.contextRunner.run(context -> {
- assertThat(context).hasSingleBean(ProviderAPI.class);
- assertThat(context).hasSingleBean(ConsumerAPI.class);
assertThat(context).hasSingleBean(PolarisDiscoveryProperties.class);
assertThat(context).hasSingleBean(PolarisServiceDiscovery.class);
});
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryClientConfigurationTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryClientConfigurationTest.java
index b53fce9f2..b33dc8c52 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryClientConfigurationTest.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryClientConfigurationTest.java
@@ -17,10 +17,12 @@
package com.tencent.cloud.polaris.discovery;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
import com.tencent.polaris.test.mock.discovery.NamingServer;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -62,6 +64,11 @@ public class PolarisDiscoveryClientConfigurationTest {
}
}
+ @BeforeEach
+ void setUp() {
+ PolarisSDKContextManager.innerDestroy();
+ }
+
@Test
public void testDefaultInitialization() {
this.contextRunner.run(context -> assertThat(context).hasSingleBean(PolarisDiscoveryClient.class));
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandlerTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandlerTest.java
new file mode 100644
index 000000000..821e366e9
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandlerTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.discovery;
+
+import com.tencent.cloud.polaris.PolarisDiscoveryProperties;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
+import com.tencent.polaris.api.core.ConsumerAPI;
+import com.tencent.polaris.api.exception.PolarisException;
+import com.tencent.polaris.api.rpc.ServicesResponse;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
+/**
+ * Test for {@link PolarisDiscoveryHandler}.
+ *
+ * @author Haotian Zhang
+ */
+@ExtendWith(MockitoExtension.class)
+public class PolarisDiscoveryHandlerTest {
+
+ private PolarisDiscoveryHandler polarisDiscoveryHandler;
+
+ @BeforeEach
+ void setUp() {
+ PolarisDiscoveryProperties polarisDiscoveryProperties = mock(PolarisDiscoveryProperties.class);
+ doReturn(NAMESPACE_TEST).when(polarisDiscoveryProperties).getNamespace();
+
+ ConsumerAPI consumerAPI = mock(ConsumerAPI.class);
+ ServicesResponse servicesResponse = mock(ServicesResponse.class);
+ doReturn(servicesResponse).when(consumerAPI).getServices(any());
+
+ PolarisSDKContextManager polarisSDKContextManager = mock(PolarisSDKContextManager.class);
+ doReturn(consumerAPI).when(polarisSDKContextManager).getConsumerAPI();
+ polarisDiscoveryHandler = new PolarisDiscoveryHandler(polarisDiscoveryProperties, polarisSDKContextManager);
+ }
+
+ @Test
+ public void testGetServices() throws PolarisException {
+ ServicesResponse servicesResponse = polarisDiscoveryHandler.getServices();
+ assertThat(servicesResponse).isNotNull();
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClientConfigurationTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClientConfigurationTest.java
index 138e2357e..3c0156cbc 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClientConfigurationTest.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClientConfigurationTest.java
@@ -17,11 +17,13 @@
package com.tencent.cloud.polaris.discovery.reactive;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
import com.tencent.cloud.polaris.discovery.PolarisDiscoveryClientConfiguration;
import com.tencent.polaris.test.mock.discovery.NamingServer;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -36,7 +38,7 @@ import static org.assertj.core.api.Assertions.assertThat;
/**
* Test for {@link PolarisReactiveDiscoveryClientConfiguration}.
*
- * @author Haotian Zhang
+ * @author Haotian Zhang, youta
*/
public class PolarisReactiveDiscoveryClientConfigurationTest {
@@ -65,12 +67,23 @@ public class PolarisReactiveDiscoveryClientConfigurationTest {
}
}
+ @BeforeEach
+ void setUp() {
+ PolarisSDKContextManager.innerDestroy();
+ }
+
@Test
public void testDefaultInitialization() {
this.contextRunner.run(context -> assertThat(context)
.hasSingleBean(PolarisReactiveDiscoveryClient.class));
}
+ @Test
+ public void shouldWorkWithDefaults() {
+ contextRunner.run(context -> assertThat(context).hasBean("polarisReactiveDiscoveryClientHealthIndicator"));
+ }
+
+
@Configuration
@EnableAutoConfiguration
static class PolarisReactiveDiscoveryClientConfiguration {
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClientTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClientTest.java
index e475c66bc..95724e79c 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClientTest.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/reactive/PolarisReactiveDiscoveryClientTest.java
@@ -99,6 +99,6 @@ public class PolarisReactiveDiscoveryClientTest {
@Test
public void testDescription() {
- assertThat(client.description()).isEqualTo("Spring Cloud Tencent Polaris Reactive Discovery Client.");
+ assertThat(client.description()).isEqualTo("Spring Cloud Tencent Polaris Reactive Discovery Client");
}
}
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/endpoint/PolarisDiscoveryEndpointTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/endpoint/PolarisDiscoveryEndpointTest.java
index 14152df62..dc9b41d9d 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/endpoint/PolarisDiscoveryEndpointTest.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/endpoint/PolarisDiscoveryEndpointTest.java
@@ -16,9 +16,11 @@
*/
package com.tencent.cloud.polaris.endpoint;
+import java.util.Collections;
import java.util.Map;
import com.tencent.cloud.polaris.PolarisDiscoveryProperties;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.cloud.polaris.discovery.PolarisDiscoveryAutoConfiguration;
import com.tencent.cloud.polaris.discovery.PolarisDiscoveryClient;
import com.tencent.cloud.polaris.discovery.PolarisDiscoveryClientConfiguration;
@@ -26,6 +28,7 @@ import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler;
import com.tencent.polaris.test.mock.discovery.NamingServer;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -38,6 +41,8 @@ import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST;
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 polaris discovery endpoint.
@@ -48,7 +53,7 @@ public class PolarisDiscoveryEndpointTest {
private static NamingServer namingServer;
- private WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
+ private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(
PolarisPropertiesConfiguration.class,
PolarisDiscoveryClientConfiguration.class,
@@ -72,6 +77,11 @@ public class PolarisDiscoveryEndpointTest {
}
}
+ @BeforeEach
+ void setUp() {
+ PolarisSDKContextManager.innerDestroy();
+ }
+
@Test
public void testPolarisDiscoveryEndpoint() {
this.contextRunner.run(context -> {
@@ -79,12 +89,17 @@ public class PolarisDiscoveryEndpointTest {
.getBean(PolarisDiscoveryProperties.class);
DiscoveryClient discoveryClient = context
.getBean(PolarisDiscoveryClient.class);
+
PolarisDiscoveryHandler polarisDiscoveryHandler = context.getBean(PolarisDiscoveryHandler.class);
PolarisDiscoveryEndpoint polarisDiscoveryEndpoint = new PolarisDiscoveryEndpoint(polarisDiscoveryProperties, discoveryClient, polarisDiscoveryHandler);
-
Map mapInfo = polarisDiscoveryEndpoint.polarisDiscovery("java_provider_test");
-
assertThat(polarisDiscoveryProperties).isEqualTo(mapInfo.get("PolarisDiscoveryProperties"));
+
+ DiscoveryClient discoveryClient1 = mock(DiscoveryClient.class);
+ doReturn(Collections.singletonList("xx")).when(discoveryClient1).getServices();
+ PolarisDiscoveryEndpoint polarisDiscoveryEndpoint1 = new PolarisDiscoveryEndpoint(polarisDiscoveryProperties, discoveryClient1, polarisDiscoveryHandler);
+ Map mapInfo2 = polarisDiscoveryEndpoint1.polarisDiscovery(null);
+ assertThat(polarisDiscoveryProperties).isEqualTo(mapInfo2.get("PolarisDiscoveryProperties"));
});
}
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 ec5580159..1d545b4e5 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,8 +20,9 @@ package com.tencent.cloud.polaris.extend.consul;
import java.util.List;
import java.util.Map;
-import com.tencent.polaris.client.api.SDKContext;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.polaris.factory.config.global.ServerConnectorConfigImpl;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -53,7 +54,12 @@ public class ConsulContextPropertiesTest {
private ConsulContextProperties consulContextProperties;
@Autowired
- private SDKContext sdkContext;
+ private PolarisSDKContextManager polarisSDKContextManager;
+
+ @BeforeEach
+ void setUp() {
+ PolarisSDKContextManager.innerDestroy();
+ }
@Test
public void testDefaultInitialization() {
@@ -67,8 +73,9 @@ public class ConsulContextPropertiesTest {
@Test
public void testModify() {
- assertThat(sdkContext).isNotNull();
- com.tencent.polaris.api.config.Configuration configuration = sdkContext.getConfig();
+ assertThat(polarisSDKContextManager).isNotNull();
+ com.tencent.polaris.api.config.Configuration configuration = polarisSDKContextManager.getSDKContext()
+ .getConfig();
List serverConnectorConfigs = configuration.getGlobal().getServerConnectors();
Map metadata = null;
for (ServerConnectorConfigImpl serverConnectorConfig : serverConnectorConfigs) {
@@ -86,5 +93,8 @@ public class ConsulContextPropertiesTest {
@SpringBootApplication
protected static class TestApplication {
+ static {
+ PolarisSDKContextManager.innerDestroy();
+ }
}
}
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/extend/nacos/NacosContextPropertiesTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/extend/nacos/NacosContextPropertiesTest.java
index 7c1bc2db6..acdf55d58 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/extend/nacos/NacosContextPropertiesTest.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/extend/nacos/NacosContextPropertiesTest.java
@@ -21,8 +21,8 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.polaris.api.config.plugin.DefaultPlugins;
-import com.tencent.polaris.client.api.SDKContext;
import com.tencent.polaris.factory.config.global.ServerConnectorConfigImpl;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -50,7 +50,7 @@ public class NacosContextPropertiesTest {
private NacosContextProperties nacosContextProperties;
@Autowired
- private SDKContext sdkContext;
+ private PolarisSDKContextManager polarisSDKContextManager;
@Test
public void testDefaultInitialization() {
@@ -65,8 +65,9 @@ public class NacosContextPropertiesTest {
@Test
public void testModify() {
- assertThat(sdkContext).isNotNull();
- com.tencent.polaris.api.config.Configuration configuration = sdkContext.getConfig();
+ assertThat(polarisSDKContextManager).isNotNull();
+ com.tencent.polaris.api.config.Configuration configuration = polarisSDKContextManager.getSDKContext()
+ .getConfig();
List serverConnectorConfigs = configuration.getGlobal().getServerConnectors();
Optional optionalServerConnectorConfig = serverConnectorConfigs.stream().filter(
item -> "nacos".equals(item.getId())
@@ -87,5 +88,9 @@ public class NacosContextPropertiesTest {
@SpringBootApplication
protected static class TestApplication {
+
+ static {
+ PolarisSDKContextManager.innerDestroy();
+ }
}
}
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
index 867a990ec..9d78c9033 100644
--- 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
@@ -70,12 +70,11 @@ public class PolarisAutoServiceRegistrationTest {
@BeforeEach
void setUp() {
- doReturn(polarisDiscoveryProperties).when(registration).getPolarisProperties();
-
doNothing().when(serviceRegistry).register(nullable(PolarisRegistration.class));
polarisAutoServiceRegistration =
- new PolarisAutoServiceRegistration(serviceRegistry, autoServiceRegistrationProperties, registration);
+ new PolarisAutoServiceRegistration(serviceRegistry, autoServiceRegistrationProperties, registration,
+ polarisDiscoveryProperties, null);
doReturn(environment).when(applicationContext).getEnvironment();
polarisAutoServiceRegistration.setApplicationContext(applicationContext);
@@ -117,7 +116,7 @@ public class PolarisAutoServiceRegistrationTest {
doReturn("application").when(environment).getProperty(anyString(), anyString());
assertThat(polarisAutoServiceRegistration.getAppName()).isEqualTo("application");
- doReturn(SERVICE_PROVIDER).when(polarisDiscoveryProperties).getService();
+ doReturn(SERVICE_PROVIDER).when(registration).getServiceId();
assertThat(polarisAutoServiceRegistration.getAppName()).isEqualTo(SERVICE_PROVIDER);
}
}
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationCustomizerTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationCustomizerTest.java
new file mode 100644
index 000000000..4961d2b3c
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationCustomizerTest.java
@@ -0,0 +1,76 @@
+/*
+ * 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.context.PolarisSDKContextManager;
+import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
+import com.tencent.cloud.polaris.discovery.PolarisDiscoveryClientConfiguration;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import org.springframework.boot.autoconfigure.AutoConfigurations;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import static com.tencent.polaris.test.common.Consts.PORT;
+import static com.tencent.polaris.test.common.Consts.SERVICE_PROVIDER;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+/**
+ * Test for {@link PolarisRegistrationCustomizer}.
+ *
+ * @author Haotian Zhang
+ */
+public class PolarisRegistrationCustomizerTest {
+
+ private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
+ .withConfiguration(AutoConfigurations.of(
+ PolarisContextAutoConfiguration.class,
+ PolarisServiceRegistryAutoConfiguration.class,
+ PolarisDiscoveryClientConfiguration.class))
+ .withPropertyValues("spring.application.name=" + SERVICE_PROVIDER)
+ .withPropertyValues("server.port=" + PORT)
+ .withPropertyValues("spring.cloud.polaris.address=grpc://127.0.0.1:10081");
+
+ @BeforeEach
+ public void setUp() {
+ PolarisSDKContextManager.innerDestroy();
+ }
+
+ @Test
+ public void testCustomize() {
+ this.contextRunner.run(context -> {
+ PolarisRegistrationCustomizer customizer = context.getBean(PolarisRegistrationCustomizer.class);
+ verify(customizer, times(1)).customize(any(PolarisRegistration.class));
+ });
+ }
+
+ @Configuration
+ @EnableAutoConfiguration
+ static class PolarisServiceRegistryAutoConfiguration {
+ @Bean
+ public PolarisRegistrationCustomizer polarisRegistrationCustomizer() {
+ return mock(PolarisRegistrationCustomizer.class);
+ }
+ }
+}
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
index b0b7daa96..cd60b31b6 100644
--- 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
@@ -57,16 +57,13 @@ import static org.mockito.Mockito.when;
@MockitoSettings(strictness = Strictness.LENIENT)
public class PolarisRegistrationTest {
+ private static final int testLocalPort = 10086;
private NacosContextProperties nacosContextProperties;
private PolarisRegistration polarisRegistration1;
private PolarisRegistration polarisRegistration2;
-
private PolarisRegistration polarisRegistration3;
-
private PolarisRegistration polarisRegistration4;
- private static int testLocalPort = 10086;
-
@BeforeEach
void setUp() {
// mock PolarisDiscoveryProperties
@@ -122,21 +119,21 @@ public class PolarisRegistrationTest {
ReactiveWebServerApplicationContext reactiveWebServerApplicationContext = mock(ReactiveWebServerApplicationContext.class);
doReturn(reactiveWebServer).when(reactiveWebServerApplicationContext).getWebServer();
- polarisRegistration1 = new PolarisRegistration(polarisDiscoveryProperties, null, consulContextProperties,
+ polarisRegistration1 = PolarisRegistration.registration(polarisDiscoveryProperties, null, consulContextProperties,
polarisContext, staticMetadataManager, nacosContextProperties,
- servletWebServerApplicationContext, null);
+ servletWebServerApplicationContext, null, null);
- polarisRegistration2 = new PolarisRegistration(polarisDiscoveryProperties, null, consulContextProperties,
+ polarisRegistration2 = PolarisRegistration.registration(polarisDiscoveryProperties, null, consulContextProperties,
polarisContext, staticMetadataManager, nacosContextProperties,
- null, reactiveWebServerApplicationContext);
+ null, reactiveWebServerApplicationContext, null);
- polarisRegistration3 = new PolarisRegistration(polarisDiscoveryProperties, null, consulContextProperties,
+ polarisRegistration3 = PolarisRegistration.registration(polarisDiscoveryProperties, null, consulContextProperties,
polarisContext, staticMetadataManager, nacosContextProperties,
- null, null);
+ null, null, null);
- polarisRegistration4 = new PolarisRegistration(polarisDiscoveryProperties, polarisContextProperties, consulContextProperties,
+ polarisRegistration4 = PolarisRegistration.registration(polarisDiscoveryProperties, polarisContextProperties, consulContextProperties,
polarisContext, staticMetadataManager, nacosContextProperties,
- null, null);
+ null, null, null);
}
@Test
@@ -187,11 +184,6 @@ public class PolarisRegistrationTest {
assertThat(metadata.get("key1")).isEqualTo("value1");
}
- @Test
- public void testGetPolarisProperties() {
- assertThat(polarisRegistration1.getPolarisProperties()).isNotNull();
- }
-
@Test
public void testIsRegisterEnabled() {
assertThat(polarisRegistration1.isRegisterEnabled()).isTrue();
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfigurationTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfigurationTest.java
index 77a0ef49c..9aae14ceb 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfigurationTest.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfigurationTest.java
@@ -17,12 +17,14 @@
package com.tencent.cloud.polaris.registry;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
import com.tencent.cloud.polaris.discovery.PolarisDiscoveryAutoConfiguration;
import com.tencent.cloud.polaris.discovery.PolarisDiscoveryClientConfiguration;
import com.tencent.polaris.test.mock.discovery.NamingServer;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -65,6 +67,11 @@ public class PolarisServiceRegistryAutoConfigurationTest {
}
}
+ @BeforeEach
+ void setUp() {
+ PolarisSDKContextManager.innerDestroy();
+ }
+
@Test
public void testDefaultInitialization() {
this.contextRunner.run(context -> {
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 0fbdf050c..2d96a9904 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
@@ -17,6 +17,7 @@
package com.tencent.cloud.polaris.registry;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
import com.tencent.cloud.polaris.discovery.PolarisDiscoveryAutoConfiguration;
import com.tencent.cloud.polaris.discovery.PolarisDiscoveryClientConfiguration;
@@ -24,6 +25,7 @@ import com.tencent.polaris.api.pojo.ServiceKey;
import com.tencent.polaris.test.mock.discovery.NamingServer;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
@@ -89,6 +91,11 @@ public class PolarisServiceRegistryTest {
}
}
+ @BeforeEach
+ void setUp() {
+ PolarisSDKContextManager.innerDestroy();
+ }
+
@Test
public void testRegister() {
this.contextRunner.run(context -> {
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/ribbon/PolarisRibbonServerListConfigurationTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/ribbon/PolarisRibbonServerListConfigurationTest.java
index 715ab2f39..f1488fda2 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/ribbon/PolarisRibbonServerListConfigurationTest.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/ribbon/PolarisRibbonServerListConfigurationTest.java
@@ -20,6 +20,8 @@ package com.tencent.cloud.polaris.ribbon;
import com.netflix.client.config.DefaultClientConfigImpl;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.ServerList;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -40,6 +42,11 @@ public class PolarisRibbonServerListConfigurationTest {
private final ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner();
+ @BeforeAll
+ static void beforeAll() {
+ PolarisSDKContextManager.innerDestroy();
+ }
+
@Test
public void testDefaultInitialization() {
this.applicationContextRunner
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/ribbon/PolarisServerListTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/ribbon/PolarisServerListTest.java
index b01e8b2b8..88d1cff58 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/ribbon/PolarisServerListTest.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/ribbon/PolarisServerListTest.java
@@ -22,6 +22,7 @@ import java.util.List;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.Server;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
import com.tencent.cloud.polaris.discovery.PolarisDiscoveryAutoConfiguration;
import com.tencent.cloud.polaris.discovery.PolarisDiscoveryClientConfiguration;
@@ -60,8 +61,7 @@ public class PolarisServerListTest {
PolarisContextAutoConfiguration.class,
PolarisServerListTest.PolarisPropertiesConfiguration.class,
PolarisDiscoveryClientConfiguration.class,
- PolarisDiscoveryAutoConfiguration.class,
- PolarisContextAutoConfiguration.class))
+ PolarisDiscoveryAutoConfiguration.class))
.withPropertyValues("spring.application.name=" + SERVICE_PROVIDER)
.withPropertyValues("server.port=" + PORT)
.withPropertyValues("spring.cloud.polaris.address=grpc://127.0.0.1:10081")
@@ -78,6 +78,7 @@ public class PolarisServerListTest {
namingServer.getNamingService().addService(new ServiceKey(NAMESPACE_TEST, SERVICE_PROVIDER));
}
+
@AfterAll
static void afterAll() {
if (null != namingServer) {
@@ -91,6 +92,7 @@ public class PolarisServerListTest {
iClientConfig = mock(IClientConfig.class);
when(iClientConfig.getClientName()).thenReturn(SERVICE_PROVIDER);
+ PolarisSDKContextManager.innerDestroy();
}
@Test
diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitAutoConfiguration.java
index 1a20a298f..cce3b9bca 100644
--- a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitAutoConfiguration.java
+++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitAutoConfiguration.java
@@ -18,6 +18,7 @@
package com.tencent.cloud.polaris.ratelimit.config;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.cloud.polaris.context.ServiceRuleManager;
import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
import com.tencent.cloud.polaris.ratelimit.filter.QuotaCheckReactiveFilter;
@@ -27,9 +28,6 @@ import com.tencent.cloud.polaris.ratelimit.resolver.RateLimitRuleArgumentServlet
import com.tencent.cloud.polaris.ratelimit.spi.PolarisRateLimiterLabelReactiveResolver;
import com.tencent.cloud.polaris.ratelimit.spi.PolarisRateLimiterLabelServletResolver;
import com.tencent.cloud.polaris.ratelimit.spi.PolarisRateLimiterLimitedFallback;
-import com.tencent.polaris.client.api.SDKContext;
-import com.tencent.polaris.ratelimit.api.core.LimitAPI;
-import com.tencent.polaris.ratelimit.factory.LimitAPIFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -58,12 +56,6 @@ import static javax.servlet.DispatcherType.REQUEST;
@ConditionalOnPolarisRateLimitEnabled
public class PolarisRateLimitAutoConfiguration {
- @Bean
- @ConditionalOnMissingBean
- public LimitAPI limitAPI(SDKContext polarisContext) {
- return LimitAPIFactory.createLimitAPIByContext(polarisContext);
- }
-
/**
* Create when web application type is SERVLET.
*/
@@ -79,11 +71,12 @@ public class PolarisRateLimitAutoConfiguration {
@Bean
@ConditionalOnMissingBean
- public QuotaCheckServletFilter quotaCheckFilter(LimitAPI limitAPI,
+ public QuotaCheckServletFilter quotaCheckFilter(PolarisSDKContextManager polarisSDKContextManager,
PolarisRateLimitProperties polarisRateLimitProperties,
RateLimitRuleArgumentServletResolver rateLimitRuleArgumentResolver,
@Autowired(required = false) PolarisRateLimiterLimitedFallback polarisRateLimiterLimitedFallback) {
- return new QuotaCheckServletFilter(limitAPI, polarisRateLimitProperties, rateLimitRuleArgumentResolver, polarisRateLimiterLimitedFallback);
+ return new QuotaCheckServletFilter(polarisSDKContextManager.getLimitAPI(), polarisRateLimitProperties,
+ rateLimitRuleArgumentResolver, polarisRateLimiterLimitedFallback);
}
@Bean
@@ -113,11 +106,12 @@ public class PolarisRateLimitAutoConfiguration {
}
@Bean
- public QuotaCheckReactiveFilter quotaCheckReactiveFilter(LimitAPI limitAPI,
+ public QuotaCheckReactiveFilter quotaCheckReactiveFilter(PolarisSDKContextManager polarisSDKContextManager,
PolarisRateLimitProperties polarisRateLimitProperties,
RateLimitRuleArgumentReactiveResolver rateLimitRuleArgumentResolver,
@Nullable PolarisRateLimiterLimitedFallback polarisRateLimiterLimitedFallback) {
- return new QuotaCheckReactiveFilter(limitAPI, polarisRateLimitProperties, rateLimitRuleArgumentResolver, polarisRateLimiterLimitedFallback);
+ return new QuotaCheckReactiveFilter(polarisSDKContextManager.getLimitAPI(), polarisRateLimitProperties,
+ rateLimitRuleArgumentResolver, polarisRateLimiterLimitedFallback);
}
}
}
diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/controller/CalleeControllerTests.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/context/CalleeControllerTests.java
similarity index 81%
rename from spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/controller/CalleeControllerTests.java
rename to spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/context/CalleeControllerTests.java
index 220f882fd..d4296c770 100644
--- a/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/controller/CalleeControllerTests.java
+++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/context/CalleeControllerTests.java
@@ -15,12 +15,17 @@
* specific language governing permissions and limitations under the License.
*/
-package com.tencent.cloud.polaris.ratelimit.controller;
+package com.tencent.cloud.polaris.context;
+import com.tencent.cloud.polaris.ratelimit.config.PolarisRateLimitProperties;
+import com.tencent.cloud.polaris.ratelimit.filter.QuotaCheckServletFilter;
+import com.tencent.cloud.polaris.ratelimit.resolver.RateLimitRuleArgumentServletResolver;
+import com.tencent.cloud.polaris.ratelimit.spi.PolarisRateLimiterLimitedFallback;
import com.tencent.polaris.api.pojo.ServiceKey;
import com.tencent.polaris.ratelimit.api.core.LimitAPI;
import com.tencent.polaris.ratelimit.api.rpc.QuotaResponse;
import com.tencent.polaris.ratelimit.api.rpc.QuotaResultCode;
+import com.tencent.polaris.ratelimit.factory.LimitAPIFactory;
import com.tencent.polaris.test.mock.discovery.NamingServer;
import com.tencent.polaris.test.mock.discovery.NamingService;
import org.junit.jupiter.api.AfterAll;
@@ -36,6 +41,7 @@ import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.web.client.HttpClientErrorException.TooManyRequests;
import org.springframework.web.client.RestClientException;
@@ -144,5 +150,19 @@ public class CalleeControllerTests {
return new RestTemplate();
}
+ @Bean
+ public LimitAPI limitAPI(PolarisSDKContextManager polarisSDKContextManager) {
+ return LimitAPIFactory.createLimitAPIByContext(polarisSDKContextManager.getSDKContext());
+ }
+
+ @Bean
+ @Primary
+ public QuotaCheckServletFilter quotaCheckFilter(LimitAPI limitAPI,
+ PolarisRateLimitProperties polarisRateLimitProperties,
+ RateLimitRuleArgumentServletResolver rateLimitRuleArgumentResolver,
+ @Autowired(required = false) PolarisRateLimiterLimitedFallback polarisRateLimiterLimitedFallback) {
+ return new QuotaCheckServletFilter(limitAPI, polarisRateLimitProperties,
+ rateLimitRuleArgumentResolver, polarisRateLimiterLimitedFallback);
+ }
}
}
diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/controller/TestController.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/context/TestController.java
similarity index 95%
rename from spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/controller/TestController.java
rename to spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/context/TestController.java
index 1bca56bc0..c4e99a4d5 100644
--- a/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/controller/TestController.java
+++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/context/TestController.java
@@ -15,7 +15,7 @@
* specific language governing permissions and limitations under the License.
*/
-package com.tencent.cloud.polaris.ratelimit.controller;
+package com.tencent.cloud.polaris.context;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitAutoConfigurationTest.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitAutoConfigurationTest.java
index c21a71f3e..9a959e511 100644
--- a/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitAutoConfigurationTest.java
+++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitAutoConfigurationTest.java
@@ -22,7 +22,6 @@ import com.tencent.cloud.polaris.ratelimit.filter.QuotaCheckReactiveFilter;
import com.tencent.cloud.polaris.ratelimit.filter.QuotaCheckServletFilter;
import com.tencent.cloud.polaris.ratelimit.resolver.RateLimitRuleArgumentReactiveResolver;
import com.tencent.cloud.polaris.ratelimit.resolver.RateLimitRuleArgumentServletResolver;
-import com.tencent.polaris.ratelimit.api.core.LimitAPI;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -55,7 +54,6 @@ public class PolarisRateLimitAutoConfigurationTest {
PolarisRateLimitProperties.class,
PolarisRateLimitAutoConfiguration.class))
.run(context -> {
- assertThat(context).hasSingleBean(LimitAPI.class);
assertThat(context).doesNotHaveBean(RateLimitRuleArgumentServletResolver.class);
assertThat(context).doesNotHaveBean(RateLimitRuleArgumentReactiveResolver.class);
assertThat(context).doesNotHaveBean(PolarisRateLimitAutoConfiguration.QuotaCheckFilterConfig.class);
@@ -73,7 +71,6 @@ public class PolarisRateLimitAutoConfigurationTest {
PolarisRateLimitProperties.class,
PolarisRateLimitAutoConfiguration.class))
.run(context -> {
- assertThat(context).hasSingleBean(LimitAPI.class);
assertThat(context).hasSingleBean(RateLimitRuleArgumentServletResolver.class);
assertThat(context).hasSingleBean(PolarisRateLimitAutoConfiguration.QuotaCheckFilterConfig.class);
assertThat(context).hasSingleBean(QuotaCheckServletFilter.class);
@@ -91,7 +88,6 @@ public class PolarisRateLimitAutoConfigurationTest {
PolarisRateLimitProperties.class,
PolarisRateLimitAutoConfiguration.class))
.run(context -> {
- assertThat(context).hasSingleBean(LimitAPI.class);
assertThat(context).doesNotHaveBean(RateLimitRuleArgumentServletResolver.class);
assertThat(context).hasSingleBean(RateLimitRuleArgumentReactiveResolver.class);
assertThat(context).doesNotHaveBean(PolarisRateLimitAutoConfiguration.QuotaCheckFilterConfig.class);
diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/beanprocessor/PolarisLoadBalancerCompositeRuleBeanPostProcessor.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/beanprocessor/PolarisLoadBalancerCompositeRuleBeanPostProcessor.java
index 7b9e8dc6d..66f4119f9 100644
--- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/beanprocessor/PolarisLoadBalancerCompositeRuleBeanPostProcessor.java
+++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/beanprocessor/PolarisLoadBalancerCompositeRuleBeanPostProcessor.java
@@ -23,6 +23,7 @@ import java.util.List;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.tencent.cloud.common.util.BeanFactoryUtils;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.cloud.polaris.loadbalancer.config.PolarisLoadBalancerProperties;
import com.tencent.cloud.polaris.router.PolarisLoadBalancerCompositeRule;
import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor;
@@ -47,7 +48,8 @@ public class PolarisLoadBalancerCompositeRuleBeanPostProcessor implements BeanPo
@Override
public Object postProcessBeforeInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {
if (bean instanceof AbstractLoadBalancerRule) {
- RouterAPI routerAPI = beanFactory.getBean(RouterAPI.class);
+ PolarisSDKContextManager polarisSDKContextManager = beanFactory.getBean(PolarisSDKContextManager.class);
+ RouterAPI routerAPI = polarisSDKContextManager.getRouterAPI();
PolarisLoadBalancerProperties polarisLoadBalancerProperties = beanFactory.getBean(PolarisLoadBalancerProperties.class);
IClientConfig iClientConfig = beanFactory.getBean(IClientConfig.class);
List requestInterceptors = BeanFactoryUtils.getBeans(beanFactory, RouterRequestInterceptor.class);
diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/beanprocessor/PolarisLoadBalancerCompositeRuleBeanPostProcessorTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/beanprocessor/PolarisLoadBalancerCompositeRuleBeanPostProcessorTest.java
index 1dc95c50d..f40d91a34 100644
--- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/beanprocessor/PolarisLoadBalancerCompositeRuleBeanPostProcessorTest.java
+++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/beanprocessor/PolarisLoadBalancerCompositeRuleBeanPostProcessorTest.java
@@ -27,6 +27,8 @@ import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.ZoneAvoidanceRule;
import com.tencent.cloud.common.util.ReflectionUtils;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
+import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
import com.tencent.cloud.polaris.loadbalancer.config.PolarisLoadBalancerProperties;
import com.tencent.cloud.polaris.router.PolarisLoadBalancerCompositeRule;
import com.tencent.cloud.polaris.router.config.RibbonConfiguration;
@@ -36,6 +38,7 @@ import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor;
import com.tencent.polaris.client.api.SDKContext;
import com.tencent.polaris.router.api.core.RouterAPI;
import com.tencent.polaris.router.client.api.DefaultRouterAPI;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -62,10 +65,16 @@ public class PolarisLoadBalancerCompositeRuleBeanPostProcessorTest {
private static final String SERVICE_2 = "service2";
+ @BeforeEach
+ void setUp() {
+ PolarisSDKContextManager.innerDestroy();
+ }
+
@Test
public void test1() {
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(
+ PolarisContextAutoConfiguration.class,
RibbonDefaultConfig.class,
PolarisRibbonTest.class,
RibbonAutoConfiguration.class,
@@ -86,7 +95,8 @@ public class PolarisLoadBalancerCompositeRuleBeanPostProcessorTest {
@Test
public void test2() {
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(RibbonDefaultConfig.class, PolarisRibbonTest.class, RibbonAutoConfiguration.class))
+ .withConfiguration(AutoConfigurations.of(PolarisContextAutoConfiguration.class,
+ RibbonDefaultConfig.class, PolarisRibbonTest.class, RibbonAutoConfiguration.class))
.withPropertyValues("spring.cloud.polaris.loadbalancer.strategy = random");
contextRunner.run(context -> {
SpringClientFactory springClientFactory = context.getBean(SpringClientFactory.class);
@@ -102,7 +112,8 @@ public class PolarisLoadBalancerCompositeRuleBeanPostProcessorTest {
@Test
public void test3() {
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(RibbonDefaultConfig.class, PolarisRibbonTest.class, RibbonAutoConfiguration.class))
+ .withConfiguration(AutoConfigurations.of(PolarisContextAutoConfiguration.class,
+ RibbonDefaultConfig.class, PolarisRibbonTest.class, RibbonAutoConfiguration.class))
.withPropertyValues("service1.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule");
contextRunner.run(context -> {
SpringClientFactory springClientFactory = context.getBean(SpringClientFactory.class);
@@ -125,7 +136,8 @@ public class PolarisLoadBalancerCompositeRuleBeanPostProcessorTest {
@Test
public void test4() {
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(CustomRibbonConfig.class, PolarisRibbonTest.class, RibbonAutoConfiguration.class));
+ .withConfiguration(AutoConfigurations.of(PolarisContextAutoConfiguration.class,
+ CustomRibbonConfig.class, PolarisRibbonTest.class, RibbonAutoConfiguration.class));
contextRunner.run(context -> {
SpringClientFactory springClientFactory = context.getBean(SpringClientFactory.class);
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 badbd5d3f..75481aa5a 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
@@ -48,11 +48,6 @@ public class MetadataContext {
*/
public static final String FRAGMENT_DISPOSABLE = "disposable";
- /**
- * load balancer context.
- */
- public static final String FRAGMENT_LOAD_BALANCER = "loadbalancer";
-
/**
* upstream disposable Context.
*/
@@ -115,8 +110,12 @@ public class MetadataContext {
private final Map> fragmentContexts;
+ private final Map loadbalancerMetadata;
+
+
public MetadataContext() {
this.fragmentContexts = new ConcurrentHashMap<>();
+ this.loadbalancerMetadata = new ConcurrentHashMap<>();
}
public Map getDisposableMetadata() {
@@ -148,8 +147,8 @@ public class MetadataContext {
return this.getFragmentContext(MetadataContext.FRAGMENT_RAW_TRANSHEADERS_KV);
}
- public Map getLoadbalancerMetadata() {
- return this.getFragmentContext(FRAGMENT_LOAD_BALANCER);
+ public Map getLoadbalancerMetadata() {
+ return this.loadbalancerMetadata;
}
public void setTransitiveMetadata(Map transitiveMetadata) {
@@ -172,8 +171,8 @@ public class MetadataContext {
this.putContext(FRAGMENT_RAW_TRANSHEADERS, key, value);
}
- public void setLoadbalancer(String key, String value) {
- this.putContext(FRAGMENT_LOAD_BALANCER, key, value);
+ public void setLoadbalancer(String key, Object value) {
+ this.loadbalancerMetadata.put(key, value);
}
public Map getFragmentContext(String fragment) {
diff --git a/spring-cloud-tencent-coverage/pom.xml b/spring-cloud-tencent-coverage/pom.xml
index bc873aae6..ee44f02f6 100644
--- a/spring-cloud-tencent-coverage/pom.xml
+++ b/spring-cloud-tencent-coverage/pom.xml
@@ -78,6 +78,11 @@
com.tencent.cloud
spring-cloud-tencent-gateway-plugin