This is an automated email from the ASF dual-hosted git repository.

jianbin pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/incubator-seata.git


The following commit(s) were added to refs/heads/2.x by this push:
     new ff1fa8fe1b optimize: optimize NacosConfiguration singleton reload 
(#6763)
ff1fa8fe1b is described below

commit ff1fa8fe1b599da6554985ed5d24ca4b5902a459
Author: jimin <sliev...@163.com>
AuthorDate: Mon Aug 19 00:30:40 2024 +0800

    optimize: optimize NacosConfiguration singleton reload (#6763)
---
 changes/en-us/2.x.md                               |   1 +
 changes/zh-cn/2.x.md                               |   2 +
 .../java/org/apache/seata/config/Dispose.java}     |  19 +-
 .../seata/config/nacos/NacosConfiguration.java     |  58 ++++---
 .../{nacos => extend}/NacosConfiguration.java      |  21 +--
 .../NacosConfigurationProvider.java                |   2 +-
 .../TestConfigFromExtendSPI.java}                  |  10 +-
 .../seata/config/nacos/NacosConfigurationTest.java |  35 +++-
 .../apache/seata/config/nacos/NacosMockTest.java   | 193 +++++++++++++++++++++
 .../services/io.seata.config.ConfigurationProvider |   2 +-
 ... org.apache.seata.config.ConfigurationProvider} |   2 +-
 .../{registry.conf => registry-mock.conf}          |  47 +----
 .../src/test/resources/registry.conf               |   2 +-
 13 files changed, 292 insertions(+), 102 deletions(-)

diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md
index fb3764e2cd..8874bc1a82 100644
--- a/changes/en-us/2.x.md
+++ b/changes/en-us/2.x.md
@@ -57,6 +57,7 @@ Add changes here for all PR submitted to the 2.x branch.
 - [[#6748](https://github.com/apache/incubator-seata/pull/6748)] optimize 
ConsistentHashLoadBalance Algorithm
 - [[#6747](https://github.com/apache/incubator-seata/pull/6747)] optimize 
fastjson deserialization
 - [[#6755](https://github.com/apache/incubator-seata/pull/6755)] optimize 
namingserver code logic
+- [[#6763](https://github.com/apache/incubator-seata/pull/6763)] optimize 
NacosConfiguration singleton reload
 - [[#6761](https://github.com/apache/incubator-seata/pull/6761)] optimize the 
namingserver code to improve readability
 
 
diff --git a/changes/zh-cn/2.x.md b/changes/zh-cn/2.x.md
index f53af3f5a0..bd37dcc9dc 100644
--- a/changes/zh-cn/2.x.md
+++ b/changes/zh-cn/2.x.md
@@ -58,8 +58,10 @@
 - [[#6748](https://github.com/apache/incubator-seata/pull/6748)] 优化 
ConsistentHashLoadBalance 算法
 - [[#6747](https://github.com/apache/incubator-seata/pull/6747)] 优化 fastjson 
反序列化
 - [[#6755](https://github.com/apache/incubator-seata/pull/6755)] 
优化namingserver代码逻辑
+- [[#6763](https://github.com/apache/incubator-seata/pull/6763)] 优化 
NacosConfiguration 单例加载
 - [[#6761](https://github.com/apache/incubator-seata/pull/6761)] 
提升namingserver manager代码可读性
 
+
 ### refactor:
 
 
diff --git 
a/config/seata-config-nacos/src/test/java/io/seata/config/nacos/NacosConfigurationProvider.java
 b/config/seata-config-core/src/main/java/org/apache/seata/config/Dispose.java
similarity index 69%
copy from 
config/seata-config-nacos/src/test/java/io/seata/config/nacos/NacosConfigurationProvider.java
copy to 
config/seata-config-core/src/main/java/org/apache/seata/config/Dispose.java
index 54bfe67b3a..3de4ebe065 100644
--- 
a/config/seata-config-nacos/src/test/java/io/seata/config/nacos/NacosConfigurationProvider.java
+++ 
b/config/seata-config-core/src/main/java/org/apache/seata/config/Dispose.java
@@ -14,15 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package io.seata.config.nacos;
+package org.apache.seata.config;
 
-import io.seata.config.Configuration;
-import org.apache.seata.common.loader.LoadLevel;
-
-@LoadLevel(name = "Test", order = 1)
-public class NacosConfigurationProvider implements 
io.seata.config.ConfigurationProvider {
-    @Override
-    public Configuration provide() {
-        return NacosConfiguration.getInstance();
-    }
+/**
+ * The interface Dispose.
+ */
+public interface Dispose {
+    /**
+     * Dispose.
+     */
+    void dispose();
 }
diff --git 
a/config/seata-config-nacos/src/main/java/org/apache/seata/config/nacos/NacosConfiguration.java
 
b/config/seata-config-nacos/src/main/java/org/apache/seata/config/nacos/NacosConfiguration.java
index 1530eceb5d..63ff3a06ae 100644
--- 
a/config/seata-config-nacos/src/main/java/org/apache/seata/config/nacos/NacosConfiguration.java
+++ 
b/config/seata-config-nacos/src/main/java/org/apache/seata/config/nacos/NacosConfiguration.java
@@ -38,6 +38,7 @@ import org.apache.seata.config.ConfigurationChangeEvent;
 import org.apache.seata.config.ConfigurationChangeListener;
 import org.apache.seata.config.ConfigurationFactory;
 import org.apache.seata.config.ConfigurationKeys;
+import org.apache.seata.config.Dispose;
 import org.apache.seata.config.processor.ConfigProcessor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,7 +48,7 @@ import org.slf4j.LoggerFactory;
  * The type Nacos configuration.
  *
  */
-public class NacosConfiguration extends AbstractConfiguration {
+public class NacosConfiguration extends AbstractConfiguration implements 
Dispose {
     private static volatile NacosConfiguration instance;
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(NacosConfiguration.class);
@@ -66,10 +67,10 @@ public class NacosConfiguration extends 
AbstractConfiguration {
     private static final String RAM_ROLE_NAME_KEY = "ramRoleName";
     private static final String USE_PARSE_RULE = "false";
     private static final String CONTEXT_PATH = "contextPath";
-    private static final Configuration FILE_CONFIG = 
ConfigurationFactory.CURRENT_FILE_INSTANCE;
+    private Configuration fileConfig = 
ConfigurationFactory.CURRENT_FILE_INSTANCE;
     private static volatile ConfigService configService;
     private static final int MAP_INITIAL_CAPACITY = 8;
-    private static final ConcurrentMap<String, 
ConcurrentMap<ConfigurationChangeListener, NacosListener>> CONFIG_LISTENERS_MAP
+    private static volatile ConcurrentMap<String, 
ConcurrentMap<ConfigurationChangeListener, NacosListener>> CONFIG_LISTENERS_MAP
             = new ConcurrentHashMap<>(MAP_INITIAL_CAPACITY);
     private static volatile Properties seataConfig = new Properties();
 
@@ -203,14 +204,14 @@ public class NacosConfiguration extends 
AbstractConfiguration {
         }
     }
 
-    private static Properties getConfigProperties() {
+    private Properties getConfigProperties() {
         Properties properties = new Properties();
         
properties.setProperty(ConfigurationKeys.IS_USE_CLOUD_NAMESPACE_PARSING, 
USE_PARSE_RULE);
         properties.setProperty(ConfigurationKeys.IS_USE_ENDPOINT_PARSING_RULE, 
USE_PARSE_RULE);
         if (System.getProperty(PRO_SERVER_ADDR_KEY) != null) {
             properties.setProperty(PRO_SERVER_ADDR_KEY, 
System.getProperty(PRO_SERVER_ADDR_KEY));
         } else {
-            String address = FILE_CONFIG.getConfig(getNacosAddrFileKey());
+            String address = fileConfig.getConfig(getNacosAddrFileKey());
             if (address != null) {
                 properties.setProperty(PRO_SERVER_ADDR_KEY, address);
             }
@@ -219,7 +220,7 @@ public class NacosConfiguration extends 
AbstractConfiguration {
         if (System.getProperty(PRO_NAMESPACE_KEY) != null) {
             properties.setProperty(PRO_NAMESPACE_KEY, 
System.getProperty(PRO_NAMESPACE_KEY));
         } else {
-            String namespace = 
FILE_CONFIG.getConfig(getNacosNameSpaceFileKey());
+            String namespace = 
fileConfig.getConfig(getNacosNameSpaceFileKey());
             if (namespace == null) {
                 namespace = DEFAULT_NAMESPACE;
             }
@@ -228,7 +229,7 @@ public class NacosConfiguration extends 
AbstractConfiguration {
         if (!initNacosAuthProperties(properties)) {
             LOGGER.info("Nacos config auth properties empty.");
         }
-        String contextPath = 
StringUtils.isNotBlank(System.getProperty(CONTEXT_PATH)) ? 
System.getProperty(CONTEXT_PATH) : 
FILE_CONFIG.getConfig(getNacosContextPathKey());
+        String contextPath = 
StringUtils.isNotBlank(System.getProperty(CONTEXT_PATH)) ? 
System.getProperty(CONTEXT_PATH) : 
fileConfig.getConfig(getNacosContextPathKey());
         if (StringUtils.isNotBlank(contextPath)) {
             properties.setProperty(CONTEXT_PATH, contextPath);
         }
@@ -242,10 +243,10 @@ public class NacosConfiguration extends 
AbstractConfiguration {
      * @param sourceProperties the source properties
      * @return auth properties
      */
-    private static boolean initNacosAuthProperties(Properties 
sourceProperties) {
-        String userName = 
StringUtils.isNotBlank(System.getProperty(USER_NAME)) ? 
System.getProperty(USER_NAME) : FILE_CONFIG.getConfig(getNacosUserName());
+    private boolean initNacosAuthProperties(Properties sourceProperties) {
+        String userName = 
StringUtils.isNotBlank(System.getProperty(USER_NAME)) ? 
System.getProperty(USER_NAME) : fileConfig.getConfig(getNacosUserName());
         if (StringUtils.isNotBlank(userName)) {
-            String password = 
StringUtils.isNotBlank(System.getProperty(PASSWORD)) ? 
System.getProperty(PASSWORD) : FILE_CONFIG.getConfig(getNacosPassword());
+            String password = 
StringUtils.isNotBlank(System.getProperty(PASSWORD)) ? 
System.getProperty(PASSWORD) : fileConfig.getConfig(getNacosPassword());
             if (StringUtils.isNotBlank(password)) {
                 sourceProperties.setProperty(USER_NAME, userName);
                 sourceProperties.setProperty(PASSWORD, password);
@@ -253,10 +254,10 @@ public class NacosConfiguration extends 
AbstractConfiguration {
                 return true;
             }
         } else {
-            String accessKey = 
StringUtils.isNotBlank(System.getProperty(ACCESS_KEY)) ? 
System.getProperty(ACCESS_KEY) : FILE_CONFIG.getConfig(getNacosAccessKey());
-            String ramRoleName = 
StringUtils.isNotBlank(System.getProperty(RAM_ROLE_NAME_KEY)) ? 
System.getProperty(RAM_ROLE_NAME_KEY) : 
FILE_CONFIG.getConfig(getNacosRamRoleNameKey());
+            String accessKey = 
StringUtils.isNotBlank(System.getProperty(ACCESS_KEY)) ? 
System.getProperty(ACCESS_KEY) : fileConfig.getConfig(getNacosAccessKey());
+            String ramRoleName = 
StringUtils.isNotBlank(System.getProperty(RAM_ROLE_NAME_KEY)) ? 
System.getProperty(RAM_ROLE_NAME_KEY) : 
fileConfig.getConfig(getNacosRamRoleNameKey());
             if (StringUtils.isNotBlank(accessKey)) {
-                String secretKey = 
StringUtils.isNotBlank(System.getProperty(SECRET_KEY)) ? 
System.getProperty(SECRET_KEY) : FILE_CONFIG.getConfig(getNacosSecretKey());
+                String secretKey = 
StringUtils.isNotBlank(System.getProperty(SECRET_KEY)) ? 
System.getProperty(SECRET_KEY) : fileConfig.getConfig(getNacosSecretKey());
                 if (StringUtils.isNotBlank(secretKey)) {
                     sourceProperties.put(ACCESS_KEY, accessKey);
                     sourceProperties.put(SECRET_KEY, secretKey);
@@ -310,15 +311,15 @@ public class NacosConfiguration extends 
AbstractConfiguration {
         return String.join(ConfigurationKeys.FILE_CONFIG_SPLIT_CHAR, 
ConfigurationKeys.FILE_ROOT_CONFIG, CONFIG_TYPE, RAM_ROLE_NAME_KEY);
     }
 
-    private static String getNacosGroup() {
-        return FILE_CONFIG.getConfig(getNacosGroupKey(), DEFAULT_GROUP);
+    private String getNacosGroup() {
+        return fileConfig.getConfig(getNacosGroupKey(), DEFAULT_GROUP);
     }
 
-    private static String getNacosDataId() {
-        return FILE_CONFIG.getConfig(getNacosDataIdKey(), DEFAULT_DATA_ID);
+    private String getNacosDataId() {
+        return fileConfig.getConfig(getNacosDataIdKey(), DEFAULT_DATA_ID);
     }
 
-    private static String getNacosDataType() {
+    private String getNacosDataType() {
         return ConfigProcessor.resolverConfigDataType(getNacosDataId());
     }
 
@@ -339,7 +340,7 @@ public class NacosConfiguration extends 
AbstractConfiguration {
         return String.join(ConfigurationKeys.FILE_CONFIG_SPLIT_CHAR, 
ConfigurationKeys.FILE_ROOT_CONFIG, CONFIG_TYPE, CONTEXT_PATH);
     }
 
-    private static void initSeataConfig() {
+    private void initSeataConfig() {
         try {
             String nacosDataId = getNacosDataId();
             String config = configService.getConfig(nacosDataId, 
getNacosGroup(), DEFAULT_CONFIG_TIMEOUT);
@@ -360,10 +361,27 @@ public class NacosConfiguration extends 
AbstractConfiguration {
         return CONFIG_TYPE;
     }
 
+    @Override
+    public void dispose() {
+        if (null != CONFIG_LISTENERS_MAP) {
+            CONFIG_LISTENERS_MAP.clear();
+        }
+        if (null != seataConfig) {
+            seataConfig.clear();
+        }
+        if (null != configService) {
+            configService = null;
+        }
+        if (null != instance) {
+            instance = null;
+        }
+        fileConfig = ConfigurationFactory.CURRENT_FILE_INSTANCE;
+    }
+
     /**
      * Non-blocking subscriptions prohibit adding subscriptions in the thread 
pool to prevent thread termination
      */
-    public static class NacosListener extends AbstractSharedListener {
+    public class NacosListener extends AbstractSharedListener {
         private final String dataId;
         private final ConfigurationChangeListener listener;
 
diff --git 
a/config/seata-config-nacos/src/test/java/io/seata/config/nacos/NacosConfiguration.java
 
b/config/seata-config-nacos/src/test/java/io/seata/config/extend/NacosConfiguration.java
similarity index 95%
rename from 
config/seata-config-nacos/src/test/java/io/seata/config/nacos/NacosConfiguration.java
rename to 
config/seata-config-nacos/src/test/java/io/seata/config/extend/NacosConfiguration.java
index 87e3c39dbf..fb978c6b93 100644
--- 
a/config/seata-config-nacos/src/test/java/io/seata/config/nacos/NacosConfiguration.java
+++ 
b/config/seata-config-nacos/src/test/java/io/seata/config/extend/NacosConfiguration.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package io.seata.config.nacos;
+package io.seata.config.extend;
 
 import java.io.IOException;
 import java.util.Enumeration;
@@ -23,8 +23,6 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
 
 import com.alibaba.nacos.api.NacosFactory;
 import com.alibaba.nacos.api.config.ConfigService;
@@ -245,7 +243,6 @@ public class NacosConfiguration extends 
io.seata.config.AbstractConfiguration {
             NACOS_DATA_ID_KEY);
     }
 
-
     private static String getNacosGroup() {
         return FILE_CONFIG.getString(getNacosGroupKey());
     }
@@ -316,17 +313,17 @@ public class NacosConfiguration extends 
io.seata.config.AbstractConfiguration {
                         }
                     }
                     //Get all the monitored dataids and judge whether it has 
been modified
-                    for (Map.Entry<String, 
ConcurrentMap<ConfigurationChangeListener, NacosListener>> entry : 
CONFIG_LISTENERS_MAP.entrySet()) {
+                    for (Map.Entry<String, 
ConcurrentMap<ConfigurationChangeListener, NacosListener>> entry :
+                        CONFIG_LISTENERS_MAP.entrySet()) {
                         String listenedDataId = entry.getKey();
                         String propertyOld = 
seataConfig.getProperty(listenedDataId, "");
                         String propertyNew = 
seataConfigNew.getProperty(listenedDataId, "");
                         if (!propertyOld.equals(propertyNew)) {
-                            ConfigurationChangeEvent event =
-                                new 
ConfigurationChangeEvent().setDataId(listenedDataId).setNewValue(propertyNew)
-                                    .setNamespace(group);
+                            ConfigurationChangeEvent event = new 
ConfigurationChangeEvent().setDataId(listenedDataId)
+                                .setNewValue(propertyNew).setNamespace(group);
 
-                            ConcurrentMap<ConfigurationChangeListener, 
NacosListener> configListeners =
-                                entry.getValue();
+                            ConcurrentMap<ConfigurationChangeListener, 
NacosListener> configListeners
+                                = entry.getValue();
                             for (ConfigurationChangeListener configListener : 
configListeners.keySet()) {
                                 configListener.onProcessEvent(event);
                             }
@@ -340,8 +337,8 @@ public class NacosConfiguration extends 
io.seata.config.AbstractConfiguration {
                 LOGGER.error("innerReceive error: {}", e.getMessage(), e);
             }
             //Compatible with old writing
-            ConfigurationChangeEvent event =
-                new 
ConfigurationChangeEvent().setDataId(dataId).setNewValue(configInfo).setNamespace(group);
+            ConfigurationChangeEvent event = new 
ConfigurationChangeEvent().setDataId(dataId).setNewValue(configInfo)
+                .setNamespace(group);
             listener.onProcessEvent(event);
         }
     }
diff --git 
a/config/seata-config-nacos/src/test/java/io/seata/config/nacos/NacosConfigurationProvider.java
 
b/config/seata-config-nacos/src/test/java/io/seata/config/extend/NacosConfigurationProvider.java
similarity index 97%
rename from 
config/seata-config-nacos/src/test/java/io/seata/config/nacos/NacosConfigurationProvider.java
rename to 
config/seata-config-nacos/src/test/java/io/seata/config/extend/NacosConfigurationProvider.java
index 54bfe67b3a..578a7a1853 100644
--- 
a/config/seata-config-nacos/src/test/java/io/seata/config/nacos/NacosConfigurationProvider.java
+++ 
b/config/seata-config-nacos/src/test/java/io/seata/config/extend/NacosConfigurationProvider.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package io.seata.config.nacos;
+package io.seata.config.extend;
 
 import io.seata.config.Configuration;
 import org.apache.seata.common.loader.LoadLevel;
diff --git 
a/config/seata-config-nacos/src/test/java/io/seata/config/nacos/TestConfigCustomSPI.java
 
b/config/seata-config-nacos/src/test/java/io/seata/config/extend/TestConfigFromExtendSPI.java
similarity index 92%
rename from 
config/seata-config-nacos/src/test/java/io/seata/config/nacos/TestConfigCustomSPI.java
rename to 
config/seata-config-nacos/src/test/java/io/seata/config/extend/TestConfigFromExtendSPI.java
index 54e1bbd846..80bde36481 100644
--- 
a/config/seata-config-nacos/src/test/java/io/seata/config/nacos/TestConfigCustomSPI.java
+++ 
b/config/seata-config-nacos/src/test/java/io/seata/config/extend/TestConfigFromExtendSPI.java
@@ -14,19 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package io.seata.config.nacos;
+package io.seata.config.extend;
 
 import java.security.SecureRandom;
-import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
 import com.alibaba.nacos.api.NacosFactory;
 import com.alibaba.nacos.api.config.ConfigService;
-import com.alibaba.nacos.api.config.listener.AbstractSharedListener;
 import com.alibaba.nacos.api.exception.NacosException;
 
 import com.typesafe.config.Config;
@@ -42,7 +38,7 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
-public class TestConfigCustomSPI {
+public class TestConfigFromExtendSPI {
 
     private static  Config FILE_CONFIG;
     private static ConfigService configService;
@@ -67,7 +63,7 @@ public class TestConfigCustomSPI {
         Assertions.assertNotNull(configService);
         Configuration configuration = ConfigurationFactory.getInstance();
         String postfix = generateRandomString();
-        String dataId = "nacos.config.custom.spi." + postfix;
+        String dataId = "nacos.config.extension.spi." + postfix;
         String group = FILE_CONFIG.getString("config.test.group");
         String content = "seata";
         CountDownLatch listenerCountDown = new CountDownLatch(1);
diff --git 
a/config/seata-config-nacos/src/test/java/org/apache/seata/config/nacos/NacosConfigurationTest.java
 
b/config/seata-config-nacos/src/test/java/org/apache/seata/config/nacos/NacosConfigurationTest.java
index 78ab0ec865..ff938c9e28 100644
--- 
a/config/seata-config-nacos/src/test/java/org/apache/seata/config/nacos/NacosConfigurationTest.java
+++ 
b/config/seata-config-nacos/src/test/java/org/apache/seata/config/nacos/NacosConfigurationTest.java
@@ -19,26 +19,45 @@ package org.apache.seata.config.nacos;
 import java.lang.reflect.Method;
 import java.util.Properties;
 
+import com.alibaba.nacos.api.exception.NacosException;
+
 import org.apache.seata.common.util.ReflectionUtil;
-import org.assertj.core.api.Assertions;
+import org.apache.seata.config.Configuration;
+import org.apache.seata.config.ConfigurationFactory;
+import org.apache.seata.config.Dispose;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
-
 /**
  * The type Nacos configuration test
- *
  */
 public class NacosConfigurationTest {
 
+    private static Configuration configuration;
+
+    @BeforeAll
+    public static void setup() throws NacosException {
+        System.clearProperty("seataEnv");
+        configuration = NacosConfiguration.getInstance();
+        if (configuration instanceof Dispose) {
+            ((Dispose)configuration).dispose();
+        }
+        ConfigurationFactory.reload();
+        configuration = NacosConfiguration.getInstance();
+    }
+
     @Test
     public void testGetConfigProperties() throws Exception {
+        Assertions.assertNotNull(configuration);
         Method method = ReflectionUtil.getMethod(NacosConfiguration.class, 
"getConfigProperties");
-        Properties properties = (Properties) ReflectionUtil.invokeMethod(null, 
method);
-        
Assertions.assertThat(properties.getProperty("contextPath")).isEqualTo("/bar");
+        //do not use `ConfigurationFactory.getInstance()`, it's a proxy object
+        Properties properties = (Properties)method.invoke(configuration);
+        Assertions.assertEquals("/bar", properties.getProperty("contextPath"));
         System.setProperty("contextPath", "/foo");
-        properties = (Properties) ReflectionUtil.invokeMethod(null, method);
-        
Assertions.assertThat(properties.getProperty("contextPath")).isEqualTo("/foo");
+        properties = (Properties)method.invoke(configuration);
+        Assertions.assertEquals("/foo", properties.getProperty("contextPath"));
+        System.clearProperty("contextPath");
     }
 
-
 }
diff --git 
a/config/seata-config-nacos/src/test/java/org/apache/seata/config/nacos/NacosMockTest.java
 
b/config/seata-config-nacos/src/test/java/org/apache/seata/config/nacos/NacosMockTest.java
new file mode 100644
index 0000000000..7a30740a89
--- /dev/null
+++ 
b/config/seata-config-nacos/src/test/java/org/apache/seata/config/nacos/NacosMockTest.java
@@ -0,0 +1,193 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 org.apache.seata.config.nacos;
+
+import java.lang.reflect.UndeclaredThrowableException;
+import java.time.Duration;
+import java.util.Properties;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import com.alibaba.nacos.api.NacosFactory;
+import com.alibaba.nacos.api.config.ConfigService;
+import com.alibaba.nacos.api.exception.NacosException;
+
+import org.apache.seata.config.Configuration;
+import org.apache.seata.config.ConfigurationCache;
+import org.apache.seata.config.ConfigurationChangeEvent;
+import org.apache.seata.config.ConfigurationChangeListener;
+import org.apache.seata.config.ConfigurationFactory;
+import org.apache.seata.config.Dispose;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+public class NacosMockTest {
+    private static ConfigService configService;
+    private static final String NACOS_ENDPOINT = "console.nacos.io:80";
+
+    private static final String NACOS_GROUP = "SEATA_GROUP";
+
+    private static final String NACOS_DATAID = "seata-mock";
+    private static final String SUB_NACOS_DATAID = "KEY";
+
+    private ConfigurationChangeListener listener;
+
+    @BeforeAll
+    public static void setup() throws NacosException {
+        System.setProperty("seataEnv", "mock");
+        NacosConfiguration configuration = NacosConfiguration.getInstance();
+        if (configuration instanceof Dispose) {
+            ((Dispose)configuration).dispose();
+        }
+        ConfigurationFactory.reload();
+        Properties properties = new Properties();
+        properties.setProperty("serverAddr", NACOS_ENDPOINT);
+        configService = NacosFactory.createConfigService(properties);
+        configService.removeConfig(NACOS_DATAID, NACOS_GROUP);
+    }
+
+    @Test
+    public void getInstance() {
+        Assertions.assertNotNull(configService);
+        Assertions.assertNotNull(NacosConfiguration.getInstance());
+        Assertions.assertNotNull(ConfigurationFactory.getInstance());
+    }
+
+    @Test
+    public void getConfig() {
+        Configuration configuration = ConfigurationFactory.getInstance();
+        String configStrValue = configuration.getConfig(SUB_NACOS_DATAID);
+        Assertions.assertNull(configStrValue);
+        configStrValue = configuration.getConfig(SUB_NACOS_DATAID, 5000);
+        Assertions.assertNull(configStrValue);
+        configStrValue = configuration.getConfig(SUB_NACOS_DATAID, "TEST", 
5000);
+        Assertions.assertEquals("TEST", configStrValue);
+        ConfigurationCache.clear();
+        System.setProperty(SUB_NACOS_DATAID, "SYS-TEST");
+        configStrValue = configuration.getConfig(SUB_NACOS_DATAID, "TEST", 
5000);
+        Assertions.assertEquals("SYS-TEST", configStrValue);
+        ConfigurationCache.clear();
+        System.clearProperty(SUB_NACOS_DATAID);
+
+        ConfigurationCache.clear();
+        int configIntValue = configuration.getInt(SUB_NACOS_DATAID);
+        Assertions.assertEquals(0, configIntValue);
+        configIntValue = configuration.getInt(SUB_NACOS_DATAID, 100);
+        Assertions.assertEquals(100, configIntValue);
+        configIntValue = configuration.getInt(SUB_NACOS_DATAID, 100, 5000);
+        Assertions.assertEquals(100, configIntValue);
+
+        ConfigurationCache.clear();
+        boolean configBoolValue = configuration.getBoolean(SUB_NACOS_DATAID);
+        Assertions.assertEquals(false, configBoolValue);
+        configBoolValue = configuration.getBoolean(SUB_NACOS_DATAID, true);
+        Assertions.assertEquals(true, configBoolValue);
+        configBoolValue = configuration.getBoolean(SUB_NACOS_DATAID, true, 
5000);
+        Assertions.assertEquals(true, configBoolValue);
+
+        ConfigurationCache.clear();
+        short configShortValue = configuration.getShort(SUB_NACOS_DATAID);
+        Assertions.assertEquals(0, configShortValue);
+        configShortValue = configuration.getShort(SUB_NACOS_DATAID, (short)64);
+        Assertions.assertEquals(64, configShortValue);
+        configShortValue = configuration.getShort(SUB_NACOS_DATAID, 
(short)127, 5000);
+        Assertions.assertEquals(127, configShortValue);
+
+        ConfigurationCache.clear();
+        long configLongValue = configuration.getShort(SUB_NACOS_DATAID);
+        Assertions.assertEquals(0L, configLongValue);
+        configLongValue = configuration.getLong(SUB_NACOS_DATAID, 12345678L);
+        Assertions.assertEquals(12345678L, configLongValue);
+        configLongValue = configuration.getLong(SUB_NACOS_DATAID, 65535L, 
5000);
+        Assertions.assertEquals(65535L, configLongValue);
+
+        ConfigurationCache.clear();
+        Duration configDurValue = configuration.getDuration(SUB_NACOS_DATAID);
+        Assertions.assertEquals(Duration.ZERO, configDurValue);
+        Duration defaultDuration = Duration.ofMillis(5000);
+        configDurValue = configuration.getDuration(SUB_NACOS_DATAID, 
defaultDuration);
+        Assertions.assertEquals(defaultDuration, configDurValue);
+        defaultDuration = Duration.ofMillis(1000);
+        configDurValue = configuration.getDuration(SUB_NACOS_DATAID, 
defaultDuration, 5000);
+        Assertions.assertEquals(defaultDuration, configDurValue);
+
+        ConfigurationCache.clear();
+        configStrValue = configuration.getLatestConfig(SUB_NACOS_DATAID, 
"DEFAULT", 5000);
+        Assertions.assertEquals("DEFAULT", configStrValue);
+
+    }
+
+    @Test
+    public void putConfigIfAbsent() {
+        Configuration configuration = ConfigurationFactory.getInstance();
+        Assertions.assertThrows(UndeclaredThrowableException.class, () -> {
+            configuration.putConfigIfAbsent(NACOS_DATAID, "TEST");
+        });
+    }
+
+    @Test
+    public void removeConfig() {
+        Configuration configuration = ConfigurationFactory.getInstance();
+        boolean removed = configuration.removeConfig(SUB_NACOS_DATAID);
+        Assertions.assertTrue(removed);
+    }
+
+    @Test
+    public void putConfig() {
+        Configuration configuration = ConfigurationFactory.getInstance();
+        boolean added = configuration.putConfig(SUB_NACOS_DATAID, "TEST");
+        Assertions.assertTrue(added);
+        boolean removed = configuration.removeConfig(SUB_NACOS_DATAID);
+        Assertions.assertTrue(removed);
+    }
+
+    @Test
+    public void testConfigListener() throws NacosException, 
InterruptedException {
+        Configuration configuration = ConfigurationFactory.getInstance();
+        configuration.putConfig(NACOS_DATAID, "KEY=TEST");
+        //prevent the listener event from batch processing
+        Thread.sleep(1000);
+        CountDownLatch latch = new CountDownLatch(1);
+        listener = new ConfigurationChangeListener() {
+            @Override
+            public void onChangeEvent(ConfigurationChangeEvent event) {
+                Assertions.assertEquals(SUB_NACOS_DATAID, event.getDataId());
+                latch.countDown();
+            }
+        };
+        configuration.addConfigListener(SUB_NACOS_DATAID, listener);
+        Thread.sleep(1000);
+        configuration.putConfig(NACOS_DATAID, "KEY=VALUE");
+        latch.await(3000, TimeUnit.MILLISECONDS);
+        Set<ConfigurationChangeListener> listeners = 
configuration.getConfigListeners(SUB_NACOS_DATAID);
+        //configcache listener + user listener
+        Assertions.assertEquals(2, listeners.size());
+
+        configuration.removeConfigListener(SUB_NACOS_DATAID, listener);
+        listeners = configuration.getConfigListeners(SUB_NACOS_DATAID);
+        Assertions.assertEquals(1, listeners.size());
+    }
+
+    @AfterEach
+    public void afterEach() throws NacosException {
+        configService.removeConfig(NACOS_DATAID, NACOS_GROUP);
+        ConfigurationFactory.reload();
+    }
+}
diff --git 
a/config/seata-config-nacos/src/test/resources/META-INF/services/io.seata.config.ConfigurationProvider
 
b/config/seata-config-nacos/src/test/resources/META-INF/services/io.seata.config.ConfigurationProvider
index a06919a0cc..019e95c519 100644
--- 
a/config/seata-config-nacos/src/test/resources/META-INF/services/io.seata.config.ConfigurationProvider
+++ 
b/config/seata-config-nacos/src/test/resources/META-INF/services/io.seata.config.ConfigurationProvider
@@ -14,4 +14,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-io.seata.config.nacos.NacosConfigurationProvider
\ No newline at end of file
+io.seata.config.extend.NacosConfigurationProvider
\ No newline at end of file
diff --git 
a/config/seata-config-nacos/src/test/resources/META-INF/services/io.seata.config.ConfigurationProvider
 
b/config/seata-config-nacos/src/test/resources/META-INF/services/org.apache.seata.config.ConfigurationProvider
similarity index 93%
copy from 
config/seata-config-nacos/src/test/resources/META-INF/services/io.seata.config.ConfigurationProvider
copy to 
config/seata-config-nacos/src/test/resources/META-INF/services/org.apache.seata.config.ConfigurationProvider
index a06919a0cc..2332d87208 100644
--- 
a/config/seata-config-nacos/src/test/resources/META-INF/services/io.seata.config.ConfigurationProvider
+++ 
b/config/seata-config-nacos/src/test/resources/META-INF/services/org.apache.seata.config.ConfigurationProvider
@@ -14,4 +14,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-io.seata.config.nacos.NacosConfigurationProvider
\ No newline at end of file
+org.apache.seata.config.nacos.NacosConfigurationProvider
\ No newline at end of file
diff --git a/config/seata-config-nacos/src/test/resources/registry.conf 
b/config/seata-config-nacos/src/test/resources/registry-mock.conf
similarity index 69%
copy from config/seata-config-nacos/src/test/resources/registry.conf
copy to config/seata-config-nacos/src/test/resources/registry-mock.conf
index 1fbdb5694b..a0bfd9890c 100644
--- a/config/seata-config-nacos/src/test/resources/registry.conf
+++ b/config/seata-config-nacos/src/test/resources/registry-mock.conf
@@ -21,7 +21,7 @@ registry {
 
   nacos {
     application = "seata-server"
-    serverAddr = "127.0.0.1:8848"
+    serverAddr = "console.nacos.io:80"
     group = "SEATA_GROUP"
     namespace = ""
     username = ""
@@ -74,47 +74,12 @@ registry {
 
 config {
   # file、nacos 、apollo、zk、consul、etcd3、springCloudConfig、custom
-  type = "file"
+  type = "nacos"
 
   nacos {
-    serverAddr = "127.0.0.1:8848"
-    namespace = ""
-    group = "SEATA_GROUP"
-    username = ""
-    password = ""
-    contextPath = "/bar"
-    ##if use MSE Nacos with auth, mutex with username/password attribute
-    #accessKey = ""
-    #secretKey = ""
-    dataId = "seata.properties"
-  }
-  consul {
-    serverAddr = "127.0.0.1:8500"
-       key = "seata.properties"
-    aclToken = ""
-  }
-  apollo {
-    appId = "seata-server"
-    apolloMeta = "http://192.168.1.204:8801";
-    namespace = "application"
-    apolloAccesskeySecret = ""
-  }
-  zk {
-    serverAddr = "127.0.0.1:2181"
-    sessionTimeout = 6000
-    connectTimeout = 2000
-    username = ""
-    password = ""
-    nodePath = "/seata/seata.properties"
-  }
-  etcd3 {
-    serverAddr = "http://localhost:2379";
-    key = "seata.properties"
-  }
-  file {
-    name = "file.conf"
-  }
-  custom {
-    name = ""
+      serverAddr = "console.nacos.io:80"
+      namespace = ""
+      group = "SEATA_GROUP"
+      dataId = "seata-mock"
   }
 }
diff --git a/config/seata-config-nacos/src/test/resources/registry.conf 
b/config/seata-config-nacos/src/test/resources/registry.conf
index 1fbdb5694b..2590023087 100644
--- a/config/seata-config-nacos/src/test/resources/registry.conf
+++ b/config/seata-config-nacos/src/test/resources/registry.conf
@@ -21,7 +21,7 @@ registry {
 
   nacos {
     application = "seata-server"
-    serverAddr = "127.0.0.1:8848"
+    serverAddr = "console.nacos.io:80"
     group = "SEATA_GROUP"
     namespace = ""
     username = ""


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@seata.apache.org
For additional commands, e-mail: notifications-h...@seata.apache.org


Reply via email to