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

hefengen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new e3e7b619c1 [type:fix] configs import and export refactor (#5827)
e3e7b619c1 is described below

commit e3e7b619c10a46a5eff7b157612db314d787a1b5
Author: eye-gu <734164...@qq.com>
AuthorDate: Fri Dec 27 12:07:26 2024 +0800

    [type:fix] configs import and export refactor (#5827)
    
    Co-authored-by: aias00 <liuhon...@apache.org>
---
 .../controller/ConfigsExportImportController.java  |   8 +-
 .../apache/shenyu/admin/mapper/MetaDataMapper.java |   3 +-
 .../shenyu/admin/service/DiscoveryService.java     |   4 +-
 .../admin/service/DiscoveryUpstreamService.java    |   5 +-
 .../admin/service/NamespacePluginService.java      |   4 +-
 .../shenyu/admin/service/PluginHandleService.java  |   6 +-
 .../apache/shenyu/admin/service/PluginService.java |  13 +-
 .../shenyu/admin/service/ProxySelectorService.java |   4 +-
 .../apache/shenyu/admin/service/RuleService.java   |   4 +-
 .../shenyu/admin/service/SelectorService.java      |   4 +-
 .../configs/AuthConfigsExportImportHandler.java    |  68 ++++++
 .../service/configs/ConfigsExportImportEnum.java   | 101 +++++++++
 .../ConfigsExportImportHandler.java}               |  30 +--
 .../service/configs/ConfigsImportContext.java      |  70 +++++++
 .../DictDataConfigsExportImportHandler.java        |  69 ++++++
 .../DiscoveryDataConfigsExportImportHandler.java   |  67 ++++++
 ...veryUpstreamDataConfigsExportImportHandler.java |  66 ++++++
 .../MetadataConfigsExportImportHandler.java        |  67 ++++++
 ...espacePluginDataConfigsExportImportHandler.java |  67 ++++++
 ...PluginHandleDataConfigsExportImportHandler.java |  66 ++++++
 ...uginTemplateDataConfigsExportImportHandler.java |  66 ++++++
 ...roxySelectorDataConfigsExportImportHandler.java |  66 ++++++
 .../RuleDataConfigsExportImportHandler.java        |  66 ++++++
 .../SelectorDataConfigsExportImportHandler.java    |  67 ++++++
 .../admin/service/impl/AppAuthServiceImpl.java     |  14 +-
 .../admin/service/impl/ConfigsServiceImpl.java     | 233 +++------------------
 .../admin/service/impl/DiscoveryServiceImpl.java   |  16 +-
 .../service/impl/DiscoveryUpstreamServiceImpl.java |   6 +-
 .../admin/service/impl/MetaDataServiceImpl.java    |  10 +-
 .../service/impl/NamespacePluginServiceImpl.java   |  10 +-
 .../service/impl/PluginHandleServiceImpl.java      |  18 +-
 .../admin/service/impl/PluginServiceImpl.java      |  64 +-----
 .../service/impl/ProxySelectorServiceImpl.java     |  21 +-
 .../shenyu/admin/service/impl/RuleServiceImpl.java |  26 ++-
 .../admin/service/impl/SelectorServiceImpl.java    |  29 ++-
 .../admin/service/impl/SyncDataServiceImpl.java    |  19 +-
 .../main/resources/mappers/meta-data-sqlmap.xml    |   1 +
 .../shenyu/admin/service/AppAuthServiceTest.java   |   4 +-
 .../shenyu/admin/service/ConfigsServiceTest.java   |   7 +-
 .../shenyu/admin/service/MetaDataServiceTest.java  |   6 +-
 .../shenyu/admin/service/PluginServiceTest.java    |   2 +-
 .../shenyu/admin/service/SyncDataServiceTest.java  |   2 +
 .../common/constant/ExportImportConstants.java     |  22 +-
 43 files changed, 1149 insertions(+), 352 deletions(-)

diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/ConfigsExportImportController.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/ConfigsExportImportController.java
index 0967be80be..752ba5a5bc 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/ConfigsExportImportController.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/ConfigsExportImportController.java
@@ -99,7 +99,7 @@ public class ConfigsExportImportController {
             throw new ShenyuException(result.getMessage());
         }
         HttpHeaders headers = new HttpHeaders();
-        String fileName = generateFileName();
+        String fileName = generateFileName(namespace);
         response.setHeader("Access-Control-Expose-Headers", 
"Content-Disposition");
         headers.add("Content-Disposition", "attachment;filename=" + fileName);
         return new ResponseEntity<>((byte[]) result.getData(), headers, 
HttpStatus.OK);
@@ -115,6 +115,12 @@ public class ConfigsExportImportController {
                 + ExportImportConstants.EXPORT_CONFIG_FILE_NAME_EXT;
     }
 
+    private String generateFileName(final String namespace) {
+        return ExportImportConstants.EXPORT_CONFIG_FILE_NAME + namespace + "_" 
+ DateFormatUtils.format(new Date(), 
ExportImportConstants.EXPORT_CONFIG_FILE_NAME_DATE_FORMAT)
+                + ExportImportConstants.EXPORT_CONFIG_FILE_NAME_EXT;
+    }
+
+
     /**
      * Import configs.
      *
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/MetaDataMapper.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/MetaDataMapper.java
index e4f33fa266..f5b63d4fbf 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/MetaDataMapper.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/MetaDataMapper.java
@@ -177,9 +177,10 @@ public interface MetaDataMapper extends ExistProvider {
      * the path is existed.
      *
      * @param path path
+     * @param namespaceId namespaceId
      * @return existed
      */
-    Boolean pathExisted(@Param("path") Serializable path);
+    Boolean pathExisted(@Param("path") Serializable path, 
@Param("namespaceId") String namespaceId);
     
     /**
      * the path is existed.
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/DiscoveryService.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/DiscoveryService.java
index 1ffec289e1..b57571e1ed 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/DiscoveryService.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/DiscoveryService.java
@@ -21,6 +21,7 @@ import org.apache.shenyu.admin.model.dto.DiscoveryDTO;
 import org.apache.shenyu.admin.model.dto.DiscoveryHandlerDTO;
 import org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.DiscoveryVO;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.register.common.dto.DiscoveryConfigRegisterDTO;
 
 import java.util.List;
@@ -131,7 +132,8 @@ public interface DiscoveryService {
      *
      * @param namespace the namespace
      * @param discoveryList the discovery data
+     * @param context import context
      * @return config import result
      */
-    ConfigImportResult importData(String namespace, List<DiscoveryDTO> 
discoveryList);
+    ConfigImportResult importData(String namespace, List<DiscoveryDTO> 
discoveryList, ConfigsImportContext context);
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/DiscoveryUpstreamService.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/DiscoveryUpstreamService.java
index c9828c9627..d808c194b6 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/DiscoveryUpstreamService.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/DiscoveryUpstreamService.java
@@ -20,6 +20,7 @@ package org.apache.shenyu.admin.service;
 import org.apache.shenyu.admin.model.dto.DiscoveryUpstreamDTO;
 import org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.DiscoveryUpstreamVO;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.common.dto.DiscoverySyncData;
 import org.apache.shenyu.common.dto.DiscoveryUpstreamData;
 
@@ -130,7 +131,9 @@ public interface DiscoveryUpstreamService {
      *
      * @param namespace the namespace
      * @param discoveryUpstreamList the discoveryUpstream data
+     * @param context import context
      * @return config import result
      */
-    ConfigImportResult importData(String namespace, List<DiscoveryUpstreamDTO> 
discoveryUpstreamList);
+    ConfigImportResult importData(String namespace, List<DiscoveryUpstreamDTO> 
discoveryUpstreamList,
+                                  ConfigsImportContext context);
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/NamespacePluginService.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/NamespacePluginService.java
index 09b2164d76..2af693d294 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/NamespacePluginService.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/NamespacePluginService.java
@@ -25,6 +25,7 @@ import 
org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.NamespacePluginVO;
 import org.apache.shenyu.admin.model.vo.PluginSnapshotVO;
 import org.apache.shenyu.admin.model.vo.PluginVO;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.common.dto.PluginData;
 
 import java.util.List;
@@ -149,9 +150,10 @@ public interface NamespacePluginService extends 
PageService<NamespacePluginQuery
      *
      * @param namespace  the namespace
      * @param pluginList the plugin data
+     * @param context the import context
      * @return config import result
      */
-    ConfigImportResult importData(String namespace, List<NamespacePluginDTO> 
pluginList);
+    ConfigImportResult importData(String namespace, List<NamespacePluginDTO> 
pluginList, ConfigsImportContext context);
     
     /**
      * List by namespace.
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/PluginHandleService.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/PluginHandleService.java
index 731809ee03..c7fae887bc 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/PluginHandleService.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/PluginHandleService.java
@@ -21,8 +21,9 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.shenyu.admin.model.dto.PluginHandleDTO;
 import org.apache.shenyu.admin.model.page.CommonPager;
 import org.apache.shenyu.admin.model.query.PluginHandleQuery;
-import org.apache.shenyu.admin.model.result.ShenyuAdminResult;
+import org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.PluginHandleVO;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 
 import java.util.Collection;
 import java.util.List;
@@ -108,7 +109,8 @@ public interface PluginHandleService {
     /**
      * import plugin handle list.
      * @param pluginHandleList the plugin handle list
+     * @param context the import context
      * @return shenyu admin result
      */
-    ShenyuAdminResult importData(List<PluginHandleDTO> pluginHandleList);
+    ConfigImportResult importData(List<PluginHandleDTO> pluginHandleList, 
ConfigsImportContext context);
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/PluginService.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/PluginService.java
index ba2df965b8..13105e1e70 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/PluginService.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/PluginService.java
@@ -25,6 +25,7 @@ import 
org.apache.shenyu.admin.model.query.PluginQueryCondition;
 import org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.PluginSnapshotVO;
 import org.apache.shenyu.admin.model.vo.PluginVO;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.common.dto.PluginData;
 
 import java.util.List;
@@ -130,16 +131,8 @@ public interface PluginService extends 
PageService<PluginQueryCondition, PluginV
      * import plugin data.
      *
      * @param pluginList the plugin data
+     * @param context the import context
      * @return config import result
      */
-    ConfigImportResult importData(List<PluginDTO> pluginList);
-
-    /**
-     * import plugin data.
-     *
-     * @param namespace the namespace
-     * @param pluginList the plugin data
-     * @return config import result
-     */
-    ConfigImportResult importData(String namespace, List<PluginDTO> 
pluginList);
+    ConfigImportResult importData(List<PluginDTO> pluginList, 
ConfigsImportContext context);
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/ProxySelectorService.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/ProxySelectorService.java
index 3a08798112..d8105d235a 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/ProxySelectorService.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/ProxySelectorService.java
@@ -22,6 +22,7 @@ import org.apache.shenyu.admin.model.page.CommonPager;
 import org.apache.shenyu.admin.model.query.ProxySelectorQuery;
 import org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.ProxySelectorVO;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.common.dto.ProxySelectorData;
 
 import java.util.List;
@@ -111,7 +112,8 @@ public interface ProxySelectorService {
      *
      * @param namespace namespace
      * @param proxySelectorList proxy selector data list
+     * @param context import context
      * @return config import result
      */
-    ConfigImportResult importData(String namespace, List<ProxySelectorData> 
proxySelectorList);
+    ConfigImportResult importData(String namespace, List<ProxySelectorData> 
proxySelectorList, ConfigsImportContext context);
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/RuleService.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/RuleService.java
index 298db53b0b..5c759f26e8 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/RuleService.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/RuleService.java
@@ -27,6 +27,7 @@ import org.apache.shenyu.admin.model.query.RuleQuery;
 import org.apache.shenyu.admin.model.query.RuleQueryCondition;
 import org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.RuleVO;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.common.dto.RuleData;
 import org.apache.shenyu.common.enums.OperatorEnum;
 import org.apache.shenyu.common.enums.ParamTypeEnum;
@@ -188,9 +189,10 @@ public interface RuleService extends 
PageService<RuleQueryCondition, RuleVO> {
      *
      * @param namespace namespace
      * @param ruleList rule list
+     * @param context import context
      * @return config import result
      */
-    ConfigImportResult importData(String namespace, List<RuleDTO> ruleList);
+    ConfigImportResult importData(String namespace, List<RuleDTO> ruleList, 
ConfigsImportContext context);
 
     /**
      * Enabled string by ids and namespaceId.
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/SelectorService.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/SelectorService.java
index 7ef4186765..a0934f5426 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/SelectorService.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/SelectorService.java
@@ -25,6 +25,7 @@ import org.apache.shenyu.admin.model.query.SelectorQuery;
 import org.apache.shenyu.admin.model.query.SelectorQueryCondition;
 import org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.SelectorVO;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.admin.utils.Assert;
 import org.apache.shenyu.common.dto.SelectorData;
 import org.apache.shenyu.common.enums.SelectorTypeEnum;
@@ -260,9 +261,10 @@ public interface SelectorService extends 
PageService<SelectorQueryCondition, Sel
      *
      * @param namespace    the namespace
      * @param selectorList the plugin selector list
+     * @param context import context
      * @return config import result
      */
-    ConfigImportResult importData(String namespace, List<SelectorDTO> 
selectorList);
+    ConfigImportResult importData(String namespace, List<SelectorDTO> 
selectorList, ConfigsImportContext context);
 
     /**
      * Enabled by ids and namespaceId.
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/AuthConfigsExportImportHandler.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/AuthConfigsExportImportHandler.java
new file mode 100644
index 0000000000..251738c9e0
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/AuthConfigsExportImportHandler.java
@@ -0,0 +1,68 @@
+/*
+ * 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.shenyu.admin.service.configs;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.model.dto.AppAuthDTO;
+import org.apache.shenyu.admin.model.result.ConfigImportResult;
+import org.apache.shenyu.admin.model.vo.AppAuthVO;
+import org.apache.shenyu.admin.service.AppAuthService;
+import org.apache.shenyu.common.constant.ExportImportConstants;
+import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.shenyu.common.utils.JsonUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Optional;
+
+
+@Component
+public class AuthConfigsExportImportHandler implements 
ConfigsExportImportHandler {
+
+    private final AppAuthService appAuthService;
+
+    public AuthConfigsExportImportHandler(final AppAuthService appAuthService) 
{
+        this.appAuthService = appAuthService;
+    }
+
+    @Override
+    public ConfigsExportImportEnum configsEnum() {
+        return ConfigsExportImportEnum.Auth;
+    }
+
+    @Override
+    public Optional<String> configsExport(final String namespaceId) {
+        List<AppAuthVO> authDataList = 
appAuthService.listAllDataByNamespace(namespaceId);
+        if (CollectionUtils.isNotEmpty(authDataList)) {
+            authDataList.forEach(appAuthVO -> appAuthVO.setNamespaceId(null));
+            return Optional.of(JsonUtils.toJson(authDataList));
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public void configsImport(final String namespaceId, final String data, 
final ConfigsImportContext context) {
+        List<AppAuthDTO> authDataList = GsonUtils.getInstance().fromList(data, 
AppAuthDTO.class);
+        ConfigImportResult configImportResult = 
appAuthService.importData(namespaceId, authDataList);
+        
context.getResult().put(ExportImportConstants.AUTH_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
+        if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
+            
context.getResult().put(ExportImportConstants.AUTH_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
+        }
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/ConfigsExportImportEnum.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/ConfigsExportImportEnum.java
new file mode 100644
index 0000000000..7928c64f63
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/ConfigsExportImportEnum.java
@@ -0,0 +1,101 @@
+/*
+ * 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.shenyu.admin.service.configs;
+
+public enum ConfigsExportImportEnum {
+
+    /**
+     * auth.
+     */
+    Auth("auth.json", 0),
+
+    /**
+     * meta.
+     */
+    Meta("meta.json", 1),
+
+    /**
+     * plugin template.
+     */
+    PluginTemplate("plugin_template.json", 2),
+
+    /**
+     * plugin handle.
+     */
+    PluginHandle("plugin_handle.json", 3),
+
+    /**
+     * namespace plugin.
+     */
+    NamespacePlugin("namespace_plugin.json", 4),
+
+    /**
+     * selector.
+     */
+    Selector("selector.json", 5),
+
+    /**
+     * rule.
+     */
+    Rule("rule.json", 6),
+
+    /**
+     * dict.
+     */
+    Dict("dict.json", 7),
+
+    /**
+     * proxy selector.
+     */
+    ProxySelector("proxy_selector.json", 8),
+
+    /**
+     * discovery.
+     */
+    Discovery("discovery.json", 9),
+
+    /**
+     * discovery upstream.
+     */
+    DiscoveryUpstream("discovery_upstream.json", 10);
+
+    /**
+     * zip item name.
+     */
+    private String configName;
+
+    /**
+     * the import order.
+     *
+     * @return The smaller, the earlier it will be executed
+     */
+    private int importOrder;
+
+    ConfigsExportImportEnum(final String configName, final int importOrder) {
+        this.configName = configName;
+        this.importOrder = importOrder;
+    }
+
+    public String getConfigName() {
+        return configName;
+    }
+
+    public int getImportOrder() {
+        return importOrder;
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/provider/MetaDataPathProvider.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/ConfigsExportImportHandler.java
similarity index 55%
rename from 
shenyu-admin/src/main/java/org/apache/shenyu/admin/service/provider/MetaDataPathProvider.java
rename to 
shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/ConfigsExportImportHandler.java
index 910c678327..103a0007f5 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/provider/MetaDataPathProvider.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/ConfigsExportImportHandler.java
@@ -15,28 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.shenyu.admin.service.provider;
+package org.apache.shenyu.admin.service.configs;
 
-import org.apache.shenyu.admin.mapper.MetaDataMapper;
-import org.apache.shenyu.admin.validation.ExistProvider;
-import org.springframework.stereotype.Component;
 
-import java.io.Serializable;
+import java.util.Optional;
 
-/**
- * MetaDataPathProvider.
- */
-@Component
-public class MetaDataPathProvider implements ExistProvider {
-    
-    private final MetaDataMapper metaDataMapper;
-    
-    public MetaDataPathProvider(final MetaDataMapper metaDataMapper) {
-        this.metaDataMapper = metaDataMapper;
-    }
-    
-    @Override
-    public Boolean existed(final Serializable key) {
-        return metaDataMapper.pathExisted(key);
-    }
+public interface ConfigsExportImportHandler {
+
+    ConfigsExportImportEnum configsEnum();
+
+    Optional<String> configsExport(String namespaceId);
+
+    void configsImport(String namespaceId, String data, ConfigsImportContext 
context);
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/ConfigsImportContext.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/ConfigsImportContext.java
new file mode 100644
index 0000000000..f722ac26ee
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/ConfigsImportContext.java
@@ -0,0 +1,70 @@
+/*
+ * 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.shenyu.admin.service.configs;
+
+import com.google.common.collect.Maps;
+
+import java.util.Map;
+
+public class ConfigsImportContext {
+
+    /**
+     * the import result.
+     */
+    private final Map<String, Object> result = Maps.newHashMap();
+
+    /**
+     * export selector id -> new or exist selector id.
+     */
+    private final Map<String, String> selectorIdMapping = Maps.newHashMap();
+
+    /**
+     * export proxy selector id -> new or exist proxy selector id.
+     */
+    private final Map<String, String> proxySelectorIdMapping = 
Maps.newHashMap();
+
+    /**
+     * export discovery handler id -> new or exist discovery handler id.
+     */
+    private final Map<String, String> discoveryHandlerIdMapping = 
Maps.newHashMap();
+
+    /**
+     * export plugin template id -> new or exist plugin template id.
+     */
+    private final Map<String, String> pluginTemplateIdMapping = 
Maps.newHashMap();
+
+    public Map<String, Object> getResult() {
+        return result;
+    }
+
+    public Map<String, String> getSelectorIdMapping() {
+        return selectorIdMapping;
+    }
+
+    public Map<String, String> getProxySelectorIdMapping() {
+        return proxySelectorIdMapping;
+    }
+
+    public Map<String, String> getDiscoveryHandlerIdMapping() {
+        return discoveryHandlerIdMapping;
+    }
+
+    public Map<String, String> getPluginTemplateIdMapping() {
+        return pluginTemplateIdMapping;
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/DictDataConfigsExportImportHandler.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/DictDataConfigsExportImportHandler.java
new file mode 100644
index 0000000000..bc901f81f0
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/DictDataConfigsExportImportHandler.java
@@ -0,0 +1,69 @@
+/*
+ * 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.shenyu.admin.service.configs;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.model.dto.ShenyuDictDTO;
+import org.apache.shenyu.admin.model.result.ConfigImportResult;
+import org.apache.shenyu.admin.model.vo.ShenyuDictVO;
+import org.apache.shenyu.admin.service.ShenyuDictService;
+import org.apache.shenyu.common.constant.ExportImportConstants;
+import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.shenyu.common.utils.JsonUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Optional;
+
+@Component
+public class DictDataConfigsExportImportHandler implements 
ConfigsExportImportHandler {
+
+    /**
+     * The Dict service.
+     */
+    private final ShenyuDictService shenyuDictService;
+
+    public DictDataConfigsExportImportHandler(final ShenyuDictService 
shenyuDictService) {
+        this.shenyuDictService = shenyuDictService;
+    }
+
+    @Override
+    public ConfigsExportImportEnum configsEnum() {
+        return ConfigsExportImportEnum.Dict;
+    }
+
+    @Override
+    public Optional<String> configsExport(final String namespaceId) {
+        List<ShenyuDictVO> dictDataList = shenyuDictService.listAllData();
+        if (CollectionUtils.isNotEmpty(dictDataList)) {
+            return Optional.of(JsonUtils.toJson(dictDataList));
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public void configsImport(final String namespaceId, final String data, 
final ConfigsImportContext context) {
+        List<ShenyuDictDTO> dictList = GsonUtils.getInstance().fromList(data, 
ShenyuDictDTO.class);
+        ConfigImportResult configImportResult = 
shenyuDictService.importData(dictList);
+        
context.getResult().put(ExportImportConstants.DICT_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
+        if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
+            
context.getResult().put(ExportImportConstants.DICT_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
+        }
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/DiscoveryDataConfigsExportImportHandler.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/DiscoveryDataConfigsExportImportHandler.java
new file mode 100644
index 0000000000..254aeac5f5
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/DiscoveryDataConfigsExportImportHandler.java
@@ -0,0 +1,67 @@
+/*
+ * 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.shenyu.admin.service.configs;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.model.dto.DiscoveryDTO;
+import org.apache.shenyu.admin.model.result.ConfigImportResult;
+import org.apache.shenyu.admin.model.vo.DiscoveryVO;
+import org.apache.shenyu.admin.service.DiscoveryService;
+import org.apache.shenyu.common.constant.ExportImportConstants;
+import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.shenyu.common.utils.JsonUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Optional;
+
+@Component
+public class DiscoveryDataConfigsExportImportHandler implements 
ConfigsExportImportHandler {
+
+    private final DiscoveryService discoveryService;
+
+    public DiscoveryDataConfigsExportImportHandler(final DiscoveryService 
discoveryService) {
+        this.discoveryService = discoveryService;
+    }
+
+    @Override
+    public ConfigsExportImportEnum configsEnum() {
+        return ConfigsExportImportEnum.Discovery;
+    }
+
+    @Override
+    public Optional<String> configsExport(final String namespaceId) {
+        List<DiscoveryVO> discoveryList = 
discoveryService.listAllDataByNamespaceId(namespaceId);
+        if (CollectionUtils.isNotEmpty(discoveryList)) {
+            discoveryList.forEach(discoveryVO -> 
discoveryVO.setNamespaceId(null));
+            return Optional.of(JsonUtils.toJson(discoveryList));
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public void configsImport(final String namespaceId, final String data, 
final ConfigsImportContext context) {
+        List<DiscoveryDTO> discoveryList = 
GsonUtils.getInstance().fromList(data, DiscoveryDTO.class);
+        ConfigImportResult configImportResult = 
discoveryService.importData(namespaceId, discoveryList, context);
+        
context.getResult().put(ExportImportConstants.DISCOVERY_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
+        if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
+            
context.getResult().put(ExportImportConstants.DISCOVERY_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
+        }
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/DiscoveryUpstreamDataConfigsExportImportHandler.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/DiscoveryUpstreamDataConfigsExportImportHandler.java
new file mode 100644
index 0000000000..8e6e260343
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/DiscoveryUpstreamDataConfigsExportImportHandler.java
@@ -0,0 +1,66 @@
+/*
+ * 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.shenyu.admin.service.configs;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.model.dto.DiscoveryUpstreamDTO;
+import org.apache.shenyu.admin.model.result.ConfigImportResult;
+import org.apache.shenyu.admin.model.vo.DiscoveryUpstreamVO;
+import org.apache.shenyu.admin.service.DiscoveryUpstreamService;
+import org.apache.shenyu.common.constant.ExportImportConstants;
+import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.shenyu.common.utils.JsonUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Optional;
+
+@Component
+public class DiscoveryUpstreamDataConfigsExportImportHandler implements 
ConfigsExportImportHandler {
+
+    private final DiscoveryUpstreamService discoveryUpstreamService;
+
+    public DiscoveryUpstreamDataConfigsExportImportHandler(final 
DiscoveryUpstreamService discoveryUpstreamService) {
+        this.discoveryUpstreamService = discoveryUpstreamService;
+    }
+
+    @Override
+    public ConfigsExportImportEnum configsEnum() {
+        return ConfigsExportImportEnum.DiscoveryUpstream;
+    }
+
+    @Override
+    public Optional<String> configsExport(final String namespaceId) {
+        List<DiscoveryUpstreamVO> discoveryUpstreamList = 
discoveryUpstreamService.listAllDataByNamespaceId(namespaceId);
+        if (CollectionUtils.isNotEmpty(discoveryUpstreamList)) {
+            return Optional.of(JsonUtils.toJson(discoveryUpstreamList));
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public void configsImport(final String namespaceId, final String data, 
final ConfigsImportContext context) {
+        List<DiscoveryUpstreamDTO> discoveryUpstreamList = 
GsonUtils.getInstance().fromList(data, DiscoveryUpstreamDTO.class);
+        ConfigImportResult configImportResult = 
discoveryUpstreamService.importData(namespaceId, discoveryUpstreamList, 
context);
+        
context.getResult().put(ExportImportConstants.DISCOVERY_UPSTREAM_IMPORT_SUCCESS_COUNT,
 configImportResult.getSuccessCount());
+        if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
+            
context.getResult().put(ExportImportConstants.DISCOVERY_UPSTREAM_IMPORT_FAIL_MESSAGE,
 configImportResult.getFailMessage());
+        }
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/MetadataConfigsExportImportHandler.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/MetadataConfigsExportImportHandler.java
new file mode 100644
index 0000000000..450f979c83
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/MetadataConfigsExportImportHandler.java
@@ -0,0 +1,67 @@
+/*
+ * 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.shenyu.admin.service.configs;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.model.dto.MetaDataDTO;
+import org.apache.shenyu.admin.model.result.ConfigImportResult;
+import org.apache.shenyu.admin.model.vo.MetaDataVO;
+import org.apache.shenyu.admin.service.MetaDataService;
+import org.apache.shenyu.common.constant.ExportImportConstants;
+import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.shenyu.common.utils.JsonUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Optional;
+
+@Component
+public class MetadataConfigsExportImportHandler implements 
ConfigsExportImportHandler {
+
+    private final MetaDataService metaDataService;
+
+    public MetadataConfigsExportImportHandler(final MetaDataService 
metaDataService) {
+        this.metaDataService = metaDataService;
+    }
+
+    @Override
+    public ConfigsExportImportEnum configsEnum() {
+        return ConfigsExportImportEnum.Meta;
+    }
+
+    @Override
+    public Optional<String> configsExport(final String namespaceId) {
+        List<MetaDataVO> metaDataList = 
metaDataService.listAllDataByNamespaceId(namespaceId);
+        if (CollectionUtils.isNotEmpty(metaDataList)) {
+            metaDataList.forEach(metaDataVO -> 
metaDataVO.setNamespaceId(null));
+            return Optional.of(JsonUtils.toJson(metaDataList));
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public void configsImport(final String namespaceId, final String data, 
final ConfigsImportContext context) {
+        List<MetaDataDTO> metaDataList = 
GsonUtils.getInstance().fromList(data, MetaDataDTO.class);
+        ConfigImportResult configImportResult = 
metaDataService.importData(namespaceId, metaDataList);
+        
context.getResult().put(ExportImportConstants.META_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
+        if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
+            
context.getResult().put(ExportImportConstants.META_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
+        }
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/NamespacePluginDataConfigsExportImportHandler.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/NamespacePluginDataConfigsExportImportHandler.java
new file mode 100644
index 0000000000..0b036b6426
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/NamespacePluginDataConfigsExportImportHandler.java
@@ -0,0 +1,67 @@
+/*
+ * 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.shenyu.admin.service.configs;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.model.dto.NamespacePluginDTO;
+import org.apache.shenyu.admin.model.result.ConfigImportResult;
+import org.apache.shenyu.admin.model.vo.NamespacePluginVO;
+import org.apache.shenyu.admin.service.NamespacePluginService;
+import org.apache.shenyu.common.constant.ExportImportConstants;
+import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.shenyu.common.utils.JsonUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Optional;
+
+@Component
+public class NamespacePluginDataConfigsExportImportHandler implements 
ConfigsExportImportHandler {
+
+    private final NamespacePluginService namespacePluginService;
+
+    public NamespacePluginDataConfigsExportImportHandler(final 
NamespacePluginService namespacePluginService) {
+        this.namespacePluginService = namespacePluginService;
+    }
+
+    @Override
+    public ConfigsExportImportEnum configsEnum() {
+        return ConfigsExportImportEnum.NamespacePlugin;
+    }
+
+    @Override
+    public Optional<String> configsExport(final String namespaceId) {
+        List<NamespacePluginVO> namespacePluginVOList = 
namespacePluginService.listAllData(namespaceId);
+        if (CollectionUtils.isNotEmpty(namespacePluginVOList)) {
+            namespacePluginVOList.forEach(plugin -> 
plugin.setNamespaceId(null));
+            return Optional.of(JsonUtils.toJson(namespacePluginVOList));
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public void configsImport(final String namespaceId, final String data, 
final ConfigsImportContext context) {
+        List<NamespacePluginDTO> pluginList = 
GsonUtils.getInstance().fromList(data, NamespacePluginDTO.class);
+        ConfigImportResult configImportResult = 
namespacePluginService.importData(namespaceId, pluginList, context);
+        
context.getResult().put(ExportImportConstants.NAMESPACE_PLUGIN_IMPORT_SUCCESS_COUNT,
 configImportResult.getSuccessCount());
+        if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
+            
context.getResult().put(ExportImportConstants.NAMESPACE_PLUGIN_IMPORT_FAIL_MESSAGE,
 configImportResult.getFailMessage());
+        }
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/PluginHandleDataConfigsExportImportHandler.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/PluginHandleDataConfigsExportImportHandler.java
new file mode 100644
index 0000000000..e47b955748
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/PluginHandleDataConfigsExportImportHandler.java
@@ -0,0 +1,66 @@
+/*
+ * 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.shenyu.admin.service.configs;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.model.dto.PluginHandleDTO;
+import org.apache.shenyu.admin.model.result.ConfigImportResult;
+import org.apache.shenyu.admin.model.vo.PluginHandleVO;
+import org.apache.shenyu.admin.service.PluginHandleService;
+import org.apache.shenyu.common.constant.ExportImportConstants;
+import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.shenyu.common.utils.JsonUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Optional;
+
+@Component
+public class PluginHandleDataConfigsExportImportHandler implements 
ConfigsExportImportHandler {
+
+    private final PluginHandleService pluginHandleService;
+
+    public PluginHandleDataConfigsExportImportHandler(final 
PluginHandleService pluginHandleService) {
+        this.pluginHandleService = pluginHandleService;
+    }
+
+    @Override
+    public ConfigsExportImportEnum configsEnum() {
+        return ConfigsExportImportEnum.PluginHandle;
+    }
+
+    @Override
+    public Optional<String> configsExport(final String namespaceId) {
+        List<PluginHandleVO> pluginHandleList = 
pluginHandleService.listAllData();
+        if (CollectionUtils.isNotEmpty(pluginHandleList)) {
+            return Optional.of(JsonUtils.toJson(pluginHandleList));
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public void configsImport(final String namespaceId, final String data, 
final ConfigsImportContext context) {
+        List<PluginHandleDTO> pluginHandleList = 
GsonUtils.getInstance().fromList(data, PluginHandleDTO.class);
+        ConfigImportResult configImportResult = 
pluginHandleService.importData(pluginHandleList, context);
+        
context.getResult().put(ExportImportConstants.PLUGIN_HANDLE_IMPORT_SUCCESS_COUNT,
 configImportResult.getSuccessCount());
+        if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
+            
context.getResult().put(ExportImportConstants.PLUGIN_HANDLE_IMPORT_FAIL_MESSAGE,
 configImportResult.getFailMessage());
+        }
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/PluginTemplateDataConfigsExportImportHandler.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/PluginTemplateDataConfigsExportImportHandler.java
new file mode 100644
index 0000000000..459188cdf8
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/PluginTemplateDataConfigsExportImportHandler.java
@@ -0,0 +1,66 @@
+/*
+ * 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.shenyu.admin.service.configs;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.model.dto.PluginDTO;
+import org.apache.shenyu.admin.model.result.ConfigImportResult;
+import org.apache.shenyu.admin.model.vo.PluginVO;
+import org.apache.shenyu.admin.service.PluginService;
+import org.apache.shenyu.common.constant.ExportImportConstants;
+import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.shenyu.common.utils.JsonUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Optional;
+
+@Component
+public class PluginTemplateDataConfigsExportImportHandler implements 
ConfigsExportImportHandler {
+
+    private final PluginService pluginService;
+
+    public PluginTemplateDataConfigsExportImportHandler(final PluginService 
pluginService) {
+        this.pluginService = pluginService;
+    }
+
+    @Override
+    public ConfigsExportImportEnum configsEnum() {
+        return ConfigsExportImportEnum.PluginTemplate;
+    }
+
+    @Override
+    public Optional<String> configsExport(final String namespaceId) {
+        List<PluginVO> pluginDataList = pluginService.listAllData();
+        if (CollectionUtils.isNotEmpty(pluginDataList)) {
+            return Optional.of(JsonUtils.toJson(pluginDataList));
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public void configsImport(final String namespaceId, final String data, 
final ConfigsImportContext context) {
+        List<PluginDTO> pluginList = GsonUtils.getInstance().fromList(data, 
PluginDTO.class);
+        ConfigImportResult configImportResult = 
pluginService.importData(pluginList, context);
+        
context.getResult().put(ExportImportConstants.PLUGIN_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
+        if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
+            
context.getResult().put(ExportImportConstants.PLUGIN_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
+        }
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/ProxySelectorDataConfigsExportImportHandler.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/ProxySelectorDataConfigsExportImportHandler.java
new file mode 100644
index 0000000000..9eab060b41
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/ProxySelectorDataConfigsExportImportHandler.java
@@ -0,0 +1,66 @@
+/*
+ * 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.shenyu.admin.service.configs;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.model.result.ConfigImportResult;
+import org.apache.shenyu.admin.service.ProxySelectorService;
+import org.apache.shenyu.common.constant.ExportImportConstants;
+import org.apache.shenyu.common.dto.ProxySelectorData;
+import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.shenyu.common.utils.JsonUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Optional;
+
+@Component
+public class ProxySelectorDataConfigsExportImportHandler implements 
ConfigsExportImportHandler {
+
+    private final ProxySelectorService proxySelectorService;
+
+    public ProxySelectorDataConfigsExportImportHandler(final 
ProxySelectorService proxySelectorService) {
+        this.proxySelectorService = proxySelectorService;
+    }
+
+    @Override
+    public ConfigsExportImportEnum configsEnum() {
+        return ConfigsExportImportEnum.ProxySelector;
+    }
+
+    @Override
+    public Optional<String> configsExport(final String namespaceId) {
+        List<ProxySelectorData> proxySelectorDataList = 
proxySelectorService.listAllByNamespaceId(namespaceId);
+        if (CollectionUtils.isNotEmpty(proxySelectorDataList)) {
+            proxySelectorDataList.forEach(proxySelectorData -> 
proxySelectorData.setNamespaceId(null));
+            return Optional.of(JsonUtils.toJson(proxySelectorDataList));
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public void configsImport(final String namespaceId, final String data, 
final ConfigsImportContext context) {
+        List<ProxySelectorData> proxySelectorList = 
GsonUtils.getInstance().fromList(data, ProxySelectorData.class);
+        ConfigImportResult configImportResult = 
proxySelectorService.importData(namespaceId, proxySelectorList, context);
+        
context.getResult().put(ExportImportConstants.PROXY_SELECTOR_IMPORT_SUCCESS_COUNT,
 configImportResult.getSuccessCount());
+        if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
+            
context.getResult().put(ExportImportConstants.PROXY_SELECTOR_IMPORT_FAIL_MESSAGE,
 configImportResult.getFailMessage());
+        }
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/RuleDataConfigsExportImportHandler.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/RuleDataConfigsExportImportHandler.java
new file mode 100644
index 0000000000..192982aa43
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/RuleDataConfigsExportImportHandler.java
@@ -0,0 +1,66 @@
+/*
+ * 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.shenyu.admin.service.configs;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.model.dto.RuleDTO;
+import org.apache.shenyu.admin.model.result.ConfigImportResult;
+import org.apache.shenyu.admin.model.vo.RuleVO;
+import org.apache.shenyu.admin.service.RuleService;
+import org.apache.shenyu.common.constant.ExportImportConstants;
+import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.shenyu.common.utils.JsonUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Optional;
+
+@Component
+public class RuleDataConfigsExportImportHandler implements 
ConfigsExportImportHandler {
+
+    private final RuleService ruleService;
+
+    public RuleDataConfigsExportImportHandler(final RuleService ruleService) {
+        this.ruleService = ruleService;
+    }
+
+    @Override
+    public ConfigsExportImportEnum configsEnum() {
+        return ConfigsExportImportEnum.Rule;
+    }
+
+    @Override
+    public Optional<String> configsExport(final String namespaceId) {
+        List<RuleVO> ruleDataList = 
ruleService.listAllDataByNamespaceId(namespaceId);
+        if (CollectionUtils.isNotEmpty(ruleDataList)) {
+            return Optional.of(JsonUtils.toJson(ruleDataList));
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public void configsImport(final String namespaceId, final String data, 
final ConfigsImportContext context) {
+        List<RuleDTO> ruleList = GsonUtils.getInstance().fromList(data, 
RuleDTO.class);
+        ConfigImportResult configImportResult = 
ruleService.importData(namespaceId, ruleList, context);
+        
context.getResult().put(ExportImportConstants.RULE_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
+        if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
+            
context.getResult().put(ExportImportConstants.RULE_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
+        }
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/SelectorDataConfigsExportImportHandler.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/SelectorDataConfigsExportImportHandler.java
new file mode 100644
index 0000000000..bbf33bec1e
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/configs/SelectorDataConfigsExportImportHandler.java
@@ -0,0 +1,67 @@
+/*
+ * 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.shenyu.admin.service.configs;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.model.dto.SelectorDTO;
+import org.apache.shenyu.admin.model.result.ConfigImportResult;
+import org.apache.shenyu.admin.model.vo.SelectorVO;
+import org.apache.shenyu.admin.service.SelectorService;
+import org.apache.shenyu.common.constant.ExportImportConstants;
+import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.shenyu.common.utils.JsonUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Optional;
+
+@Component
+public class SelectorDataConfigsExportImportHandler implements 
ConfigsExportImportHandler {
+
+    private final SelectorService selectorService;
+
+    public SelectorDataConfigsExportImportHandler(final SelectorService 
selectorService) {
+        this.selectorService = selectorService;
+    }
+
+    @Override
+    public ConfigsExportImportEnum configsEnum() {
+        return ConfigsExportImportEnum.Selector;
+    }
+
+    @Override
+    public Optional<String> configsExport(final String namespaceId) {
+        List<SelectorVO> selectorDataList = 
selectorService.listAllDataByNamespaceId(namespaceId);
+        if (CollectionUtils.isNotEmpty(selectorDataList)) {
+            selectorDataList.forEach(selectorVO -> 
selectorVO.setNamespaceId(null));
+            return Optional.of(JsonUtils.toJson(selectorDataList));
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public void configsImport(final String namespaceId, final String data, 
final ConfigsImportContext context) {
+        List<SelectorDTO> selectorList = 
GsonUtils.getInstance().fromList(data, SelectorDTO.class);
+        ConfigImportResult configImportResult = 
selectorService.importData(namespaceId, selectorList, context);
+        
context.getResult().put(ExportImportConstants.SELECTOR_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
+        if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
+            
context.getResult().put(ExportImportConstants.SELECTOR_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
+        }
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AppAuthServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AppAuthServiceImpl.java
index ee5bcb6e08..39f13ee5cd 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AppAuthServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AppAuthServiceImpl.java
@@ -248,16 +248,18 @@ public class AppAuthServiceImpl implements AppAuthService 
{
         Map<String, List<AuthParamData>> paramMap = 
this.prepareAuthParamData(idList);
         Map<String, List<AuthPathData>> pathMap = 
this.prepareAuthPathData(idList);
 
-        List<AppAuthData> dataList = appAuthDOList.stream()
+        Map<String, List<AppAuthData>> namespaceDataList = 
appAuthDOList.stream()
                 .filter(Objects::nonNull)
                 .map(appAuthDO -> {
                     String id = appAuthDO.getId();
                     return buildByEntityWithParamAndPath(appAuthDO, 
paramMap.get(id), pathMap.get(id));
                 })
-                .collect(Collectors.toList());
-        eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.APP_AUTH,
-                DataEventTypeEnum.REFRESH,
-                dataList));
+                .collect(Collectors.groupingBy(AppAuthData::getNamespaceId));
+        namespaceDataList.values().forEach(dataList -> {
+            eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.APP_AUTH,
+                    DataEventTypeEnum.REFRESH,
+                    dataList));
+        });
 
         return ShenyuAdminResult.success();
     }
@@ -330,6 +332,7 @@ public class AppAuthServiceImpl implements AppAuthService {
     }
     
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public ConfigImportResult importData(final String namespace, final 
List<AppAuthDTO> authDataList) {
         if (CollectionUtils.isEmpty(authDataList)) {
             return ConfigImportResult.success();
@@ -359,6 +362,7 @@ public class AppAuthServiceImpl implements AppAuthService {
             // create
             String authId = UUIDUtils.getInstance().generateShortUuid();
             appAuthDO.setId(authId);
+            appAuthDO.setNamespaceId(namespace);
             int inserted = appAuthMapper.insertSelective(appAuthDO);
             if (inserted > 0) {
                 successCount++;
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ConfigsServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ConfigsServiceImpl.java
index bc2ea0f906..99842dc26a 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ConfigsServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ConfigsServiceImpl.java
@@ -25,7 +25,6 @@ import org.apache.shenyu.admin.model.dto.AppAuthDTO;
 import org.apache.shenyu.admin.model.dto.DiscoveryDTO;
 import org.apache.shenyu.admin.model.dto.DiscoveryUpstreamDTO;
 import org.apache.shenyu.admin.model.dto.MetaDataDTO;
-import org.apache.shenyu.admin.model.dto.NamespacePluginDTO;
 import org.apache.shenyu.admin.model.dto.PluginDTO;
 import org.apache.shenyu.admin.model.dto.RuleDTO;
 import org.apache.shenyu.admin.model.dto.SelectorDTO;
@@ -54,19 +53,23 @@ import org.apache.shenyu.admin.service.ProxySelectorService;
 import org.apache.shenyu.admin.service.RuleService;
 import org.apache.shenyu.admin.service.SelectorService;
 import org.apache.shenyu.admin.service.ShenyuDictService;
+import org.apache.shenyu.admin.service.configs.ConfigsExportImportHandler;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.admin.utils.ZipUtil;
 import org.apache.shenyu.admin.utils.ZipUtil.ZipItem;
 import org.apache.shenyu.common.constant.ExportImportConstants;
 import org.apache.shenyu.common.dto.ProxySelectorData;
 import org.apache.shenyu.common.utils.GsonUtils;
 import org.apache.shenyu.common.utils.JsonUtils;
-import org.apache.shenyu.common.utils.UUIDUtils;
+import org.apache.shenyu.common.utils.ListUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
+import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * Implementation of the {@link 
org.apache.shenyu.admin.service.ConfigsService}.
@@ -131,6 +134,11 @@ public class ConfigsServiceImpl implements ConfigsService {
      */
     private final DiscoveryUpstreamService discoveryUpstreamService;
 
+    /**
+     * The configs export import handlers.
+     */
+    private final List<ConfigsExportImportHandler> configsExportImportHandlers;
+
     public ConfigsServiceImpl(final AppAuthService appAuthService,
                                          final PluginService pluginService,
                                          final NamespacePluginService 
namespacePluginService,
@@ -141,7 +149,8 @@ public class ConfigsServiceImpl implements ConfigsService {
                                          final ShenyuDictService 
shenyuDictService,
                                          final ProxySelectorService 
proxySelectorService,
                                          final DiscoveryService 
discoveryService,
-                                         final DiscoveryUpstreamService 
discoveryUpstreamService) {
+                                         final DiscoveryUpstreamService 
discoveryUpstreamService,
+                                         final 
List<ConfigsExportImportHandler> configsExportImportHandlers) {
         this.appAuthService = appAuthService;
         this.pluginService = pluginService;
         this.namespacePluginService = namespacePluginService;
@@ -153,6 +162,8 @@ public class ConfigsServiceImpl implements ConfigsService {
         this.proxySelectorService = proxySelectorService;
         this.discoveryService = discoveryService;
         this.discoveryUpstreamService = discoveryUpstreamService;
+        this.configsExportImportHandlers = configsExportImportHandlers.stream()
+                .sorted(Comparator.comparingInt(c -> 
c.configsEnum().getImportOrder())).toList();
     }
 
     @Override
@@ -182,29 +193,12 @@ public class ConfigsServiceImpl implements ConfigsService 
{
     @Override
     public ShenyuAdminResult configsExport(final String namespace) {
         List<ZipUtil.ZipItem> zipItemList = Lists.newArrayList();
-        
-        exportAuthData(namespace, zipItemList);
-        
-        exportMetadata(namespace, zipItemList);
-        
-        exportNamespacePluginData(namespace, zipItemList);
-        
-        exportSelectorData(namespace, zipItemList);
-        
-        exportRuleData(namespace, zipItemList);
-        
-        exportDictData(zipItemList);
-        
-        exportPluginTemplateData(zipItemList);
-        
-        exportPluginHandleData(zipItemList);
-        
-        exportProxySelectorData(namespace, zipItemList);
-        
-        exportDiscoveryData(namespace, zipItemList);
-        
-        exportDiscoveryUpstreamData(namespace, zipItemList);
-        
+
+        for (ConfigsExportImportHandler configsExportImportHandler : 
configsExportImportHandlers) {
+            configsExportImportHandler.configsExport(namespace)
+                    .ifPresent(data -> zipItemList.add(new 
ZipUtil.ZipItem(configsExportImportHandler.configsEnum().getConfigName(), 
data)));
+        }
+
         return ShenyuAdminResult.success(ZipUtil.zip(zipItemList));
     }
     
@@ -399,44 +393,15 @@ public class ConfigsServiceImpl implements ConfigsService 
{
             LOG.info("import file is empty");
             return ShenyuAdminResult.success();
         }
-        Map<String, Object> result = Maps.newHashMap();
-        for (ZipUtil.ZipItem zipItem : zipItemList) {
-            switch (zipItem.getItemName()) {
-                case ExportImportConstants.AUTH_JSON:
-                    importAuthData(namespace, result, zipItem);
-                    break;
-                case ExportImportConstants.META_JSON:
-                    importMetaData(namespace, result, zipItem);
-                    break;
-                case ExportImportConstants.PLUGIN_TEMPLATE_JSON:
-                    importPluginTemplateData(result, zipItem);
-                    break;
-                case ExportImportConstants.NAMESPACE_PLUGIN_JSON:
-                    importNamespacePluginData(namespace, result, zipItem);
-                    break;
-                case ExportImportConstants.SELECTOR_JSON:
-                    importSelectorData(namespace, result, zipItem);
-                    break;
-                case ExportImportConstants.RULE_JSON:
-                    importRuleData(namespace, result, zipItem);
-                    break;
-                case ExportImportConstants.DICT_JSON:
-                    importDictData(result, zipItem);
-                    break;
-                case ExportImportConstants.PROXY_SELECTOR_JSON:
-                    importProxySelectorData(namespace, result, zipItem);
-                    break;
-                case ExportImportConstants.DISCOVERY_JSON:
-                    importDiscoveryData(namespace, result, zipItem);
-                    break;
-                case ExportImportConstants.DISCOVERY_UPSTREAM_JSON:
-                    importDiscoveryUpstreamData(namespace, result, zipItem);
-                    break;
-                default:
-                    break;
+        ConfigsImportContext context = new ConfigsImportContext();
+        Map<String, ZipUtil.ZipItem> zipItemNameMap = 
ListUtil.toMap(zipItemList, ZipUtil.ZipItem::getItemName);
+        for (ConfigsExportImportHandler configsExportImportHandler : 
configsExportImportHandlers) {
+            ZipUtil.ZipItem zipItem = 
zipItemNameMap.get(configsExportImportHandler.configsEnum().getConfigName());
+            if (Objects.nonNull(zipItem) && 
StringUtils.isNoneBlank(zipItem.getItemData())) {
+                configsExportImportHandler.configsImport(namespace, 
zipItem.getItemData(), context);
             }
         }
-        return ShenyuAdminResult.success(result);
+        return ShenyuAdminResult.success(context.getResult());
     }
     
     private void importDiscoveryUpstreamData(final Map<String, Object> result, 
final ZipUtil.ZipItem zipItem) {
@@ -450,20 +415,6 @@ public class ConfigsServiceImpl implements ConfigsService {
             }
         }
     }
-    
-    private void importDiscoveryUpstreamData(final String namespace, final 
Map<String, Object> result, final ZipUtil.ZipItem zipItem) {
-        String discoveryUpstreamJson = zipItem.getItemData();
-        if (StringUtils.isNotEmpty(discoveryUpstreamJson)) {
-            List<DiscoveryUpstreamDTO> discoveryUpstreamList = 
GsonUtils.getInstance().fromList(discoveryUpstreamJson, 
DiscoveryUpstreamDTO.class);
-            // set namespaceId
-            discoveryUpstreamList.forEach(discoveryUpstreamDTO -> 
discoveryUpstreamDTO.setNamespaceId(namespace));
-            ConfigImportResult configImportResult = 
discoveryUpstreamService.importData(namespace, discoveryUpstreamList);
-            
result.put(ExportImportConstants.DISCOVERY_UPSTREAM_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
-            if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
-                
result.put(ExportImportConstants.DISCOVERY_UPSTREAM_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
-            }
-        }
-    }
 
     private void importDiscoveryData(final Map<String, Object> result, final 
ZipUtil.ZipItem zipItem) {
         String discoveryJson = zipItem.getItemData();
@@ -477,20 +428,6 @@ public class ConfigsServiceImpl implements ConfigsService {
         }
     }
 
-    private void importDiscoveryData(final String namespace, final Map<String, 
Object> result, final ZipUtil.ZipItem zipItem) {
-        String discoveryJson = zipItem.getItemData();
-        if (StringUtils.isNotEmpty(discoveryJson)) {
-            List<DiscoveryDTO> discoveryList = 
GsonUtils.getInstance().fromList(discoveryJson, DiscoveryDTO.class);
-            // set namespaceId
-            discoveryList.forEach(discoveryDTO -> 
discoveryDTO.setNamespaceId(namespace));
-            ConfigImportResult configImportResult = 
discoveryService.importData(namespace, discoveryList);
-            result.put(ExportImportConstants.DISCOVERY_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
-            if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
-                
result.put(ExportImportConstants.DISCOVERY_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
-            }
-        }
-    }
-
     private void importProxySelectorData(final Map<String, Object> result, 
final ZipUtil.ZipItem zipItem) {
         String proxySelectorJson = zipItem.getItemData();
         if (StringUtils.isNotEmpty(proxySelectorJson)) {
@@ -503,20 +440,6 @@ public class ConfigsServiceImpl implements ConfigsService {
         }
     }
 
-    private void importProxySelectorData(final String namespace, final 
Map<String, Object> result, final ZipUtil.ZipItem zipItem) {
-        String proxySelectorJson = zipItem.getItemData();
-        if (StringUtils.isNotEmpty(proxySelectorJson)) {
-            List<ProxySelectorData> proxySelectorList = 
GsonUtils.getInstance().fromList(proxySelectorJson, ProxySelectorData.class);
-            // set namespaceId
-            proxySelectorList.forEach(proxySelectorData -> 
proxySelectorData.setNamespaceId(namespace));
-            ConfigImportResult configImportResult = 
proxySelectorService.importData(namespace, proxySelectorList);
-            
result.put(ExportImportConstants.PROXY_SELECTOR_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
-            if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
-                
result.put(ExportImportConstants.PROXY_SELECTOR_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
-            }
-        }
-    }
-
     private void importDictData(final Map<String, Object> result, final 
ZipUtil.ZipItem zipItem) {
         String dictJson = zipItem.getItemData();
         if (StringUtils.isNotEmpty(dictJson)) {
@@ -541,20 +464,6 @@ public class ConfigsServiceImpl implements ConfigsService {
         }
     }
 
-    private void importRuleData(final String namespace, final Map<String, 
Object> result, final ZipUtil.ZipItem zipItem) {
-        String ruleJson = zipItem.getItemData();
-        if (StringUtils.isNotEmpty(ruleJson)) {
-            List<RuleDTO> ruleList = 
GsonUtils.getInstance().fromList(ruleJson, RuleDTO.class);
-            // set namespaceId
-            ruleList.forEach(ruleDTO -> ruleDTO.setNamespaceId(namespace));
-            ConfigImportResult configImportResult = 
ruleService.importData(namespace, ruleList);
-            result.put(ExportImportConstants.RULE_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
-            if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
-                result.put(ExportImportConstants.RULE_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
-            }
-        }
-    }
-
     private void importSelectorData(final Map<String, Object> result, final 
ZipUtil.ZipItem zipItem) {
         String selectorJson = zipItem.getItemData();
         if (StringUtils.isNotEmpty(selectorJson)) {
@@ -567,69 +476,11 @@ public class ConfigsServiceImpl implements ConfigsService 
{
         }
     }
 
-    private void importSelectorData(final String namespace, final Map<String, 
Object> result, final ZipUtil.ZipItem zipItem) {
-        String selectorJson = zipItem.getItemData();
-        if (StringUtils.isNotEmpty(selectorJson)) {
-            List<SelectorDTO> selectorList = 
GsonUtils.getInstance().fromList(selectorJson, SelectorDTO.class);
-            // set namespaceId
-            selectorList.forEach(selectorDTO -> 
selectorDTO.setNamespaceId(namespace));
-            ConfigImportResult configImportResult = 
selectorService.importData(namespace, selectorList);
-            result.put(ExportImportConstants.SELECTOR_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
-            if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
-                result.put(ExportImportConstants.SELECTOR_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
-            }
-        }
-    }
-
     private void importPluginData(final Map<String, Object> result, final 
ZipUtil.ZipItem zipItem) {
         String pluginJson = zipItem.getItemData();
         if (StringUtils.isNotEmpty(pluginJson)) {
             List<PluginDTO> pluginList = 
GsonUtils.getInstance().fromList(pluginJson, PluginDTO.class);
-            ConfigImportResult configImportResult = 
pluginService.importData(pluginList);
-            result.put(ExportImportConstants.PLUGIN_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
-            if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
-                result.put(ExportImportConstants.PLUGIN_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
-            }
-        }
-    }
-
-    private void importPluginData(final String namespace, final Map<String, 
Object> result, final ZipUtil.ZipItem zipItem) {
-        String pluginJson = zipItem.getItemData();
-        if (StringUtils.isNotEmpty(pluginJson)) {
-            List<PluginDTO> pluginList = 
GsonUtils.getInstance().fromList(pluginJson, PluginDTO.class);
-            // set namespaceId
-            pluginList.forEach(pluginDTO -> 
pluginDTO.setNamespaceId(namespace));
-            ConfigImportResult configImportResult = 
pluginService.importData(pluginList);
-            result.put(ExportImportConstants.PLUGIN_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
-            if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
-                result.put(ExportImportConstants.PLUGIN_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
-            }
-        }
-    }
-
-    private void importNamespacePluginData(final String namespace, final 
Map<String, Object> result, final ZipUtil.ZipItem zipItem) {
-        String pluginJson = zipItem.getItemData();
-        if (StringUtils.isNotEmpty(pluginJson)) {
-            List<NamespacePluginDTO> namespacePluginDTOS = 
GsonUtils.getInstance().fromList(pluginJson, NamespacePluginDTO.class);
-            // set namespaceId
-            namespacePluginDTOS.forEach(namespacePluginDTO -> {
-                namespacePluginDTO.setNamespaceId(namespace);
-                // change id
-                
namespacePluginDTO.setId(UUIDUtils.getInstance().generateShortUuid());
-            });
-            ConfigImportResult configImportResult = 
namespacePluginService.importData(namespace, namespacePluginDTOS);
-            result.put(ExportImportConstants.PLUGIN_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
-            if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
-                result.put(ExportImportConstants.PLUGIN_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
-            }
-        }
-    }
-    
-    private void importPluginTemplateData(final Map<String, Object> result, 
final ZipUtil.ZipItem zipItem) {
-        String pluginTemplateJson = zipItem.getItemData();
-        if (StringUtils.isNotEmpty(pluginTemplateJson)) {
-            List<PluginDTO> pluginTemplateList = 
GsonUtils.getInstance().fromList(pluginTemplateJson, PluginDTO.class);
-            ConfigImportResult configImportResult = 
pluginService.importData(pluginTemplateList);
+            ConfigImportResult configImportResult = 
pluginService.importData(pluginList, null);
             result.put(ExportImportConstants.PLUGIN_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
             if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
                 result.put(ExportImportConstants.PLUGIN_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
@@ -649,20 +500,6 @@ public class ConfigsServiceImpl implements ConfigsService {
         }
     }
 
-    private void importMetaData(final String namespace, final Map<String, 
Object> result, final ZipUtil.ZipItem zipItem) {
-        String metaJson = zipItem.getItemData();
-        if (StringUtils.isNotEmpty(metaJson)) {
-            List<MetaDataDTO> metaDataList = 
GsonUtils.getInstance().fromList(metaJson, MetaDataDTO.class);
-            // set namespaceId
-            metaDataList.forEach(metaDataDTO -> 
metaDataDTO.setNamespaceId(namespace));
-            ConfigImportResult configImportResult = 
metaDataService.importData(namespace, metaDataList);
-            result.put(ExportImportConstants.META_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
-            if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
-                result.put(ExportImportConstants.META_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
-            }
-        }
-    }
-
     private void importAuthData(final Map<String, Object> result, final 
ZipUtil.ZipItem zipItem) {
         String authJson = zipItem.getItemData();
         if (StringUtils.isNotEmpty(authJson)) {
@@ -674,18 +511,4 @@ public class ConfigsServiceImpl implements ConfigsService {
             }
         }
     }
-
-    private void importAuthData(final String namespace, final Map<String, 
Object> result, final ZipUtil.ZipItem zipItem) {
-        String authJson = zipItem.getItemData();
-        if (StringUtils.isNotEmpty(authJson)) {
-            List<AppAuthDTO> authDataList = 
GsonUtils.getInstance().fromList(authJson, AppAuthDTO.class);
-            // set namespaceId
-            authDataList.forEach(appAuthDTO -> 
appAuthDTO.setNamespaceId(namespace));
-            ConfigImportResult configImportResult = 
appAuthService.importData(namespace, authDataList);
-            result.put(ExportImportConstants.AUTH_IMPORT_SUCCESS_COUNT, 
configImportResult.getSuccessCount());
-            if (StringUtils.isNotEmpty(configImportResult.getFailMessage())) {
-                result.put(ExportImportConstants.AUTH_IMPORT_FAIL_MESSAGE, 
configImportResult.getFailMessage());
-            }
-        }
-    }
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryServiceImpl.java
index 24cc2a7019..5f16c1b1ed 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryServiceImpl.java
@@ -44,6 +44,7 @@ import org.apache.shenyu.admin.model.vo.DiscoveryRelVO;
 import org.apache.shenyu.admin.model.vo.DiscoveryVO;
 import org.apache.shenyu.admin.service.DiscoveryService;
 import org.apache.shenyu.admin.service.SelectorService;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.admin.transfer.DiscoveryTransfer;
 import org.apache.shenyu.admin.utils.ShenyuResultMessage;
 import org.apache.shenyu.common.exception.ShenyuException;
@@ -451,11 +452,11 @@ public class DiscoveryServiceImpl implements 
DiscoveryService {
     }
     
     @Override
-    public ConfigImportResult importData(final String namespace, final 
List<DiscoveryDTO> discoveryList) {
+    public ConfigImportResult importData(final String namespace, final 
List<DiscoveryDTO> discoveryList, final ConfigsImportContext context) {
         if (CollectionUtils.isEmpty(discoveryList)) {
             return ConfigImportResult.success();
         }
-        
+        Map<String, String> discoveryHandlerIdMapping = 
context.getDiscoveryHandlerIdMapping();
         Map<String, List<DiscoveryDO>> pluginDiscoveryMap = discoveryMapper
                 .selectAllByNamespaceId(namespace)
                 .stream()
@@ -478,15 +479,20 @@ public class DiscoveryServiceImpl implements 
DiscoveryService {
             }
             String discoveryId = UUIDUtils.getInstance().generateShortUuid();
             discoveryDTO.setId(discoveryId);
+            discoveryDTO.setNamespaceId(namespace);
             create(discoveryDTO);
             successCount++;
             
             // import discovery handler data
+            String discoveryHandlerId = null;
             if (null != discoveryDTO.getDiscoveryHandler()) {
                 DiscoveryHandlerDO discoveryHandlerDO = DiscoveryTransfer
                         .INSTANCE
                         .mapToDO(discoveryDTO.getDiscoveryHandler());
                 discoveryHandlerDO.setDiscoveryId(discoveryId);
+                discoveryHandlerId = 
UUIDUtils.getInstance().generateShortUuid();
+                discoveryHandlerIdMapping.put(discoveryHandlerDO.getId(), 
discoveryHandlerId);
+                discoveryHandlerDO.setId(discoveryHandlerId);
                 discoveryHandlerMapper.insertSelective(discoveryHandlerDO);
             }
             
@@ -495,6 +501,12 @@ public class DiscoveryServiceImpl implements 
DiscoveryService {
                 DiscoveryRelDO discoveryRelDO = DiscoveryTransfer
                         .INSTANCE
                         .mapToDO(discoveryDTO.getDiscoveryRel());
+                discoveryRelDO.setDiscoveryHandlerId(discoveryHandlerId);
+                Optional.ofNullable(discoveryRelDO.getSelectorId())
+                                .ifPresent(selectorId -> 
discoveryRelDO.setSelectorId(context.getSelectorIdMapping().get(selectorId)));
+                Optional.ofNullable(discoveryRelDO.getProxySelectorId())
+                        .ifPresent(proxySelectorId -> 
discoveryRelDO.setProxySelectorId(context.getProxySelectorIdMapping().get(proxySelectorId)));
+                
discoveryRelDO.setId(UUIDUtils.getInstance().generateShortUuid());
                 discoveryRelMapper.insertSelective(discoveryRelDO);
             }
         }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryUpstreamServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryUpstreamServiceImpl.java
index 73789d9009..c31ae18023 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryUpstreamServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryUpstreamServiceImpl.java
@@ -39,6 +39,7 @@ import org.apache.shenyu.admin.model.entity.SelectorDO;
 import org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.DiscoveryUpstreamVO;
 import org.apache.shenyu.admin.service.DiscoveryUpstreamService;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.admin.transfer.DiscoveryTransfer;
 import org.apache.shenyu.admin.utils.ShenyuResultMessage;
 import org.apache.shenyu.common.dto.DiscoverySyncData;
@@ -289,10 +290,11 @@ public class DiscoveryUpstreamServiceImpl implements 
DiscoveryUpstreamService {
     }
     
     @Override
-    public ConfigImportResult importData(final String namespace, final 
List<DiscoveryUpstreamDTO> discoveryUpstreamList) {
+    public ConfigImportResult importData(final String namespace, final 
List<DiscoveryUpstreamDTO> discoveryUpstreamList, final ConfigsImportContext 
context) {
         if (CollectionUtils.isEmpty(discoveryUpstreamList)) {
             return ConfigImportResult.success();
         }
+        Map<String, String> discoveryHandlerIdMapping = 
context.getDiscoveryHandlerIdMapping();
         int successCount = 0;
         StringBuilder errorMsgBuilder = new StringBuilder();
         Map<String, List<DiscoveryUpstreamDO>> discoveryHandlerUpstreamMap = 
discoveryUpstreamMapper
@@ -313,7 +315,9 @@ public class DiscoveryUpstreamServiceImpl implements 
DiscoveryUpstreamService {
                         .append(",");
                 continue;
             }
+            discoveryUpstreamDTO.setNamespaceId(namespace);
             discoveryUpstreamDTO.setId(null);
+            
discoveryUpstreamDTO.setDiscoveryHandlerId(discoveryHandlerIdMapping.get(discoveryUpstreamDTO.getDiscoveryHandlerId()));
             DiscoveryUpstreamDO discoveryUpstreamDO = 
DiscoveryUpstreamDO.buildDiscoveryUpstreamDO(discoveryUpstreamDTO);
             discoveryUpstreamMapper.insert(discoveryUpstreamDO);
             successCount++;
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MetaDataServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MetaDataServiceImpl.java
index 39eab5f285..75f20af13b 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MetaDataServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MetaDataServiceImpl.java
@@ -138,7 +138,10 @@ public class MetaDataServiceImpl implements 
MetaDataService {
     public void syncData() {
         List<MetaDataDO> all = metaDataMapper.findAll();
         if (CollectionUtils.isNotEmpty(all)) {
-            eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.META_DATA, DataEventTypeEnum.REFRESH, 
MetaDataTransfer.INSTANCE.mapToDataAll(all)));
+            Map<String, List<MetaDataDO>> namespaceMetaDataList = 
all.stream().collect(Collectors.groupingBy(MetaDataDO::getNamespaceId));
+            namespaceMetaDataList.values().forEach(m -> {
+                eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.META_DATA, DataEventTypeEnum.REFRESH, 
MetaDataTransfer.INSTANCE.mapToDataAll(m)));
+            });
         }
     }
 
@@ -241,6 +244,7 @@ public class MetaDataServiceImpl implements MetaDataService 
{
     }
     
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public ConfigImportResult importData(final String namespace, final 
List<MetaDataDTO> metaDataList) {
         if (CollectionUtils.isEmpty(metaDataList)) {
             return ConfigImportResult.success();
@@ -263,10 +267,10 @@ public class MetaDataServiceImpl implements 
MetaDataService {
                         .append(",");
                 continue;
             }
+            metaDataDTO.setNamespaceId(namespace);
             create(metaDataDTO);
             successCount++;
         }
-        this.syncData();
         if (StringUtils.isNotEmpty(errorMsgBuilder)) {
             errorMsgBuilder.setLength(errorMsgBuilder.length() - 1);
             return ConfigImportResult.fail(successCount, "import fail meta: " 
+ errorMsgBuilder);
@@ -275,7 +279,7 @@ public class MetaDataServiceImpl implements MetaDataService 
{
     }
     
     private String create(final MetaDataDTO metaDataDTO) {
-        Assert.isNull(metaDataMapper.pathExisted(metaDataDTO.getPath()), 
AdminConstants.DATA_PATH_IS_EXIST);
+        Assert.isNull(metaDataMapper.pathExisted(metaDataDTO.getPath(), 
metaDataDTO.getNamespaceId()), AdminConstants.DATA_PATH_IS_EXIST);
         MetaDataDO metaDataDO = 
MetaDataTransfer.INSTANCE.mapToEntity(metaDataDTO);
         metaDataDO.setId(UUIDUtils.getInstance().generateShortUuid());
         metaDataDO.setPathDesc(Objects.isNull(metaDataDO.getPathDesc()) ? "" : 
metaDataDO.getPathDesc());
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/NamespacePluginServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/NamespacePluginServiceImpl.java
index da1473016b..09751e5f29 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/NamespacePluginServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/NamespacePluginServiceImpl.java
@@ -37,12 +37,14 @@ import 
org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.NamespacePluginVO;
 import org.apache.shenyu.admin.model.vo.PluginSnapshotVO;
 import org.apache.shenyu.admin.service.NamespacePluginService;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.admin.service.publish.NamespacePluginEventPublisher;
 import org.apache.shenyu.admin.transfer.PluginTransfer;
 import org.apache.shenyu.admin.utils.ShenyuResultMessage;
 import org.apache.shenyu.common.constant.AdminConstants;
 import org.apache.shenyu.common.dto.PluginData;
 import org.apache.shenyu.common.utils.ListUtil;
+import org.apache.shenyu.common.utils.UUIDUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -232,7 +234,8 @@ public class NamespacePluginServiceImpl implements 
NamespacePluginService {
     }
     
     @Override
-    public ConfigImportResult importData(final String namespace, final 
List<NamespacePluginDTO> namespacePluginList) {
+    @Transactional(rollbackFor = Exception.class)
+    public ConfigImportResult importData(final String namespace, final 
List<NamespacePluginDTO> namespacePluginList, final ConfigsImportContext 
context) {
         if (CollectionUtils.isEmpty(namespacePluginList)) {
             return ConfigImportResult.success();
         }
@@ -243,13 +246,16 @@ public class NamespacePluginServiceImpl implements 
NamespacePluginService {
         StringBuilder errorMsgBuilder = new StringBuilder();
         int successCount = 0;
         for (NamespacePluginDTO namespacePluginDTO : namespacePluginList) {
-            String pluginId = namespacePluginDTO.getPluginId();
+            String pluginId = 
context.getPluginTemplateIdMapping().get(namespacePluginDTO.getPluginId());
             // check plugin base info
             if (existPluginMap.containsKey(pluginId)) {
                 errorMsgBuilder
                         .append(pluginId)
                         .append(",");
             } else {
+                
namespacePluginDTO.setId(UUIDUtils.getInstance().generateShortUuid());
+                namespacePluginDTO.setNamespaceId(namespace);
+                namespacePluginDTO.setPluginId(pluginId);
                 NamespacePluginRelDO namespacePluginRelDO = 
NamespacePluginRelDO.buildNamespacePluginRelDO(namespacePluginDTO);
                 if 
(namespacePluginRelMapper.insertSelective(namespacePluginRelDO) > 0) {
                     // publish create event. init plugin data
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PluginHandleServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PluginHandleServiceImpl.java
index d89cc87bec..004faf208e 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PluginHandleServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PluginHandleServiceImpl.java
@@ -29,10 +29,11 @@ import 
org.apache.shenyu.admin.model.event.plugin.BatchPluginDeletedEvent;
 import org.apache.shenyu.admin.model.page.CommonPager;
 import org.apache.shenyu.admin.model.page.PageResultUtils;
 import org.apache.shenyu.admin.model.query.PluginHandleQuery;
-import org.apache.shenyu.admin.model.result.ShenyuAdminResult;
+import org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.PluginHandleVO;
 import org.apache.shenyu.admin.model.vo.ShenyuDictVO;
 import org.apache.shenyu.admin.service.PluginHandleService;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.admin.service.publish.PluginHandleEventPublisher;
 import org.apache.shenyu.common.utils.ListUtil;
 import org.slf4j.Logger;
@@ -145,10 +146,10 @@ public class PluginHandleServiceImpl implements 
PluginHandleService {
         }
         return buildPluginHandleVO(pluginHandleDOList);
     }
-    
+
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ShenyuAdminResult importData(final List<PluginHandleDTO> 
pluginHandleList) {
+    public ConfigImportResult importData(final List<PluginHandleDTO> 
pluginHandleList, final ConfigsImportContext context) {
         Map<String, List<PluginHandleVO>> existHandleMap = listAllData()
                 .stream()
                 .filter(Objects::nonNull)
@@ -158,9 +159,10 @@ public class PluginHandleServiceImpl implements 
PluginHandleService {
                 .filter(Objects::nonNull)
                 .collect(Collectors.groupingBy(PluginHandleDTO::getPluginId));
 
+        int successCount = 0;
         for (Map.Entry<String, List<PluginHandleDTO>> pluginHandleEntry : 
importHandleMap.entrySet()) {
             // pluginId
-            String pluginId = pluginHandleEntry.getKey();
+            String pluginId = 
context.getPluginTemplateIdMapping().get(pluginHandleEntry.getKey());
             List<PluginHandleDTO> handles = pluginHandleEntry.getValue();
             if (CollectionUtils.isNotEmpty(handles)) {
                 if (existHandleMap.containsKey(pluginId)) {
@@ -171,19 +173,23 @@ public class PluginHandleServiceImpl implements 
PluginHandleService {
                             .collect(Collectors.toSet());
                     for (PluginHandleDTO handle : handles) {
                         if (!handleFiledMap.contains(handle.getField())) {
+                            handle.setPluginId(pluginId);
                             create(handle);
+                            successCount++;
                         }
                     }
                 } else {
                     for (PluginHandleDTO handle : handles) {
+                        handle.setPluginId(pluginId);
                         create(handle);
+                        successCount++;
                     }
                 }
             }
         }
-        return ShenyuAdminResult.success();
+        return ConfigImportResult.success(successCount);
     }
-    
+
     /**
      * The associated Handle needs to be deleted synchronously.
      *
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PluginServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PluginServiceImpl.java
index d11abe454d..b8675d3619 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PluginServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/PluginServiceImpl.java
@@ -17,16 +17,12 @@
 
 package org.apache.shenyu.admin.service.impl;
 
-import com.google.common.collect.Maps;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shenyu.admin.aspect.annotation.Pageable;
 import org.apache.shenyu.admin.mapper.NamespacePluginRelMapper;
 import org.apache.shenyu.admin.mapper.PluginMapper;
 import org.apache.shenyu.admin.model.dto.PluginDTO;
-import org.apache.shenyu.admin.model.dto.PluginHandleDTO;
-import org.apache.shenyu.admin.model.entity.NamespacePluginRelDO;
 import org.apache.shenyu.admin.model.entity.PluginDO;
 import org.apache.shenyu.admin.model.event.plugin.PluginCreatedEvent;
 import org.apache.shenyu.admin.model.page.CommonPager;
@@ -38,6 +34,7 @@ import org.apache.shenyu.admin.model.vo.PluginSnapshotVO;
 import org.apache.shenyu.admin.model.vo.PluginVO;
 import org.apache.shenyu.admin.service.PluginHandleService;
 import org.apache.shenyu.admin.service.PluginService;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.admin.service.publish.PluginEventPublisher;
 import org.apache.shenyu.admin.transfer.PluginTransfer;
 import org.apache.shenyu.admin.utils.Assert;
@@ -50,6 +47,7 @@ import org.apache.shenyu.common.exception.ShenyuException;
 import org.apache.shenyu.common.utils.JarDependencyUtils;
 import org.apache.shenyu.common.utils.ListUtil;
 import org.apache.shenyu.common.utils.LogUtils;
+import org.apache.shenyu.common.utils.UUIDUtils;
 import org.opengauss.util.Base64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -251,7 +249,7 @@ public class PluginServiceImpl implements PluginService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ConfigImportResult importData(final List<PluginDTO> pluginList) {
+    public ConfigImportResult importData(final List<PluginDTO> pluginList, 
final ConfigsImportContext context) {
         if (CollectionUtils.isEmpty(pluginList)) {
             return ConfigImportResult.success();
         }
@@ -268,7 +266,11 @@ public class PluginServiceImpl implements PluginService {
                 errorMsgBuilder
                         .append(pluginName)
                         .append(",");
+                Optional.ofNullable(context).ifPresent(c -> 
c.getPluginTemplateIdMapping().put(pluginDTO.getId(), 
existPluginMap.get(pluginName).getId()));
             } else {
+                String pluginId = UUIDUtils.getInstance().generateShortUuid();
+                Optional.ofNullable(context).ifPresent(c -> 
c.getPluginTemplateIdMapping().put(pluginDTO.getId(), pluginId));
+                pluginDTO.setId(pluginId);
                 PluginDO pluginDO = PluginDO.buildPluginDO(pluginDTO);
                 if (pluginMapper.insertSelective(pluginDO) > 0) {
                     // publish create event. init plugin data
@@ -284,58 +286,6 @@ public class PluginServiceImpl implements PluginService {
         return ConfigImportResult.success(successCount);
     }
     
-    @Override
-    public ConfigImportResult importData(final String namespace, final 
List<PluginDTO> pluginList) {
-        if (CollectionUtils.isEmpty(pluginList)) {
-            return ConfigImportResult.success();
-        }
-        List<NamespacePluginRelDO> pluginRelDOList = 
namespacePluginRelMapper.listByNamespaceId(namespace);
-        Map<String, PluginDO> existPluginMap = Maps.newHashMap();
-        if (CollectionUtils.isNotEmpty(pluginRelDOList)) {
-            List<String> pluginIds = 
pluginRelDOList.stream().map(NamespacePluginRelDO::getPluginId).distinct().collect(Collectors.toList());
-            existPluginMap = pluginMapper.selectByIds(pluginIds)
-                    .stream()
-                    .filter(Objects::nonNull)
-                    .collect(Collectors.toMap(PluginDO::getName, x -> x));
-        }
-        StringBuilder errorMsgBuilder = new StringBuilder();
-        int successCount = 0;
-        for (PluginDTO pluginDTO : pluginList) {
-            String pluginName = pluginDTO.getName();
-            String pluginId;
-            // check plugin base info
-            if (MapUtils.isNotEmpty(existPluginMap) && 
existPluginMap.containsKey(pluginName)) {
-                PluginDO existPlugin = existPluginMap.get(pluginName);
-                pluginId = existPlugin.getId();
-                errorMsgBuilder
-                        .append(pluginName)
-                        .append(",");
-            } else {
-                PluginDO pluginDO = PluginDO.buildPluginDO(pluginDTO);
-                pluginId = pluginDO.getId();
-                if (pluginMapper.insertSelective(pluginDO) > 0) {
-                    // publish create event. init plugin data
-                    successCount++;
-                }
-            }
-            // check and import plugin handle
-            List<PluginHandleDTO> pluginHandleList = 
pluginDTO.getPluginHandleList();
-            if (CollectionUtils.isNotEmpty(pluginHandleList)) {
-                pluginHandleService
-                        .importData(pluginHandleList
-                                .stream()
-                                .peek(x -> x.setPluginId(pluginId))
-                                .collect(Collectors.toList()));
-            }
-        }
-        if (StringUtils.isNotEmpty(errorMsgBuilder)) {
-            errorMsgBuilder.setLength(errorMsgBuilder.length() - 1);
-            return ConfigImportResult
-                    .fail(successCount, "import fail plugin: " + 
errorMsgBuilder);
-        }
-        return ConfigImportResult.success(successCount);
-    }
-    
     /**
      * create plugin.<br>
      * insert plugin and insert plugin data.
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ProxySelectorServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ProxySelectorServiceImpl.java
index df7e5aaaf4..6272cc1480 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ProxySelectorServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ProxySelectorServiceImpl.java
@@ -46,6 +46,7 @@ import 
org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.DiscoveryUpstreamVO;
 import org.apache.shenyu.admin.model.vo.ProxySelectorVO;
 import org.apache.shenyu.admin.service.ProxySelectorService;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.admin.transfer.DiscoveryTransfer;
 import org.apache.shenyu.admin.utils.ShenyuResultMessage;
 import org.apache.shenyu.common.dto.ProxySelectorData;
@@ -498,13 +499,14 @@ public class ProxySelectorServiceImpl implements 
ProxySelectorService {
     }
     
     @Override
-    public ConfigImportResult importData(final String namespace, final 
List<ProxySelectorData> proxySelectorList) {
+    public ConfigImportResult importData(final String namespace, final 
List<ProxySelectorData> proxySelectorList,
+                                         final ConfigsImportContext context) {
         if (CollectionUtils.isEmpty(proxySelectorList)) {
             return ConfigImportResult.success();
         }
-        // TODO namespace
+        Map<String, String> proxySelectorIdMapping = 
context.getProxySelectorIdMapping();
         Map<String, List<ProxySelectorDO>> pluginProxySelectorMap = 
proxySelectorMapper
-                .selectAll()
+                .selectByNamespaceId(namespace)
                 .stream()
                 
.collect(Collectors.groupingBy(ProxySelectorDO::getPluginName));
         int successCount = 0;
@@ -512,20 +514,25 @@ public class ProxySelectorServiceImpl implements 
ProxySelectorService {
         for (ProxySelectorData selectorData : proxySelectorList) {
             String pluginName = selectorData.getPluginName();
             String proxySelectorName = selectorData.getName();
-            Set<String> existProxySelectorNameSet = pluginProxySelectorMap
+            Map<String, String> existProxySelectorNameSet = 
pluginProxySelectorMap
                     .getOrDefault(pluginName, Lists.newArrayList())
                     .stream()
-                    .map(ProxySelectorDO::getName)
-                    .collect(Collectors.toSet());
+                    .collect(Collectors.toMap(ProxySelectorDO::getName, 
ProxySelectorDO::getId));
             
-            if (existProxySelectorNameSet.contains(proxySelectorName)) {
+            if (existProxySelectorNameSet.containsKey(proxySelectorName)) {
                 errorMsgBuilder
                         .append(proxySelectorName)
                         .append(",");
+                proxySelectorIdMapping.put(selectorData.getId(), 
existProxySelectorNameSet.get(proxySelectorName));
                 continue;
             }
+            String oldProxySelectorId = selectorData.getId();
+            String newProxySelectorId = 
UUIDUtils.getInstance().generateShortUuid();
+            selectorData.setId(newProxySelectorId);
+            selectorData.setNamespaceId(namespace);
             ProxySelectorDO proxySelectorDO = 
ProxySelectorDO.buildProxySelectorDO(selectorData);
             if (proxySelectorMapper.insert(proxySelectorDO) > 0) {
+                proxySelectorIdMapping.put(oldProxySelectorId, 
newProxySelectorId);
                 successCount++;
             }
         }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
index aa012c07e0..7426e17b95 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
@@ -43,6 +43,7 @@ import 
org.apache.shenyu.admin.model.result.ConfigImportResult;
 import org.apache.shenyu.admin.model.vo.RuleConditionVO;
 import org.apache.shenyu.admin.model.vo.RuleVO;
 import org.apache.shenyu.admin.service.RuleService;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.admin.service.publish.RuleEventPublisher;
 import org.apache.shenyu.admin.transfer.ConditionTransfer;
 import org.apache.shenyu.admin.utils.Assert;
@@ -53,6 +54,7 @@ import org.apache.shenyu.common.dto.RuleData;
 import org.apache.shenyu.common.enums.MatchModeEnum;
 import org.apache.shenyu.common.utils.JsonUtils;
 import org.apache.shenyu.common.utils.ListUtil;
+import org.apache.shenyu.common.utils.UUIDUtils;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -302,11 +304,12 @@ public class RuleServiceImpl implements RuleService {
     }
     
     @Override
-    public ConfigImportResult importData(final String namespace, final 
List<RuleDTO> ruleList) {
+    @Transactional(rollbackFor = Exception.class)
+    public ConfigImportResult importData(final String namespace, final 
List<RuleDTO> ruleList, final ConfigsImportContext context) {
         if (CollectionUtils.isEmpty(ruleList)) {
             return ConfigImportResult.success();
         }
-        
+        Map<String, String> selectorIdMapping = context.getSelectorIdMapping();
         Map<String, List<RuleDO>> selectorRuleMap = ruleMapper
                 .selectAllByNamespaceId(namespace)
                 .stream()
@@ -317,8 +320,16 @@ public class RuleServiceImpl implements RuleService {
         for (RuleDTO ruleDTO : ruleList) {
             String selectorId = ruleDTO.getSelectorId();
             String ruleName = ruleDTO.getName();
+
+            String newSelectorId = selectorIdMapping.get(selectorId);
+            if (Objects.isNull(newSelectorId)) {
+                errorMsgBuilder
+                        .append(ruleName)
+                        .append(",");
+                continue;
+            }
             Set<String> existRuleNameSet = selectorRuleMap
-                    .getOrDefault(selectorId, Lists.newArrayList())
+                    .getOrDefault(newSelectorId, Lists.newArrayList())
                     .stream()
                     .map(RuleDO::getName)
                     .collect(Collectors.toSet());
@@ -329,8 +340,17 @@ public class RuleServiceImpl implements RuleService {
                         .append(",");
                 continue;
             }
+            ruleDTO.setNamespaceId(namespace);
+            ruleDTO.setSelectorId(newSelectorId);
+            String ruleId = UUIDUtils.getInstance().generateShortUuid();
+            ruleDTO.setId(ruleId);
             RuleDO ruleDO = RuleDO.buildRuleDO(ruleDTO);
             final int ruleCount = ruleMapper.insertSelective(ruleDO);
+            Optional.ofNullable(ruleDTO.getRuleConditions())
+                            .orElse(Collections.emptyList()).forEach(c -> {
+                                c.setRuleId(ruleId);
+                                c.setId(null);
+                            });
             addCondition(ruleDO, ruleDTO.getRuleConditions());
             if (ruleCount > 0) {
                 successCount++;
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SelectorServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SelectorServiceImpl.java
index e1a6bae006..11abc1a77b 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SelectorServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SelectorServiceImpl.java
@@ -58,6 +58,7 @@ import org.apache.shenyu.admin.model.vo.DiscoveryVO;
 import org.apache.shenyu.admin.model.vo.SelectorConditionVO;
 import org.apache.shenyu.admin.model.vo.SelectorVO;
 import org.apache.shenyu.admin.service.SelectorService;
+import org.apache.shenyu.admin.service.configs.ConfigsImportContext;
 import org.apache.shenyu.admin.service.publish.SelectorEventPublisher;
 import org.apache.shenyu.admin.transfer.ConditionTransfer;
 import org.apache.shenyu.admin.transfer.DiscoveryTransfer;
@@ -73,6 +74,7 @@ import org.apache.shenyu.common.enums.SelectorTypeEnum;
 import org.apache.shenyu.common.utils.ContextPathUtils;
 import org.apache.shenyu.common.utils.JsonUtils;
 import org.apache.shenyu.common.utils.ListUtil;
+import org.apache.shenyu.common.utils.UUIDUtils;
 import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.event.EventListener;
@@ -495,10 +497,12 @@ public class SelectorServiceImpl implements 
SelectorService {
     }
     
     @Override
-    public ConfigImportResult importData(final String namespace, final 
List<SelectorDTO> selectorList) {
+    @Transactional(rollbackFor = Exception.class)
+    public ConfigImportResult importData(final String namespace, final 
List<SelectorDTO> selectorList, final ConfigsImportContext context) {
         if (CollectionUtils.isEmpty(selectorList)) {
             return ConfigImportResult.success();
         }
+        Map<String, String> selectorIdMapping = context.getSelectorIdMapping();
         StringBuilder errorMsgBuilder = new StringBuilder();
         int successCount = 0;
         Map<String, List<SelectorDO>> pluginSelectorMap = 
selectorMapper.selectAllByNamespaceId(namespace).stream()
@@ -510,26 +514,37 @@ public class SelectorServiceImpl implements 
SelectorService {
         
         for (Map.Entry<String, List<SelectorDTO>> selectorEntry : 
importSelectorMap.entrySet()) {
             // the import selector's pluginId
-            String pluginId = selectorEntry.getKey();
+            String pluginId = 
context.getPluginTemplateIdMapping().get(selectorEntry.getKey());
             List<SelectorDTO> selectorDTOList = selectorEntry.getValue();
             if (CollectionUtils.isNotEmpty(selectorDTOList)) {
                 
-                Set<String> existSelectorSet = Optional
+                Map<String, String> existSelectorSet = Optional
                         .ofNullable(pluginSelectorMap.get(pluginId))
                         .orElseGet(Lists::newArrayList)
                         .stream()
-                        .map(SelectorDO::getName)
-                        .collect(Collectors.toSet());
+                        .collect(Collectors.toMap(SelectorDO::getName, 
SelectorDO::getId));
                 
                 for (SelectorDTO selectorDTO : selectorDTOList) {
                     // filter by selectorName
                     String selectorName = selectorDTO.getName();
-                    if (CollectionUtils.isNotEmpty(existSelectorSet)
-                            && existSelectorSet.contains(selectorName)) {
+                    if (MapUtils.isNotEmpty(existSelectorSet)
+                            && existSelectorSet.containsKey(selectorName)) {
                         errorMsgBuilder
                                 .append(selectorName)
                                 .append(",");
+                        selectorIdMapping.put(selectorDTO.getId(), 
existSelectorSet.get(selectorName));
                     } else {
+                        // gen new id
+                        String selectorId = 
UUIDUtils.getInstance().generateShortUuid();
+                        selectorIdMapping.put(selectorDTO.getId(), selectorId);
+                        selectorDTO.setId(selectorId);
+                        selectorDTO.setNamespaceId(namespace);
+                        selectorDTO.setPluginId(pluginId);
+                        
Optional.ofNullable(selectorDTO.getSelectorConditions())
+                                        
.orElse(Collections.emptyList()).forEach(c -> {
+                                            c.setSelectorId(selectorId);
+                                            c.setId(null);
+                                        });
                         create(selectorDTO);
                         successCount++;
                     }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SyncDataServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SyncDataServiceImpl.java
index f6d21a785b..44e7c4750c 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SyncDataServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SyncDataServiceImpl.java
@@ -42,6 +42,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
@@ -108,13 +109,25 @@ public class SyncDataServiceImpl implements 
SyncDataService {
         appAuthService.syncData();
 
         List<PluginData> pluginDataList = namespacePluginService.listAll();
-        eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.PLUGIN, type, pluginDataList));
+        Map<String, List<PluginData>> namespacePluginDataList =
+                
pluginDataList.stream().collect(Collectors.groupingBy(PluginData::getNamespaceId));
+        namespacePluginDataList.values().forEach(p -> {
+            eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.PLUGIN, type, p));
+        });
 
         List<SelectorData> selectorDataList = selectorService.listAll();
-        eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.SELECTOR, type, selectorDataList));
+        Map<String, List<SelectorData>> namespaceSelectorDataList =
+                
selectorDataList.stream().collect(Collectors.groupingBy(SelectorData::getNamespaceId));
+        namespaceSelectorDataList.values().forEach(s -> {
+            eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.SELECTOR, type, s));
+        });
 
         List<RuleData> ruleDataList = ruleService.listAll();
-        eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.RULE, 
type, ruleDataList));
+        Map<String, List<RuleData>> namespaceRuleDataList =
+                
ruleDataList.stream().collect(Collectors.groupingBy(RuleData::getNamespaceId));
+        namespaceRuleDataList.values().forEach(r -> {
+            eventPublisher.publishEvent(new 
DataChangedEvent(ConfigGroupEnum.RULE, type, r));
+        });
 
         metaDataService.syncData();
         discoveryService.syncData();
diff --git a/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml 
b/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml
index 91a2fb6edb..6f73e725d7 100644
--- a/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml
@@ -148,6 +148,7 @@
         SElECT true
         FROM meta_data
         WHERE path = #{path}
+        AND namespace_id = #{namespaceId}
         LIMIT 1
     </select>
 
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/AppAuthServiceTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/AppAuthServiceTest.java
index a7465afc54..114126e1c4 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/AppAuthServiceTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/AppAuthServiceTest.java
@@ -258,7 +258,9 @@ public final class AppAuthServiceTest {
 
     @Test
     public void testSyncData() {
-        ArrayList<AppAuthDO> all = Lists.newArrayList(new AppAuthDO());
+        AppAuthDO authDO = new AppAuthDO();
+        authDO.setNamespaceId("test");
+        ArrayList<AppAuthDO> all = Lists.newArrayList(authDO);
         when(appAuthMapper.selectAll())
                 .thenReturn(null)
                 .thenReturn(Lists.newArrayList())
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/ConfigsServiceTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/ConfigsServiceTest.java
index 7348ab7928..b8023af730 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/ConfigsServiceTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/ConfigsServiceTest.java
@@ -27,10 +27,10 @@ import org.apache.shenyu.common.exception.CommonErrorCode;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -45,7 +45,6 @@ import static org.mockito.Mockito.when;
 @ExtendWith(MockitoExtension.class)
 public final class ConfigsServiceTest {
 
-    @InjectMocks
     private ConfigsServiceImpl configsService;
 
     @Mock
@@ -84,7 +83,7 @@ public final class ConfigsServiceTest {
     @BeforeEach
     public void setUp() {
         configsService = new ConfigsServiceImpl(appAuthService, pluginService, 
namespacePluginService, pluginHandleService, selectorService, ruleService,
-                metaDataService, shenyuDictService, proxySelectorService, 
discoveryService, discoveryUpstreamService);
+                metaDataService, shenyuDictService, proxySelectorService, 
discoveryService, discoveryUpstreamService, Collections.emptyList());
     }
 
     @Test
@@ -102,7 +101,7 @@ public final class ConfigsServiceTest {
         when(this.metaDataService.importData(any())).thenReturn(
                 ConfigImportResult.success(1));
 
-        when(this.pluginService.importData(any())).thenReturn(
+        when(this.pluginService.importData(any(), any())).thenReturn(
                 ConfigImportResult.success(1));
 
         when(this.selectorService.importData(any())).thenReturn(
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
index fe2fe759b2..0860090dff 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
@@ -158,7 +158,7 @@ public final class MetaDataServiceTest {
      */
     @Test
     public void testSyncDate() {
-        ArrayList<MetaDataDO> all = 
Lists.newArrayList(MetaDataDO.builder().build());
+        ArrayList<MetaDataDO> all = 
Lists.newArrayList(MetaDataDO.builder().namespaceId("test").build());
         when(metaDataMapper.findAll())
                 .thenReturn(null)
                 .thenReturn(Lists.newArrayList())
@@ -256,7 +256,7 @@ public final class MetaDataServiceTest {
 
         final List<MetaDataDTO> metaDataDTOList = getMetaDataDTOList();
         given(this.metaDataMapper.insert(any())).willReturn(1);
-        given(this.metaDataMapper.pathExisted(any())).willReturn(null);
+        given(this.metaDataMapper.pathExisted(any(), any())).willReturn(null);
 
         ConfigImportResult configImportResult = 
this.metaDataService.importData(metaDataDTOList);
 
@@ -324,7 +324,7 @@ public final class MetaDataServiceTest {
     private void testCreateOrUpdateForInsert() {
         when(metaDataDTO.getId()).thenReturn(null);
         when(metaDataMapper.insert(any())).thenReturn(1);
-        when(metaDataMapper.pathExisted(any())).thenReturn(null);
+        when(metaDataMapper.pathExisted(any(), any())).thenReturn(null);
         String msg = metaDataService.createOrUpdate(metaDataDTO);
         assertEquals(ShenyuResultMessage.CREATE_SUCCESS, msg);
     }
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PluginServiceTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PluginServiceTest.java
index a1b9ec1081..531d779b7d 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PluginServiceTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PluginServiceTest.java
@@ -200,7 +200,7 @@ public final class PluginServiceTest {
         when(pluginMapper.nameExisted(pluginDTO.getName())).thenReturn(null);
         when(pluginMapper.insert(any())).thenReturn(1);
 
-        ConfigImportResult configImportResult = 
this.pluginService.importData(pluginDTOList);
+        ConfigImportResult configImportResult = 
this.pluginService.importData(pluginDTOList, null);
 
         assertNotNull(configImportResult);
         Assertions.assertEquals(configImportResult.getSuccessCount(), 
pluginDTOList.size());
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SyncDataServiceTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SyncDataServiceTest.java
index 351002c96f..60cafb9abe 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SyncDataServiceTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SyncDataServiceTest.java
@@ -154,6 +154,7 @@ public final class SyncDataServiceTest {
         selectorData.setPluginName("divide");
         selectorData.setSort(1);
         selectorData.setType(1);
+        selectorData.setNamespaceId("test");
         ConditionData conditionData = new ConditionData();
         conditionData.setParamType(ParamTypeEnum.POST.getName());
         conditionData.setOperator(OperatorEnum.EQ.getAlias());
@@ -179,6 +180,7 @@ public final class SyncDataServiceTest {
         ruleData.setPluginName("divide");
         ruleData.setSelectorId("1");
         ruleData.setSort(1);
+        ruleData.setNamespaceId("test");
         ConditionData conditionData = new ConditionData();
         conditionData.setParamType(ParamTypeEnum.POST.getName());
         conditionData.setOperator(OperatorEnum.EQ.getAlias());
diff --git 
a/shenyu-common/src/main/java/org/apache/shenyu/common/constant/ExportImportConstants.java
 
b/shenyu-common/src/main/java/org/apache/shenyu/common/constant/ExportImportConstants.java
index 5d8022e93c..830cf02c4c 100644
--- 
a/shenyu-common/src/main/java/org/apache/shenyu/common/constant/ExportImportConstants.java
+++ 
b/shenyu-common/src/main/java/org/apache/shenyu/common/constant/ExportImportConstants.java
@@ -54,7 +54,7 @@ public final class ExportImportConstants {
     /**
      * plugin handle json config name.
      */
-    public static final String PLUGIN_HANDLE_JSON = "proxy_handle.json";
+    public static final String PLUGIN_HANDLE_JSON = "plugin_handle.json";
 
     /**
      * selector json config name.
@@ -101,11 +101,31 @@ public final class ExportImportConstants {
      */
     public static final String PLUGIN_IMPORT_SUCCESS_COUNT = 
"pluginImportSuccessCount";
 
+    /**
+     * plugin handle import success count.
+     */
+    public static final String PLUGIN_HANDLE_IMPORT_SUCCESS_COUNT = 
"pluginHandleImportSuccessCount";
+
+    /**
+     * namespace plugin import success count.
+     */
+    public static final String NAMESPACE_PLUGIN_IMPORT_SUCCESS_COUNT = 
"namespacePluginImportSuccessCount";
+
     /**
      * plugin import fail message.
      */
     public static final String PLUGIN_IMPORT_FAIL_MESSAGE = 
"pluginImportFailMessage";
 
+    /**
+     * plugin handle import fail message.
+     */
+    public static final String PLUGIN_HANDLE_IMPORT_FAIL_MESSAGE = 
"pluginHandleImportFailMessage";
+
+    /**
+     * namespace plugin import fail message.
+     */
+    public static final String NAMESPACE_PLUGIN_IMPORT_FAIL_MESSAGE = 
"pluginHandleImportFailMessage";
+
     /**
      * selector import success count.
      */

Reply via email to