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

xiaoyu 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 a5a0779f3 [discovery]  Fix bug about discovery (#4792)
a5a0779f3 is described below

commit a5a0779f311a821f03dab5560d0c6440e089ff83
Author: 杨文杰 <[email protected]>
AuthorDate: Tue Jul 4 11:49:08 2023 +0800

    [discovery]  Fix bug about discovery (#4792)
    
    * Integration module
    
    * Integration module
    
    * fix some bugs
    
    * fix some bug
    
    * fix some bugs
    
    * fix some bugs
    
    * fix some bugs
    
    * fix some bugs
    
    * fix some bugs
    
    * fix some bugs
    
    * fix some bugs
    
    * fix some bugs
    
    * fix some bug
    
    * fix some bug
    
    * fix some bugs
    
    * fix some bug
    
    * fix some bug
---
 .../admin/config/DiscoveryConfiguration.java       |  15 ++-
 .../admin/controller/ProxySelectorController.java  |  17 +++-
 .../admin/discovery/DefaultDiscoveryProcessor.java | 111 ++++++++++++++++++---
 .../DiscoveryDataChangedEventSyncListener.java     |  91 ++++++++---------
 .../DiscoveryDataInitializationRunner.java         |  73 --------------
 .../shenyu/admin/discovery/DiscoveryProcessor.java |  15 ++-
 .../admin/discovery/LocalDiscoveryProcessor.java   |  29 +++++-
 .../parse/CustomDiscoveryUpstreamParser.java       |   1 +
 .../listener/AbstractDataChangedListener.java      |  73 ++++++++++----
 .../admin/mapper/DiscoveryHandlerMapper.java       |  15 ++-
 .../shenyu/admin/mapper/DiscoveryRelMapper.java    |  12 +++
 .../admin/mapper/DiscoveryUpstreamMapper.java      |  22 +++-
 .../shenyu/admin/mapper/ProxySelectorMapper.java   |   7 ++
 .../shenyu/admin/service/DiscoveryService.java     |   7 +-
 .../admin/service/DiscoveryUpstreamService.java    |   8 ++
 .../shenyu/admin/service/ProxySelectorService.java |  17 ++++
 .../admin/service/impl/DiscoveryServiceImpl.java   |  38 ++++++-
 .../service/impl/DiscoveryUpstreamServiceImpl.java |  41 +++++++-
 .../service/impl/ProxySelectorServiceImpl.java     |  31 +++++-
 .../admin/service/impl/SyncDataServiceImpl.java    |   9 +-
 .../shenyu/admin/transfer/DiscoveryTransfer.java   |  53 +++++++++-
 .../resources/mappers/discovery-handler-sqlmap.xml |  17 +++-
 .../resources/mappers/discovery-rel-sqlmap.xml     |  20 ++--
 .../mappers/discovery-upstream-sqlmap.xml          |  37 +++++--
 .../resources/mappers/proxy-selector-sqlmap.xml    |  17 +++-
 .../admin/config/DataSyncConfigurationTest.java    |   6 +-
 .../listener/AbstractDataChangedListenerTest.java  |  20 ++++
 .../service/DiscoveryUpstreamServiceTest.java      |  11 +-
 .../shenyu/admin/service/SyncDataServiceTest.java  |   9 ++
 .../discovery/api/ShenyuDiscoveryService.java      |  12 ++-
 .../zookeeper/ZookeeperDiscoveryService.java       |  45 ++++++---
 31 files changed, 652 insertions(+), 227 deletions(-)

diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/config/DiscoveryConfiguration.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/config/DiscoveryConfiguration.java
index 378d82887..3c3041f99 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/config/DiscoveryConfiguration.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/config/DiscoveryConfiguration.java
@@ -21,7 +21,9 @@ import 
org.apache.shenyu.admin.discovery.DefaultDiscoveryProcessor;
 import org.apache.shenyu.admin.discovery.DiscoveryProcessor;
 import org.apache.shenyu.admin.discovery.DiscoveryProcessorHolder;
 import org.apache.shenyu.admin.discovery.LocalDiscoveryProcessor;
+import org.apache.shenyu.admin.mapper.DiscoveryHandlerMapper;
 import org.apache.shenyu.admin.mapper.DiscoveryUpstreamMapper;
+import org.apache.shenyu.admin.mapper.ProxySelectorMapper;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -36,22 +38,27 @@ public class DiscoveryConfiguration {
      * discoveryProcessor.
      *
      * @param discoveryUpstreamMapper discoveryUpstreamMapper
+     * @param discoveryHandlerMapper  discoveryHandlerMapper
+     * @param proxySelectorMapper     proxySelectorMapper
      * @return DiscoveryProcessor
      */
     @Bean("DefaultDiscoveryProcessor")
-    public DiscoveryProcessor discoveryDefaultProcessor(final 
DiscoveryUpstreamMapper discoveryUpstreamMapper) {
-        return new DefaultDiscoveryProcessor(discoveryUpstreamMapper);
+    public DiscoveryProcessor discoveryDefaultProcessor(final 
DiscoveryUpstreamMapper discoveryUpstreamMapper,
+                                                        final 
DiscoveryHandlerMapper discoveryHandlerMapper,
+                                                        final 
ProxySelectorMapper proxySelectorMapper) {
+        return new DefaultDiscoveryProcessor(discoveryUpstreamMapper, 
discoveryHandlerMapper, proxySelectorMapper);
     }
 
     /**
      * discoveryLocalProcessor.
      *
      * @param discoveryUpstreamMapper discoveryUpstreamMapper
+     * @param proxySelectorMapper proxySelectorMapper
      * @return LocalDiscoveryProcessor
      */
     @Bean("LocalDiscoveryProcessor")
-    public DiscoveryProcessor discoveryLocalProcessor(final 
DiscoveryUpstreamMapper discoveryUpstreamMapper) {
-        return new LocalDiscoveryProcessor();
+    public DiscoveryProcessor discoveryLocalProcessor(final 
DiscoveryUpstreamMapper discoveryUpstreamMapper, final ProxySelectorMapper 
proxySelectorMapper) {
+        return new LocalDiscoveryProcessor(discoveryUpstreamMapper, 
proxySelectorMapper);
     }
 
     /**
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/ProxySelectorController.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/ProxySelectorController.java
index 8b8042a15..0c07f098a 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/ProxySelectorController.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/ProxySelectorController.java
@@ -73,7 +73,7 @@ public class ProxySelectorController {
     /**
      * proxy selector add api.
      *
-     * @param id the id
+     * @param id                  the id
      * @param proxySelectorAddDTO {@link ProxySelectorAddDTO}
      * @return {@linkplain ShenyuAdminResult}
      */
@@ -108,4 +108,19 @@ public class ProxySelectorController {
 
         return 
ShenyuAdminResult.success(proxySelectorService.create(proxySelectorAddDTO), 
null);
     }
+
+
+    /**
+     * fetch data.
+     *
+     * @param discoveryHandlerId discoveryHandlerId
+     * @return {@linkplain ShenyuAdminResult}
+     */
+    @PutMapping("fetch/{discoveryHandlerId}")
+    public ShenyuAdminResult fetchData(@PathVariable("discoveryHandlerId") 
final String discoveryHandlerId) {
+
+        proxySelectorService.fetchData(discoveryHandlerId);
+        return ShenyuAdminResult.success();
+    }
+
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DefaultDiscoveryProcessor.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DefaultDiscoveryProcessor.java
index 362e133ed..9bbeb4f92 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DefaultDiscoveryProcessor.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DefaultDiscoveryProcessor.java
@@ -21,15 +21,23 @@ import org.apache.commons.lang3.NotImplementedException;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shenyu.admin.discovery.parse.CustomDiscoveryUpstreamParser;
 import org.apache.shenyu.admin.listener.DataChangedEvent;
+import org.apache.shenyu.admin.mapper.DiscoveryHandlerMapper;
 import org.apache.shenyu.admin.mapper.DiscoveryUpstreamMapper;
+import org.apache.shenyu.admin.mapper.ProxySelectorMapper;
 import org.apache.shenyu.admin.model.dto.DiscoveryHandlerDTO;
 import org.apache.shenyu.admin.model.dto.DiscoveryUpstreamDTO;
 import org.apache.shenyu.admin.model.dto.ProxySelectorDTO;
 import org.apache.shenyu.admin.model.entity.DiscoveryDO;
+import org.apache.shenyu.admin.model.entity.DiscoveryHandlerDO;
+import org.apache.shenyu.admin.model.entity.DiscoveryUpstreamDO;
+import org.apache.shenyu.admin.model.entity.ProxySelectorDO;
 import org.apache.shenyu.admin.transfer.DiscoveryTransfer;
+import org.apache.shenyu.common.dto.DiscoveryUpstreamData;
+import org.apache.shenyu.common.dto.DiscoverySyncData;
 import org.apache.shenyu.common.enums.ConfigGroupEnum;
 import org.apache.shenyu.common.enums.DataEventTypeEnum;
 import org.apache.shenyu.common.utils.GsonUtils;
+import org.apache.shenyu.common.utils.UUIDUtils;
 import org.apache.shenyu.discovery.api.ShenyuDiscoveryService;
 import org.apache.shenyu.discovery.api.config.DiscoveryConfig;
 import org.apache.shenyu.discovery.api.listener.DataChangedEventListener;
@@ -39,11 +47,16 @@ import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.ApplicationEventPublisherAware;
 
+import java.sql.Timestamp;
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 /**
  * DefaultDiscoveryProcessor.
@@ -56,19 +69,29 @@ public class DefaultDiscoveryProcessor implements 
DiscoveryProcessor, Applicatio
 
     private final Map<String, ShenyuDiscoveryService> discoveryServiceCache;
 
+    private final Map<String, Set<String>> dataChangedEventListenerCache;
+
     private ApplicationEventPublisher eventPublisher;
 
     private final DiscoveryUpstreamMapper discoveryUpstreamMapper;
 
+    private final DiscoveryHandlerMapper discoveryHandlerMapper;
+
+    private final ProxySelectorMapper proxySelectorMapper;
 
     /**
      * DefaultDiscoveryProcessor.
      *
      * @param discoveryUpstreamMapper discoveryUpstreamMapper
      */
-    public DefaultDiscoveryProcessor(final DiscoveryUpstreamMapper 
discoveryUpstreamMapper) {
+    public DefaultDiscoveryProcessor(final DiscoveryUpstreamMapper 
discoveryUpstreamMapper,
+                                     final DiscoveryHandlerMapper 
discoveryHandlerMapper,
+                                     final ProxySelectorMapper 
proxySelectorMapper) {
         this.discoveryUpstreamMapper = discoveryUpstreamMapper;
         this.discoveryServiceCache = new ConcurrentHashMap<>();
+        this.discoveryHandlerMapper = discoveryHandlerMapper;
+        this.dataChangedEventListenerCache = new ConcurrentHashMap<>();
+        this.proxySelectorMapper = proxySelectorMapper;
     }
 
     @Override
@@ -84,21 +107,28 @@ public class DefaultDiscoveryProcessor implements 
DiscoveryProcessor, Applicatio
         discoveryConfig.setServerList(discoveryDO.getServerList());
         discoveryService.init(discoveryConfig);
         discoveryServiceCache.put(discoveryDO.getId(), discoveryService);
+        dataChangedEventListenerCache.put(discoveryDO.getId(), new 
HashSet<>());
     }
 
     @Override
     public void createProxySelector(final DiscoveryHandlerDTO 
discoveryHandlerDTO, final ProxySelectorDTO proxySelectorDTO) {
         ShenyuDiscoveryService shenyuDiscoveryService = 
discoveryServiceCache.get(discoveryHandlerDTO.getDiscoveryId());
+        String key = 
buildProxySelectorKey(discoveryHandlerDTO.getListenerNode());
         if (Objects.isNull(shenyuDiscoveryService)) {
             LOG.warn("before start ProxySelector you need init 
DiscoveryId={}", discoveryHandlerDTO.getDiscoveryId());
             return;
         }
-        String key = buildProxySelectorKey(discoveryHandlerDTO);
-        if (StringUtils.isEmpty(shenyuDiscoveryService.getData(key))) {
-            LOG.info("shenyu discovery {} is empty need register it ", key);
-            shenyuDiscoveryService.register(key, 
GsonUtils.getInstance().toJson(discoveryHandlerDTO) + "|" + 
GsonUtils.getInstance().toJson(proxySelectorDTO));
+        if (!shenyuDiscoveryService.exits(key)) {
+            LOG.warn("shenyu discovery start watcher need you has this key {} 
in Discovery", key);
+            return;
         }
-        shenyuDiscoveryService.watcher(key, 
getDiscoveryDataChangedEventListener(proxySelectorDTO.getType(), 
discoveryHandlerDTO.getProps()));
+        Set<String> cacheKey = 
dataChangedEventListenerCache.get(discoveryHandlerDTO.getDiscoveryId());
+        if (Objects.nonNull(cacheKey) && cacheKey.contains(key)) {
+            LOG.warn("shenyu discovery has watcher key {} ", key);
+            return;
+        }
+        shenyuDiscoveryService.watcher(key, 
getDiscoveryDataChangedEventListener(discoveryHandlerDTO, proxySelectorDTO));
+        cacheKey.add(key);
         DataChangedEvent dataChangedEvent = new 
DataChangedEvent(ConfigGroupEnum.PROXY_SELECTOR, DataEventTypeEnum.CREATE,
                 
Collections.singletonList(DiscoveryTransfer.INSTANCE.mapToData(proxySelectorDTO)));
         eventPublisher.publishEvent(dataChangedEvent);
@@ -123,7 +153,7 @@ public class DefaultDiscoveryProcessor implements 
DiscoveryProcessor, Applicatio
     @Override
     public void removeProxySelector(final DiscoveryHandlerDTO 
discoveryHandlerDTO, final ProxySelectorDTO proxySelectorDTO) {
         ShenyuDiscoveryService shenyuDiscoveryService = 
discoveryServiceCache.get(discoveryHandlerDTO.getDiscoveryId());
-        String key = buildProxySelectorKey(discoveryHandlerDTO);
+        String key = 
buildProxySelectorKey(discoveryHandlerDTO.getListenerNode());
         shenyuDiscoveryService.unWatcher(key);
         DataChangedEvent dataChangedEvent = new 
DataChangedEvent(ConfigGroupEnum.PROXY_SELECTOR, DataEventTypeEnum.DELETE,
                 
Collections.singletonList(DiscoveryTransfer.INSTANCE.mapToData(proxySelectorDTO)));
@@ -131,35 +161,84 @@ public class DefaultDiscoveryProcessor implements 
DiscoveryProcessor, Applicatio
     }
 
     @Override
-    public void changeUpstream(final DiscoveryHandlerDTO discoveryHandlerDTO, 
final ProxySelectorDTO proxySelectorDTO, final List<DiscoveryUpstreamDTO> 
upstreamDTOS) {
+    public void changeUpstream(final ProxySelectorDTO proxySelectorDTO, final 
List<DiscoveryUpstreamDTO> upstreamDTOS) {
         throw new NotImplementedException("shenyu discovery local mode do 
nothing in changeUpstream");
     }
 
+    @Override
+    public void fetchAll(final String discoveryHandlerId) {
+        DiscoveryHandlerDO discoveryHandlerDO = 
discoveryHandlerMapper.selectById(discoveryHandlerId);
+        String discoveryId = discoveryHandlerDO.getDiscoveryId();
+        if (discoveryServiceCache.containsKey(discoveryId)) {
+            ShenyuDiscoveryService shenyuDiscoveryService = 
discoveryServiceCache.get(discoveryId);
+            List<String> childData = 
shenyuDiscoveryService.getRegisterData(buildProxySelectorKey(discoveryHandlerDO.getListenerNode()));
+            List<DiscoveryUpstreamData> discoveryUpstreamDataList = 
childData.stream().map(s -> GsonUtils.getGson().fromJson(s, 
DiscoveryUpstreamData.class))
+                    .collect(Collectors.toList());
+            Set<String> urlList = 
discoveryUpstreamDataList.stream().map(DiscoveryUpstreamData::getUrl).collect(Collectors.toSet());
+            List<DiscoveryUpstreamDO> discoveryUpstreamDOS = 
discoveryUpstreamMapper.selectByDiscoveryHandlerId(discoveryHandlerId);
+            Set<String> dbUrlList = 
discoveryUpstreamDOS.stream().map(DiscoveryUpstreamDO::getUrl).collect(Collectors.toSet());
+            List<String> deleteIds = new ArrayList<>();
+            for (DiscoveryUpstreamDO discoveryUpstreamDO : 
discoveryUpstreamDOS) {
+                if (!urlList.contains(discoveryUpstreamDO.getUrl())) {
+                    deleteIds.add(discoveryUpstreamDO.getId());
+                }
+            }
+            if (!deleteIds.isEmpty()) {
+                discoveryUpstreamMapper.deleteByIds(deleteIds);
+            }
+            for (DiscoveryUpstreamData currDiscoveryUpstreamDate : 
discoveryUpstreamDataList) {
+                if (!dbUrlList.contains(currDiscoveryUpstreamDate.getUrl())) {
+                    DiscoveryUpstreamDO discoveryUpstreamDO = 
DiscoveryTransfer.INSTANCE.mapToDo(currDiscoveryUpstreamDate);
+                    
discoveryUpstreamDO.setId(UUIDUtils.getInstance().generateShortUuid());
+                    
discoveryUpstreamDO.setDiscoveryHandlerId(discoveryHandlerId);
+                    discoveryUpstreamDO.setDateCreated(new 
Timestamp(System.currentTimeMillis()));
+                    discoveryUpstreamDO.setDateUpdated(new 
Timestamp(System.currentTimeMillis()));
+                    discoveryUpstreamMapper.insert(discoveryUpstreamDO);
+                }
+            }
+
+            ProxySelectorDO proxySelectorDO = 
proxySelectorMapper.selectByHandlerId(discoveryHandlerId);
+            DiscoverySyncData discoverySyncData = new DiscoverySyncData();
+            discoverySyncData.setSelectorId(proxySelectorDO.getId());
+            discoverySyncData.setSelectorName(proxySelectorDO.getName());
+            discoverySyncData.setPluginName(proxySelectorDO.getPluginName());
+            discoverySyncData.setUpstreamDataList(discoveryUpstreamDataList);
+            DataChangedEvent dataChangedEvent = new 
DataChangedEvent(ConfigGroupEnum.DISCOVER_UPSTREAM, DataEventTypeEnum.UPDATE, 
Collections.singletonList(discoverySyncData));
+            eventPublisher.publishEvent(dataChangedEvent);
+        }
+    }
+
     /**
      * buildProxySelectorKey.
      *
-     * @param discoveryHandlerDTO discoveryHandlerDTO
+     * @param listenerNode listenerNode
      * @return key
      */
-    private String buildProxySelectorKey(final DiscoveryHandlerDTO 
discoveryHandlerDTO) {
-        return StringUtils.isNotBlank(discoveryHandlerDTO.getListenerNode()) ? 
discoveryHandlerDTO.getListenerNode() : DEFAULT_LISTENER_NODE;
+    private String buildProxySelectorKey(final String listenerNode) {
+        return StringUtils.isNotBlank(listenerNode) ? listenerNode : 
DEFAULT_LISTENER_NODE;
     }
 
+
     /**
      * getDiscoveryDataChangedEventListener.
      *
-     * @param discoveryType discoveryType
-     * @param customProps   customProps
+     * @param discoveryHandlerDTO discoveryHandlerDTO
+     * @param proxySelectorDTO    proxySelectorDTO
      * @return DataChangedEventListener
      */
-    private DataChangedEventListener 
getDiscoveryDataChangedEventListener(final String discoveryType, final String 
customProps) {
-        Map<String, String> customMap = 
GsonUtils.getInstance().toObjectMap(customProps, String.class);
+    private DataChangedEventListener 
getDiscoveryDataChangedEventListener(final DiscoveryHandlerDTO 
discoveryHandlerDTO, final ProxySelectorDTO proxySelectorDTO) {
+        final Map<String, String> customMap = 
GsonUtils.getInstance().toObjectMap(discoveryHandlerDTO.getHandler(), 
String.class);
+        DiscoverySyncData discoverySyncData = new DiscoverySyncData();
+        discoverySyncData.setPluginName(proxySelectorDTO.getPluginName());
+        discoverySyncData.setSelectorName(proxySelectorDTO.getName());
+        discoverySyncData.setSelectorId(proxySelectorDTO.getId());
         return new DiscoveryDataChangedEventSyncListener(eventPublisher, 
discoveryUpstreamMapper,
-                new CustomDiscoveryUpstreamParser(customMap), 
!DiscoveryMode.LOCAL.name().equalsIgnoreCase(discoveryType));
+                new CustomDiscoveryUpstreamParser(customMap), 
discoveryHandlerDTO.getId(), discoverySyncData);
     }
 
     @Override
     public void setApplicationEventPublisher(final ApplicationEventPublisher 
eventPublisher) {
         this.eventPublisher = eventPublisher;
     }
+
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DiscoveryDataChangedEventSyncListener.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DiscoveryDataChangedEventSyncListener.java
index c4095544f..970507fdf 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DiscoveryDataChangedEventSyncListener.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DiscoveryDataChangedEventSyncListener.java
@@ -21,15 +21,12 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.shenyu.admin.discovery.parse.KeyValueParser;
 import org.apache.shenyu.admin.listener.DataChangedEvent;
 import org.apache.shenyu.admin.mapper.DiscoveryUpstreamMapper;
-import org.apache.shenyu.admin.model.dto.DiscoveryHandlerDTO;
 import org.apache.shenyu.admin.model.entity.DiscoveryUpstreamDO;
-import org.apache.shenyu.admin.model.entity.ProxySelectorDO;
 import org.apache.shenyu.admin.transfer.DiscoveryTransfer;
 import org.apache.shenyu.common.dto.DiscoverySyncData;
 import org.apache.shenyu.common.dto.DiscoveryUpstreamData;
 import org.apache.shenyu.common.enums.ConfigGroupEnum;
 import org.apache.shenyu.common.enums.DataEventTypeEnum;
-import org.apache.shenyu.common.utils.GsonUtils;
 import org.apache.shenyu.common.utils.UUIDUtils;
 import org.apache.shenyu.discovery.api.listener.DiscoveryDataChangedEvent;
 import org.apache.shenyu.discovery.api.listener.DataChangedEventListener;
@@ -56,16 +53,20 @@ public class DiscoveryDataChangedEventSyncListener 
implements DataChangedEventLi
 
     private final DiscoveryUpstreamMapper discoveryUpstreamMapper;
 
-    private final Boolean needPersistence;
+    private final String discoveryHandlerId;
+
+    private final DiscoverySyncData contextInfo;
 
     public DiscoveryDataChangedEventSyncListener(final 
ApplicationEventPublisher eventPublisher,
                                                  final DiscoveryUpstreamMapper 
discoveryUpstreamMapper,
                                                  final KeyValueParser 
keyValueParser,
-                                                 final Boolean 
needPersistence) {
+                                                 final String 
discoveryHandlerId,
+                                                 final DiscoverySyncData 
contextInfo) {
         this.eventPublisher = eventPublisher;
         this.keyValueParser = keyValueParser;
         this.discoveryUpstreamMapper = discoveryUpstreamMapper;
-        this.needPersistence = needPersistence;
+        this.discoveryHandlerId = discoveryHandlerId;
+        this.contextInfo = contextInfo;
     }
 
     @Override
@@ -75,47 +76,44 @@ public class DiscoveryDataChangedEventSyncListener 
implements DataChangedEventLi
             return;
         }
         DiscoverySyncData discoverySyncData = 
buildProxySelectorData(event.getValue());
-        DataChangedEvent dataChangedEvent = null;
-        List<DiscoveryUpstreamData> upstreamDataList = 
discoverySyncData.getUpstreamDataList();
-        if (needPersistence) {
-            if (CollectionUtils.isEmpty(upstreamDataList)) {
-                LOGGER.warn("shenyu proxySelectorData#discoveryUpstreamList is 
empty");
-                return;
-            }
-            switch (currentEvent) {
-                case ADDED:
-                    upstreamDataList.forEach(d -> {
+        final List<DiscoveryUpstreamData> upstreamDataList = 
discoverySyncData.getUpstreamDataList();
+        if (CollectionUtils.isEmpty(upstreamDataList)) {
+            LOGGER.warn("shenyu proxySelectorData#discoveryUpstreamList is 
empty");
+            return;
+        }
+        switch (currentEvent) {
+            case ADDED:
+                upstreamDataList.forEach(d -> {
+                    if 
(Objects.isNull(discoveryUpstreamMapper.selectByDiscoveryHandlerIdAndUrl(discoveryHandlerId,
 d.getUrl()))) {
                         d.setId(UUIDUtils.getInstance().generateShortUuid());
                         d.setDateCreated(new 
Timestamp(System.currentTimeMillis()));
                         d.setDateUpdated(new 
Timestamp(System.currentTimeMillis()));
                         
discoveryUpstreamMapper.insert(DiscoveryTransfer.INSTANCE.mapToDo(d));
                         LOGGER.info("shenyu 
[DiscoveryDataChangedEventSyncListener] ADDED Upstream {}", d.getUrl());
-                    });
-                    break;
-                case UPDATED:
-                    upstreamDataList.forEach(d -> {
-                        DiscoveryUpstreamDO discoveryUpstreamDO = 
DiscoveryTransfer.INSTANCE.mapToDo(d);
-                        discoveryUpstreamMapper.update(discoveryUpstreamDO);
-                        LOGGER.info("shenyu 
[DiscoveryDataChangedEventSyncListener] UPDATE Upstream {}", 
discoveryUpstreamDO.getUrl());
-                    });
-                    break;
-                case DELETED:
-                    if (CollectionUtils.isNotEmpty(upstreamDataList)) {
-                        upstreamDataList.forEach(up -> {
-                            discoveryUpstreamMapper.deleteByUrl(up.getUrl());
-                            LOGGER.info("shenyu 
[DiscoveryDataChangedEventSyncListener] DELETE Upstream {}", up.getUrl());
-                        });
                     }
-                    break;
-                default:
-                    throw new IllegalStateException("shenyu 
DiscoveryDataChangedEventSyncListener find IllegalState");
-            }
-            fillFullyDiscoverySyncData(discoverySyncData);
-            dataChangedEvent = new 
DataChangedEvent(ConfigGroupEnum.DISCOVER_UPSTREAM, DataEventTypeEnum.UPDATE, 
Collections.singletonList(discoverySyncData));
-        }
-        if (Objects.nonNull(dataChangedEvent)) {
-            eventPublisher.publishEvent(dataChangedEvent);
+                });
+                break;
+            case UPDATED:
+                
upstreamDataList.stream().map(DiscoveryTransfer.INSTANCE::mapToDo).forEach(discoveryUpstreamDO
 -> {
+                    
discoveryUpstreamDO.setDiscoveryHandlerId(discoveryHandlerId);
+                    int effect = 
discoveryUpstreamMapper.updateDiscoveryHandlerIdAndUrl(discoveryUpstreamDO);
+                    LOGGER.info("shenyu 
[DiscoveryDataChangedEventSyncListener] UPDATE Upstream {}, effect = {} ", 
discoveryUpstreamDO.getUrl(), effect);
+                });
+                break;
+            case DELETED:
+                if (CollectionUtils.isNotEmpty(upstreamDataList)) {
+                    upstreamDataList.forEach(up -> {
+                        
discoveryUpstreamMapper.deleteByUrl(discoveryHandlerId, up.getUrl());
+                        LOGGER.info("shenyu 
[DiscoveryDataChangedEventSyncListener] DELETE Upstream {}", up.getUrl());
+                    });
+                }
+                break;
+            default:
+                throw new IllegalStateException("shenyu 
DiscoveryDataChangedEventSyncListener find IllegalState");
         }
+        fillFullyDiscoverySyncData(discoverySyncData);
+        DataChangedEvent dataChangedEvent = new 
DataChangedEvent(ConfigGroupEnum.DISCOVER_UPSTREAM, DataEventTypeEnum.UPDATE, 
Collections.singletonList(discoverySyncData));
+        eventPublisher.publishEvent(dataChangedEvent);
     }
 
     private void fillFullyDiscoverySyncData(final DiscoverySyncData 
discoverySyncData) {
@@ -125,16 +123,13 @@ public class DiscoveryDataChangedEventSyncListener 
implements DataChangedEventLi
     }
 
     private DiscoverySyncData buildProxySelectorData(final String value) {
-        String[] splitArr = value.split("[|]");
-        DiscoveryHandlerDTO discoveryHandlerDTO = 
GsonUtils.getInstance().fromJson(splitArr[0], DiscoveryHandlerDTO.class);
-        ProxySelectorDO proxySelectorDO = 
GsonUtils.getInstance().fromJson(splitArr[1], ProxySelectorDO.class);
-        List<DiscoveryUpstreamData> discoveryUpstreamDTOS = 
keyValueParser.parseValue(splitArr[2]);
-        discoveryUpstreamDTOS.forEach(s -> 
s.setDiscoveryHandlerId(discoveryHandlerDTO.getId()));
+        List<DiscoveryUpstreamData> discoveryUpstreamDTOS = 
keyValueParser.parseValue(value);
+        discoveryUpstreamDTOS.forEach(s -> 
s.setDiscoveryHandlerId(discoveryHandlerId));
         DiscoverySyncData data = new DiscoverySyncData();
         data.setUpstreamDataList(discoveryUpstreamDTOS);
-        data.setSelectorId(proxySelectorDO.getId());
-        data.setSelectorName(proxySelectorDO.getName());
-        data.setPluginName(proxySelectorDO.getPluginName());
+        data.setSelectorId(contextInfo.getSelectorId());
+        data.setSelectorName(contextInfo.getSelectorName());
+        data.setPluginName(contextInfo.getPluginName());
         return data;
     }
 
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DiscoveryDataInitializationRunner.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DiscoveryDataInitializationRunner.java
deleted file mode 100644
index 42de17415..000000000
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DiscoveryDataInitializationRunner.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.discovery;
-
-import org.apache.shenyu.admin.mapper.DiscoveryHandlerMapper;
-import org.apache.shenyu.admin.mapper.DiscoveryMapper;
-import org.apache.shenyu.admin.mapper.ProxySelectorMapper;
-import org.apache.shenyu.admin.model.entity.DiscoveryDO;
-import org.apache.shenyu.admin.model.entity.DiscoveryHandlerDO;
-import org.apache.shenyu.admin.transfer.DiscoveryTransfer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * to load database discovery data.
- */
-@Component
-public class DiscoveryDataInitializationRunner implements CommandLineRunner {
-
-    private static final Logger LOG = 
LoggerFactory.getLogger(DiscoveryDataInitializationRunner.class);
-
-    private final DiscoveryMapper discoveryMapper;
-
-    private final ProxySelectorMapper proxySelectorMapper;
-
-    private final DiscoveryHandlerMapper discoveryHandlerMapper;
-
-    private final DiscoveryProcessorHolder discoveryProcessorHolder;
-
-    public DiscoveryDataInitializationRunner(final DiscoveryMapper 
discoveryMapper,
-                                             final ProxySelectorMapper 
proxySelectorMapper,
-                                             final DiscoveryHandlerMapper 
discoveryHandlerMapper,
-                                             final DiscoveryProcessorHolder 
discoveryProcessorHolder) {
-        this.discoveryMapper = discoveryMapper;
-        this.proxySelectorMapper = proxySelectorMapper;
-        this.discoveryHandlerMapper = discoveryHandlerMapper;
-        this.discoveryProcessorHolder = discoveryProcessorHolder;
-    }
-
-    @Override
-    public void run(final String... args) throws Exception {
-        LOG.info("shenyu DiscoveryDataInitializationRunner fetch db ");
-        List<DiscoveryDO> discoveryDOS = discoveryMapper.selectAll();
-        discoveryDOS.stream().filter(d -> 
!DiscoveryMode.LOCAL.name().equalsIgnoreCase(d.getType())).forEach(d -> {
-            DiscoveryProcessor discoveryProcessor = 
discoveryProcessorHolder.chooseProcessor(d.getType());
-            discoveryProcessor.createDiscovery(d);
-            
proxySelectorMapper.selectByDiscoveryId(d.getId()).stream().map(DiscoveryTransfer.INSTANCE::mapToDTO).forEach(ps
 -> {
-                DiscoveryHandlerDO discoveryHandlerDO = 
discoveryHandlerMapper.selectByDiscoveryId(d.getId());
-                
discoveryProcessor.createProxySelector(DiscoveryTransfer.INSTANCE.mapToDTO(discoveryHandlerDO),
 ps);
-            });
-        });
-    }
-
-}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DiscoveryProcessor.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DiscoveryProcessor.java
index 50b3338a1..324083f2c 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DiscoveryProcessor.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/DiscoveryProcessor.java
@@ -62,10 +62,17 @@ public interface DiscoveryProcessor {
     /**
      * only use in local mode to sync upstreamDTOS.
      *
-     * @param discoveryHandlerDTO discoveryHandlerDTO
-     * @param proxySelectorDTO    proxySelectorDTO
-     * @param upstreamDTOS        upstreamDTOS
+     * @param proxySelectorDTO proxySelectorDTO
+     * @param upstreamDTOS     upstreamDTOS
+     */
+    void changeUpstream(ProxySelectorDTO proxySelectorDTO, 
List<DiscoveryUpstreamDTO> upstreamDTOS);
+
+
+    /**
+     * sync all upstream list to gateway and db.
+     *
+     * @param discoveryHandlerId discoveryHandlerId
      */
-    void changeUpstream(DiscoveryHandlerDTO discoveryHandlerDTO, 
ProxySelectorDTO proxySelectorDTO, List<DiscoveryUpstreamDTO> upstreamDTOS);
+    void fetchAll(String discoveryHandlerId);
 
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/LocalDiscoveryProcessor.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/LocalDiscoveryProcessor.java
index 755c70f92..16747e544 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/LocalDiscoveryProcessor.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/LocalDiscoveryProcessor.java
@@ -18,10 +18,14 @@
 package org.apache.shenyu.admin.discovery;
 
 import org.apache.shenyu.admin.listener.DataChangedEvent;
+import org.apache.shenyu.admin.mapper.DiscoveryUpstreamMapper;
+import org.apache.shenyu.admin.mapper.ProxySelectorMapper;
 import org.apache.shenyu.admin.model.dto.DiscoveryHandlerDTO;
 import org.apache.shenyu.admin.model.dto.DiscoveryUpstreamDTO;
 import org.apache.shenyu.admin.model.dto.ProxySelectorDTO;
 import org.apache.shenyu.admin.model.entity.DiscoveryDO;
+import org.apache.shenyu.admin.model.entity.DiscoveryUpstreamDO;
+import org.apache.shenyu.admin.model.entity.ProxySelectorDO;
 import org.apache.shenyu.admin.transfer.DiscoveryTransfer;
 import org.apache.shenyu.common.dto.DiscoverySyncData;
 import org.apache.shenyu.common.dto.DiscoveryUpstreamData;
@@ -45,6 +49,15 @@ public class LocalDiscoveryProcessor implements 
DiscoveryProcessor, ApplicationE
 
     private ApplicationEventPublisher eventPublisher;
 
+    private final DiscoveryUpstreamMapper discoveryUpstreamMapper;
+
+    private final ProxySelectorMapper proxySelectorMapper;
+
+    public LocalDiscoveryProcessor(final DiscoveryUpstreamMapper 
discoveryUpstreamMapper, final ProxySelectorMapper proxySelectorMapper) {
+        this.discoveryUpstreamMapper = discoveryUpstreamMapper;
+        this.proxySelectorMapper = proxySelectorMapper;
+    }
+
     @Override
     public void createDiscovery(final DiscoveryDO discoveryDO) {
         LOG.info("shenyu discovery local mode do nothing in createDiscovery");
@@ -70,7 +83,7 @@ public class LocalDiscoveryProcessor implements 
DiscoveryProcessor, ApplicationE
     }
 
     @Override
-    public void changeUpstream(final DiscoveryHandlerDTO discoveryHandlerDTO, 
final ProxySelectorDTO proxySelectorDTO, final List<DiscoveryUpstreamDTO> 
upstreamDTOS) {
+    public void changeUpstream(final ProxySelectorDTO proxySelectorDTO, final 
List<DiscoveryUpstreamDTO> upstreamDTOS) {
         DiscoverySyncData discoverySyncData = new DiscoverySyncData();
         discoverySyncData.setPluginName(proxySelectorDTO.getPluginName());
         discoverySyncData.setSelectorId(proxySelectorDTO.getId());
@@ -86,4 +99,18 @@ public class LocalDiscoveryProcessor implements 
DiscoveryProcessor, ApplicationE
         this.eventPublisher = applicationEventPublisher;
     }
 
+    @Override
+    public void fetchAll(final String discoveryHandlerId) {
+        List<DiscoveryUpstreamDO> discoveryUpstreamDOS = 
discoveryUpstreamMapper.selectByDiscoveryHandlerId(discoveryHandlerId);
+        ProxySelectorDO proxySelectorDO = 
proxySelectorMapper.selectByHandlerId(discoveryHandlerId);
+        DiscoverySyncData discoverySyncData = new DiscoverySyncData();
+        discoverySyncData.setPluginName(proxySelectorDO.getPluginName());
+        discoverySyncData.setSelectorId(proxySelectorDO.getId());
+        discoverySyncData.setSelectorName(proxySelectorDO.getName());
+        List<DiscoveryUpstreamData> upstreamDataList = 
discoveryUpstreamDOS.stream().map(DiscoveryTransfer.INSTANCE::mapToData).collect(Collectors.toList());
+        discoverySyncData.setUpstreamDataList(upstreamDataList);
+        DataChangedEvent dataChangedEvent = new 
DataChangedEvent(ConfigGroupEnum.DISCOVER_UPSTREAM, DataEventTypeEnum.UPDATE, 
Collections.singletonList(discoverySyncData));
+        eventPublisher.publishEvent(dataChangedEvent);
+    }
+
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/parse/CustomDiscoveryUpstreamParser.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/parse/CustomDiscoveryUpstreamParser.java
index ec19b8a4f..4a0fb438e 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/parse/CustomDiscoveryUpstreamParser.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/discovery/parse/CustomDiscoveryUpstreamParser.java
@@ -40,6 +40,7 @@ import java.util.Map;
  *
  * <p>
  * You can define a custom map mapper  if your custom upstream doesn't fit
+ * like is {"${yourUserName}" : "url"}
  * </p>
  */
 public class CustomDiscoveryUpstreamParser implements 
JsonDeserializer<DiscoveryUpstreamData>, KeyValueParser {
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/AbstractDataChangedListener.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/AbstractDataChangedListener.java
index 7c01a682c..7c28a5cc0 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/AbstractDataChangedListener.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/AbstractDataChangedListener.java
@@ -24,12 +24,16 @@ import org.apache.shenyu.admin.service.MetaDataService;
 import org.apache.shenyu.admin.service.PluginService;
 import org.apache.shenyu.admin.service.RuleService;
 import org.apache.shenyu.admin.service.SelectorService;
+import org.apache.shenyu.admin.service.ProxySelectorService;
+import org.apache.shenyu.admin.service.DiscoveryUpstreamService;
 import org.apache.shenyu.common.dto.AppAuthData;
 import org.apache.shenyu.common.dto.ConfigData;
 import org.apache.shenyu.common.dto.MetaData;
 import org.apache.shenyu.common.dto.PluginData;
 import org.apache.shenyu.common.dto.RuleData;
 import org.apache.shenyu.common.dto.SelectorData;
+import org.apache.shenyu.common.dto.DiscoverySyncData;
+import org.apache.shenyu.common.dto.ProxySelectorData;
 import org.apache.shenyu.common.enums.ConfigGroupEnum;
 import org.apache.shenyu.common.enums.DataEventTypeEnum;
 import org.apache.shenyu.common.utils.GsonUtils;
@@ -81,9 +85,18 @@ public abstract class AbstractDataChangedListener implements 
DataChangedListener
     @Resource
     private SelectorService selectorService;
 
+    /**
+     * The MetaData service.
+     */
     @Resource
     private MetaDataService metaDataService;
 
+    @Resource
+    private ProxySelectorService proxySelectorService;
+
+    @Resource
+    private DiscoveryUpstreamService discoveryUpstreamService;
+
     /**
      * fetch configuration from cache.
      *
@@ -103,11 +116,15 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
                 return buildConfigData(config, SelectorData.class);
             case META_DATA:
                 return buildConfigData(config, MetaData.class);
+            case PROXY_SELECTOR:
+                return buildConfigData(config, ProxySelectorData.class);
+            case DISCOVER_UPSTREAM:
+                return buildConfigData(config, DiscoverySyncData.class);
             default:
                 throw new IllegalStateException("Unexpected groupKey: " + 
groupKey);
         }
     }
-    
+
     @Override
     public void onAppAuthChanged(final List<AppAuthData> changed, final 
DataEventTypeEnum eventType) {
         if (CollectionUtils.isEmpty(changed)) {
@@ -116,7 +133,7 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
         this.updateAppAuthCache();
         this.afterAppAuthChanged(changed, eventType);
     }
-    
+
     /**
      * After app auth changed.
      *
@@ -125,7 +142,7 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
      */
     protected void afterAppAuthChanged(final List<AppAuthData> changed, final 
DataEventTypeEnum eventType) {
     }
-    
+
     @Override
     public void onMetaDataChanged(final List<MetaData> changed, final 
DataEventTypeEnum eventType) {
         if (CollectionUtils.isEmpty(changed)) {
@@ -134,7 +151,7 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
         this.updateMetaDataCache();
         this.afterMetaDataChanged(changed, eventType);
     }
-    
+
     /**
      * After meta data changed.
      *
@@ -143,7 +160,7 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
      */
     protected void afterMetaDataChanged(final List<MetaData> changed, final 
DataEventTypeEnum eventType) {
     }
-    
+
     @Override
     public void onPluginChanged(final List<PluginData> changed, final 
DataEventTypeEnum eventType) {
         if (CollectionUtils.isEmpty(changed)) {
@@ -152,7 +169,7 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
         this.updatePluginCache();
         this.afterPluginChanged(changed, eventType);
     }
-    
+
     /**
      * After plugin changed.
      *
@@ -161,7 +178,7 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
      */
     protected void afterPluginChanged(final List<PluginData> changed, final 
DataEventTypeEnum eventType) {
     }
-    
+
     @Override
     public void onRuleChanged(final List<RuleData> changed, final 
DataEventTypeEnum eventType) {
         if (CollectionUtils.isEmpty(changed)) {
@@ -170,7 +187,7 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
         this.updateRuleCache();
         this.afterRuleChanged(changed, eventType);
     }
-    
+
     /**
      * After rule changed.
      *
@@ -179,7 +196,7 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
      */
     protected void afterRuleChanged(final List<RuleData> changed, final 
DataEventTypeEnum eventType) {
     }
-    
+
     @Override
     public void onSelectorChanged(final List<SelectorData> changed, final 
DataEventTypeEnum eventType) {
         if (CollectionUtils.isEmpty(changed)) {
@@ -188,7 +205,7 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
         this.updateSelectorCache();
         this.afterSelectorChanged(changed, eventType);
     }
-    
+
     /**
      * After selector changed.
      *
@@ -197,20 +214,21 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
      */
     protected void afterSelectorChanged(final List<SelectorData> changed, 
final DataEventTypeEnum eventType) {
     }
-    
+
     @Override
     public final void afterPropertiesSet() {
         this.refreshLocalCache();
         this.afterInitialize();
     }
-    
+
     protected abstract void afterInitialize();
-    
+
     /**
      * if md5 is not the same as the original, then update lcoal cache.
+     *
      * @param group ConfigGroupEnum
-     * @param <T> the type of class
-     * @param data the new config data
+     * @param <T>   the type of class
+     * @param data  the new config data
      */
     protected <T> void updateCache(final ConfigGroupEnum group, final List<T> 
data) {
         String json = GsonUtils.getInstance().toJson(data);
@@ -218,7 +236,7 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
         ConfigDataCache oldVal = CACHE.put(newVal.getGroup(), newVal);
         LOG.info("update config cache[{}], old: {}, updated: {}", group, 
oldVal, newVal);
     }
-    
+
     /**
      * refresh local cache.
      */
@@ -228,44 +246,55 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
         this.updateRuleCache();
         this.updateSelectorCache();
         this.updateMetaDataCache();
+        this.updateProxySelectorDataCache();
+        this.updateDiscoveryUpstreamDataCache();
     }
-    
+
     /**
      * Update selector cache.
      */
     protected void updateSelectorCache() {
         this.updateCache(ConfigGroupEnum.SELECTOR, selectorService.listAll());
     }
-    
+
     /**
      * Update rule cache.
      */
     protected void updateRuleCache() {
         this.updateCache(ConfigGroupEnum.RULE, ruleService.listAll());
     }
-    
+
     /**
      * Update plugin cache.
      */
     protected void updatePluginCache() {
         this.updateCache(ConfigGroupEnum.PLUGIN, pluginService.listAll());
     }
-    
+
     /**
      * Update app auth cache.
      */
     protected void updateAppAuthCache() {
         this.updateCache(ConfigGroupEnum.APP_AUTH, appAuthService.listAll());
     }
-    
+
     /**
      * Update meta data cache.
      */
     protected void updateMetaDataCache() {
         this.updateCache(ConfigGroupEnum.META_DATA, metaDataService.listAll());
     }
-    
+
+    protected void updateProxySelectorDataCache() {
+        this.updateCache(ConfigGroupEnum.PROXY_SELECTOR, 
proxySelectorService.listAll());
+    }
+
+    protected void updateDiscoveryUpstreamDataCache() {
+        this.updateCache(ConfigGroupEnum.DISCOVER_UPSTREAM, 
discoveryUpstreamService.listAll());
+    }
+
     private <T> ConfigData<T> buildConfigData(final ConfigDataCache config, 
final Class<T> dataType) {
         return new ConfigData<>(config.getMd5(), config.getLastModifyTime(), 
GsonUtils.getInstance().fromList(config.getJson(), dataType));
     }
+
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DiscoveryHandlerMapper.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DiscoveryHandlerMapper.java
index 81cd53bdd..333b8b2ea 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DiscoveryHandlerMapper.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DiscoveryHandlerMapper.java
@@ -23,6 +23,7 @@ import 
org.apache.shenyu.admin.model.entity.DiscoveryHandlerDO;
 import org.apache.shenyu.admin.validation.ExistProvider;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * DiscoveryHandlerMapper.
@@ -88,10 +89,18 @@ public interface DiscoveryHandlerMapper extends 
ExistProvider {
     int delete(String id);
 
     /**
-     * selectByDiscoveryId.
+     * selectByProxySelectorId.
      *
-     * @param discoveryId discoveryId
+     * @param proxySelectorId proxySelectorId
      * @return DiscoveryHandlerDO
      */
-    DiscoveryHandlerDO selectByDiscoveryId(@Param("discoveryId") String 
discoveryId);
+    DiscoveryHandlerDO selectByProxySelectorId(@Param("proxySelectorId") 
String proxySelectorId);
+
+    /**
+     * DiscoveryHandlerDOList.
+     *
+     * @return DiscoveryHandlerDOListx
+     */
+    List<DiscoveryHandlerDO> selectAll();
+
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DiscoveryRelMapper.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DiscoveryRelMapper.java
index 53a9c09e1..ec9db7249 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DiscoveryRelMapper.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DiscoveryRelMapper.java
@@ -18,6 +18,7 @@
 package org.apache.shenyu.admin.mapper;
 
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import org.apache.shenyu.admin.model.entity.DiscoveryRelDO;
 
 /**
@@ -44,6 +45,7 @@ public interface DiscoveryRelMapper {
 
     /**
      * insert discoveryRelDO.
+     *
      * @param discoveryRelDO discoveryRelDO.
      * @return rows
      */
@@ -75,8 +77,18 @@ public interface DiscoveryRelMapper {
 
     /**
      * delete discoveryRel by id.
+     *
      * @param id primary key.
      * @return rows.
      */
     int delete(String id);
+
+    /**
+     * selectByDiscoveryHandlerId.
+     *
+     * @param discoveryHandlerId discoveryHandlerId
+     * @return DiscoveryRelDO
+     */
+    DiscoveryRelDO selectByDiscoveryHandlerId(@Param("discoveryHandlerId") 
String discoveryHandlerId);
+
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DiscoveryUpstreamMapper.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DiscoveryUpstreamMapper.java
index 63d8976bd..eef7a708c 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DiscoveryUpstreamMapper.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/DiscoveryUpstreamMapper.java
@@ -113,8 +113,26 @@ public interface DiscoveryUpstreamMapper extends 
ExistProvider {
     /**
      * deleteByUrl.
      *
-     * @param url url
+     * @param discoveryHandlerId discoveryHandlerId
+     * @param url                url
      * @return rows int
      */
-    int deleteByUrl(@Param("url") String url);
+    int deleteByUrl(@Param("discoveryHandlerId") String discoveryHandlerId, 
@Param("url") String url);
+
+    /**
+     * selectByDiscoveryHandlerIdAndUrl.
+     *
+     * @param discoveryHandlerId discoveryHandlerId
+     * @param url                url
+     * @return DiscoveryUpstreamDO
+     */
+    DiscoveryUpstreamDO 
selectByDiscoveryHandlerIdAndUrl(@Param("discoveryHandlerId") String 
discoveryHandlerId, @Param("url") String url);
+
+    /**
+     * updateDiscoveryHandlerIdAndUrl.
+     *
+     * @param discoveryUpstreamDO discoveryUpstreamDO
+     * @return rows
+     */
+    int updateDiscoveryHandlerIdAndUrl(DiscoveryUpstreamDO 
discoveryUpstreamDO);
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/ProxySelectorMapper.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/ProxySelectorMapper.java
index 8a31985f1..71e30cae8 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/ProxySelectorMapper.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/ProxySelectorMapper.java
@@ -112,4 +112,11 @@ public interface ProxySelectorMapper extends ExistProvider 
{
      */
     List<ProxySelectorDO> selectByDiscoveryId(@Param("discoveryId") String 
discoveryId);
 
+    /**
+     * selectAll.
+     *
+     * @return ProxySelectorDOList
+     */
+    List<ProxySelectorDO> selectAll();
+
 }
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 8bd3c150d..55dbee553 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
@@ -35,7 +35,7 @@ public interface DiscoveryService {
      * get the discovery by plugin and name.
      *
      * @param pluginName plugin name
-     * @param level level
+     * @param level      level
      * @return the discovery
      */
     DiscoveryVO discovery(String pluginName, String level);
@@ -47,4 +47,9 @@ public interface DiscoveryService {
      * @return the string
      */
     DiscoveryVO createOrUpdate(DiscoveryDTO discoveryDTO);
+
+    /**
+     * syncData.
+     */
+    void syncData();
 }
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 5106f3763..6cadc4bcb 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
@@ -18,6 +18,7 @@
 package org.apache.shenyu.admin.service;
 
 import org.apache.shenyu.admin.model.dto.DiscoveryUpstreamDTO;
+import org.apache.shenyu.common.dto.DiscoverySyncData;
 
 import java.util.List;
 
@@ -38,4 +39,11 @@ public interface DiscoveryUpstreamService {
      * @return the string
      */
     String delete(List<String> ids);
+
+    /**
+     * listAll.
+     *
+     * @return DiscoverySyncDataList
+     */
+    List<DiscoverySyncData> listAll();
 }
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 6d256f975..735df7553 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
@@ -21,6 +21,7 @@ import org.apache.shenyu.admin.model.dto.ProxySelectorAddDTO;
 import org.apache.shenyu.admin.model.page.CommonPager;
 import org.apache.shenyu.admin.model.query.ProxySelectorQuery;
 import org.apache.shenyu.admin.model.vo.ProxySelectorVO;
+import org.apache.shenyu.common.dto.ProxySelectorData;
 
 import java.util.List;
 
@@ -57,4 +58,20 @@ public interface ProxySelectorService {
      * @return the result
      */
     String create(ProxySelectorAddDTO proxySelectorAddDTO);
+
+
+    /**
+     * fetchData.
+     *
+     * @param discoveryHandlerId discoveryHandlerId
+     */
+    void fetchData(String discoveryHandlerId);
+
+    /**
+     * listAll.
+     *
+     * @return ProxySelectorDTOList
+     */
+    List<ProxySelectorData> listAll();
+
 }
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 933672635..0d728b078 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
@@ -18,17 +18,25 @@
 package org.apache.shenyu.admin.service.impl;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.discovery.DiscoveryMode;
 import org.apache.shenyu.admin.discovery.DiscoveryProcessor;
 import org.apache.shenyu.admin.discovery.DiscoveryProcessorHolder;
+import org.apache.shenyu.admin.mapper.DiscoveryHandlerMapper;
 import org.apache.shenyu.admin.mapper.DiscoveryMapper;
+import org.apache.shenyu.admin.mapper.ProxySelectorMapper;
 import org.apache.shenyu.admin.model.dto.DiscoveryDTO;
 import org.apache.shenyu.admin.model.entity.DiscoveryDO;
+import org.apache.shenyu.admin.model.entity.DiscoveryHandlerDO;
 import org.apache.shenyu.admin.model.enums.DiscoveryTypeEnum;
 import org.apache.shenyu.admin.model.vo.DiscoveryVO;
 import org.apache.shenyu.admin.service.DiscoveryService;
+import org.apache.shenyu.admin.transfer.DiscoveryTransfer;
 import org.apache.shenyu.common.utils.UUIDUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.sql.Timestamp;
 import java.util.List;
@@ -36,13 +44,24 @@ import java.util.List;
 @Service
 public class DiscoveryServiceImpl implements DiscoveryService {
 
+    private static final Logger LOG = 
LoggerFactory.getLogger(DiscoveryServiceImpl.class);
+
     private final DiscoveryMapper discoveryMapper;
 
+    private final ProxySelectorMapper proxySelectorMapper;
+
+    private final DiscoveryHandlerMapper discoveryHandlerMapper;
+
     private final DiscoveryProcessorHolder discoveryProcessorHolder;
 
-    public DiscoveryServiceImpl(final DiscoveryMapper discoveryMapper, final 
DiscoveryProcessorHolder discoveryProcessorHolder) {
+    public DiscoveryServiceImpl(final DiscoveryMapper discoveryMapper,
+                                final ProxySelectorMapper proxySelectorMapper,
+                                final DiscoveryHandlerMapper 
discoveryHandlerMapper,
+                                final DiscoveryProcessorHolder 
discoveryProcessorHolder) {
         this.discoveryMapper = discoveryMapper;
         this.discoveryProcessorHolder = discoveryProcessorHolder;
+        this.proxySelectorMapper = proxySelectorMapper;
+        this.discoveryHandlerMapper = discoveryHandlerMapper;
     }
 
     @Override
@@ -51,11 +70,13 @@ public class DiscoveryServiceImpl implements 
DiscoveryService {
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public DiscoveryVO discovery(final String pluginName, final String level) {
         return 
discoveryVO(discoveryMapper.selectByPluginNameAndLevel(pluginName, level));
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public DiscoveryVO createOrUpdate(final DiscoveryDTO discoveryDTO) {
         return StringUtils.isBlank(discoveryDTO.getId()) ? 
this.create(discoveryDTO) : this.update(discoveryDTO);
     }
@@ -116,4 +137,19 @@ public class DiscoveryServiceImpl implements 
DiscoveryService {
         return discoveryVO;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void syncData() {
+        LOG.info("shenyu DiscoveryService sync db ");
+        List<DiscoveryDO> discoveryDOS = discoveryMapper.selectAll();
+        discoveryDOS.stream().filter(d -> 
!DiscoveryMode.LOCAL.name().equalsIgnoreCase(d.getType())).forEach(d -> {
+            DiscoveryProcessor discoveryProcessor = 
discoveryProcessorHolder.chooseProcessor(d.getType());
+            discoveryProcessor.createDiscovery(d);
+            
proxySelectorMapper.selectByDiscoveryId(d.getId()).stream().map(DiscoveryTransfer.INSTANCE::mapToDTO).forEach(ps
 -> {
+                DiscoveryHandlerDO discoveryHandlerDO = 
discoveryHandlerMapper.selectByProxySelectorId(ps.getId());
+                
discoveryProcessor.createProxySelector(DiscoveryTransfer.INSTANCE.mapToDTO(discoveryHandlerDO),
 ps);
+                discoveryProcessor.fetchAll(discoveryHandlerDO.getId());
+            });
+        });
+    }
 }
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 6e0078865..a9359274b 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
@@ -23,14 +23,20 @@ import 
org.apache.shenyu.admin.mapper.DiscoveryHandlerMapper;
 import org.apache.shenyu.admin.mapper.DiscoveryMapper;
 import org.apache.shenyu.admin.mapper.DiscoveryUpstreamMapper;
 import org.apache.shenyu.admin.mapper.ProxySelectorMapper;
+import org.apache.shenyu.admin.mapper.DiscoveryRelMapper;
+import org.apache.shenyu.admin.mapper.SelectorMapper;
 import org.apache.shenyu.admin.model.dto.DiscoveryUpstreamDTO;
 import org.apache.shenyu.admin.model.entity.DiscoveryDO;
 import org.apache.shenyu.admin.model.entity.DiscoveryHandlerDO;
 import org.apache.shenyu.admin.model.entity.DiscoveryUpstreamDO;
 import org.apache.shenyu.admin.model.entity.ProxySelectorDO;
+import org.apache.shenyu.admin.model.entity.DiscoveryRelDO;
+import org.apache.shenyu.admin.model.entity.SelectorDO;
 import org.apache.shenyu.admin.service.DiscoveryUpstreamService;
 import org.apache.shenyu.admin.transfer.DiscoveryTransfer;
 import org.apache.shenyu.admin.utils.ShenyuResultMessage;
+import org.apache.shenyu.common.dto.DiscoverySyncData;
+import org.apache.shenyu.common.dto.DiscoveryUpstreamData;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
@@ -44,21 +50,29 @@ public class DiscoveryUpstreamServiceImpl implements 
DiscoveryUpstreamService {
 
     private final DiscoveryHandlerMapper discoveryHandlerMapper;
 
+    private final DiscoveryRelMapper discoveryRelMapper;
+
     private final ProxySelectorMapper proxySelectorMapper;
 
     private final DiscoveryMapper discoveryMapper;
 
+    private final SelectorMapper selectorMapper;
+
     private final DiscoveryProcessorHolder discoveryProcessorHolder;
 
     public DiscoveryUpstreamServiceImpl(final DiscoveryUpstreamMapper 
discoveryUpstreamMapper,
                                         final DiscoveryHandlerMapper 
discoveryHandlerMapper,
                                         final ProxySelectorMapper 
proxySelectorMapper,
                                         final DiscoveryMapper discoveryMapper,
+                                        final DiscoveryRelMapper 
discoveryRelMapper,
+                                        final SelectorMapper selectorMapper,
                                         final DiscoveryProcessorHolder 
discoveryProcessorHolder) {
         this.discoveryUpstreamMapper = discoveryUpstreamMapper;
         this.discoveryProcessorHolder = discoveryProcessorHolder;
         this.discoveryHandlerMapper = discoveryHandlerMapper;
         this.discoveryMapper = discoveryMapper;
+        this.discoveryRelMapper = discoveryRelMapper;
+        this.selectorMapper = selectorMapper;
         this.proxySelectorMapper = proxySelectorMapper;
 
     }
@@ -89,6 +103,31 @@ public class DiscoveryUpstreamServiceImpl implements 
DiscoveryUpstreamService {
         return ShenyuResultMessage.DELETE_SUCCESS;
     }
 
+    @Override
+    public List<DiscoverySyncData> listAll() {
+        List<DiscoveryHandlerDO> discoveryHandlerDOS = 
discoveryHandlerMapper.selectAll();
+        return discoveryHandlerDOS.stream().map(d -> {
+            DiscoveryRelDO discoveryRelDO = 
discoveryRelMapper.selectByDiscoveryHandlerId(d.getId());
+            DiscoverySyncData discoverySyncData = new DiscoverySyncData();
+            discoverySyncData.setPluginName(discoveryRelDO.getPluginName());
+            if (StringUtils.hasLength(discoveryRelDO.getSelectorId())) {
+                String selectorId = discoveryRelDO.getSelectorId();
+                discoverySyncData.setSelectorId(selectorId);
+                SelectorDO selectorDO = selectorMapper.selectById(selectorId);
+                discoverySyncData.setSelectorName(selectorDO.getName());
+            } else {
+                String proxySelectorId = discoveryRelDO.getProxySelectorId();
+                discoverySyncData.setSelectorId(proxySelectorId);
+                ProxySelectorDO proxySelectorDO = 
proxySelectorMapper.selectById(proxySelectorId);
+                discoverySyncData.setSelectorName(proxySelectorDO.getName());
+            }
+            List<DiscoveryUpstreamData> discoveryUpstreamDataList = 
discoveryUpstreamMapper.selectByDiscoveryHandlerId(d.getId()).stream()
+                    
.map(DiscoveryTransfer.INSTANCE::mapToData).collect(Collectors.toList());
+            discoverySyncData.setUpstreamDataList(discoveryUpstreamDataList);
+            return discoverySyncData;
+        }).collect(Collectors.toList());
+    }
+
     /**
      * create.
      *
@@ -122,7 +161,7 @@ public class DiscoveryUpstreamServiceImpl implements 
DiscoveryUpstreamService {
         DiscoveryDO discoveryDO = 
discoveryMapper.selectById(discoveryHandlerDO.getDiscoveryId());
         List<DiscoveryUpstreamDTO> collect = 
discoveryUpstreamDOS.stream().map(DiscoveryTransfer.INSTANCE::mapToDTO).collect(Collectors.toList());
         DiscoveryProcessor discoveryProcessor = 
discoveryProcessorHolder.chooseProcessor(discoveryDO.getType());
-        
discoveryProcessor.changeUpstream(DiscoveryTransfer.INSTANCE.mapToDTO(discoveryHandlerDO),
 DiscoveryTransfer.INSTANCE.mapToDTO(proxySelectorDO), collect);
+        
discoveryProcessor.changeUpstream(DiscoveryTransfer.INSTANCE.mapToDTO(proxySelectorDO),
 collect);
     }
 
 }
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 1c6ad8d46..8727507fa 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
@@ -43,6 +43,7 @@ import org.apache.shenyu.admin.model.vo.ProxySelectorVO;
 import org.apache.shenyu.admin.service.ProxySelectorService;
 import org.apache.shenyu.admin.transfer.DiscoveryTransfer;
 import org.apache.shenyu.admin.utils.ShenyuResultMessage;
+import org.apache.shenyu.common.dto.ProxySelectorData;
 import org.apache.shenyu.common.utils.UUIDUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -158,8 +159,17 @@ public class ProxySelectorServiceImpl implements 
ProxySelectorService {
      * @return the string
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public String delete(final List<String> ids) {
-
+        for (String proxySelectorId : ids) {
+            DiscoveryHandlerDO discoveryHandlerDO = 
discoveryHandlerMapper.selectByProxySelectorId(proxySelectorId);
+            if (Objects.nonNull(discoveryHandlerDO)) {
+                ProxySelectorDO proxySelectorDO = 
proxySelectorMapper.selectById(proxySelectorId);
+                DiscoveryDO discoveryDO = 
discoveryMapper.selectById(discoveryHandlerDO.getDiscoveryId());
+                discoveryProcessorHolder.chooseProcessor(discoveryDO.getType())
+                        
.removeProxySelector(DiscoveryTransfer.INSTANCE.mapToDTO(discoveryHandlerDO), 
DiscoveryTransfer.INSTANCE.mapToDTO(proxySelectorDO));
+            }
+        }
         proxySelectorMapper.deleteByIds(ids);
         return ShenyuResultMessage.DELETE_SUCCESS;
     }
@@ -171,6 +181,7 @@ public class ProxySelectorServiceImpl implements 
ProxySelectorService {
      * @return insert data count
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public String create(final ProxySelectorAddDTO proxySelectorAddDTO) {
         Timestamp currentTime = new Timestamp(System.currentTimeMillis());
         ProxySelectorDO proxySelectorDO = 
ProxySelectorDO.buildProxySelectorDO(proxySelectorAddDTO);
@@ -245,7 +256,7 @@ public class ProxySelectorServiceImpl implements 
ProxySelectorService {
                     });
                     discoveryUpstreamMapper.saveBatch(upstreamDOList);
                     List<DiscoveryUpstreamDTO> collect = 
upstreamDOList.stream().map(DiscoveryTransfer.INSTANCE::mapToDTO).collect(Collectors.toList());
-                    discoveryProcessor.changeUpstream(discoveryHandlerDTO, 
proxySelectorDTO, collect);
+                    discoveryProcessor.changeUpstream(proxySelectorDTO, 
collect);
                 }
             }
         }
@@ -258,6 +269,7 @@ public class ProxySelectorServiceImpl implements 
ProxySelectorService {
      * @param proxySelectorAddDTO proxySelectorAddDTO
      * @return the string
      */
+    @Transactional(rollbackFor = Exception.class)
     public String update(final ProxySelectorAddDTO proxySelectorAddDTO) {
         // update proxy selector
         ProxySelectorDO proxySelectorDO = 
ProxySelectorDO.buildProxySelectorDO(proxySelectorAddDTO);
@@ -300,8 +312,21 @@ public class ProxySelectorServiceImpl implements 
ProxySelectorService {
         List<DiscoveryUpstreamDTO> fetchAll = 
discoveryUpstreamMapper.selectByDiscoveryHandlerId(discoveryHandlerDO.getId()).stream()
                 
.map(DiscoveryTransfer.INSTANCE::mapToDTO).collect(Collectors.toList());
         DiscoveryProcessor discoveryProcessor = 
discoveryProcessorHolder.chooseProcessor(discoveryDO.getType());
-        
discoveryProcessor.changeUpstream(DiscoveryTransfer.INSTANCE.mapToDTO(discoveryHandlerDO),
 DiscoveryTransfer.INSTANCE.mapToDTO(proxySelectorDO), fetchAll);
+        
discoveryProcessor.changeUpstream(DiscoveryTransfer.INSTANCE.mapToDTO(proxySelectorDO),
 fetchAll);
         LOG.info("insert discovery upstreams, count is: {}", 
proxySelectorAddDTO.getDiscoveryUpstreams().size());
         return ShenyuResultMessage.UPDATE_SUCCESS;
     }
+
+    @Override
+    public void fetchData(final String discoveryHandlerId) {
+        DiscoveryHandlerDO discoveryHandlerDO = 
discoveryHandlerMapper.selectById(discoveryHandlerId);
+        DiscoveryDO discoveryDO = 
discoveryMapper.selectById(discoveryHandlerDO.getDiscoveryId());
+        
discoveryProcessorHolder.chooseProcessor(discoveryDO.getType()).fetchAll(discoveryHandlerId);
+    }
+
+    @Override
+    public List<ProxySelectorData> listAll() {
+        return proxySelectorMapper.selectAll().stream()
+                
.map(DiscoveryTransfer.INSTANCE::mapToData).collect(Collectors.toList());
+    }
 }
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 bd2f9621c..30a485e50 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
@@ -21,6 +21,7 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.shenyu.admin.listener.DataChangedEvent;
 import org.apache.shenyu.admin.model.vo.PluginVO;
 import org.apache.shenyu.admin.service.AppAuthService;
+import org.apache.shenyu.admin.service.DiscoveryService;
 import org.apache.shenyu.admin.service.MetaDataService;
 import org.apache.shenyu.admin.service.PluginService;
 import org.apache.shenyu.admin.service.RuleService;
@@ -66,18 +67,22 @@ public class SyncDataServiceImpl implements SyncDataService 
{
 
     private final MetaDataService metaDataService;
 
+    private final DiscoveryService discoveryService;
+
     public SyncDataServiceImpl(final AppAuthService appAuthService,
                                final PluginService pluginService,
                                final SelectorService selectorService,
                                final RuleService ruleService,
                                final ApplicationEventPublisher eventPublisher,
-                               final MetaDataService metaDataService) {
+                               final MetaDataService metaDataService,
+                               final DiscoveryService discoveryService) {
         this.appAuthService = appAuthService;
         this.pluginService = pluginService;
         this.selectorService = selectorService;
         this.ruleService = ruleService;
         this.eventPublisher = eventPublisher;
         this.metaDataService = metaDataService;
+        this.discoveryService = discoveryService;
     }
 
     @Override
@@ -94,7 +99,7 @@ public class SyncDataServiceImpl implements SyncDataService {
         eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.RULE, 
type, ruleDataList));
 
         metaDataService.syncData();
-
+        discoveryService.syncData();
         return true;
     }
 
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/DiscoveryTransfer.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/DiscoveryTransfer.java
index 9fca9797f..1e66799fd 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/DiscoveryTransfer.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/DiscoveryTransfer.java
@@ -25,6 +25,7 @@ import 
org.apache.shenyu.admin.model.entity.DiscoveryUpstreamDO;
 import org.apache.shenyu.admin.model.entity.ProxySelectorDO;
 import org.apache.shenyu.common.dto.DiscoveryUpstreamData;
 import org.apache.shenyu.common.dto.ProxySelectorData;
+import org.apache.shenyu.common.utils.GsonUtils;
 
 import java.util.Properties;
 
@@ -76,7 +77,6 @@ public enum DiscoveryTransfer {
         return discoveryUpstreamData;
     }
 
-
     /**
      * mapToData.
      *
@@ -95,19 +95,53 @@ public enum DiscoveryTransfer {
         return discoveryUpstreamData;
     }
 
-
-    public ProxySelectorData mapToData(ProxySelectorDTO proxySelectorDTO){
+    /**
+     * mapToData.
+     *
+     * @param proxySelectorDTO proxySelectorDTO
+     * @return ProxySelectorData
+     */
+    public ProxySelectorData mapToData(ProxySelectorDTO proxySelectorDTO) {
         ProxySelectorData proxySelectorData = new ProxySelectorData();
         proxySelectorData.setId(proxySelectorDTO.getId());
         proxySelectorData.setName(proxySelectorDTO.getName());
         proxySelectorData.setPluginName(proxySelectorDTO.getPluginName());
         proxySelectorData.setType(proxySelectorDTO.getType());
         proxySelectorData.setForwardPort(proxySelectorDTO.getForwardPort());
+        String props = proxySelectorDTO.getProps();
+        Properties properties = GsonUtils.getInstance().fromJson(props, 
Properties.class);
+        proxySelectorData.setProps(properties);
         return proxySelectorData;
     }
 
+    /**
+     * mapToData.
+     *
+     * @param proxySelectorDO proxySelectorDO
+     * @return ProxySelectorData
+     */
+    public ProxySelectorData mapToData(ProxySelectorDO proxySelectorDO) {
+        ProxySelectorData proxySelectorData = new ProxySelectorData();
+        proxySelectorData.setId(proxySelectorDO.getId());
+        proxySelectorData.setName(proxySelectorDO.getName());
+        proxySelectorData.setPluginName(proxySelectorDO.getPluginName());
+        proxySelectorData.setType(proxySelectorDO.getType());
+        proxySelectorData.setForwardPort(proxySelectorDO.getForwardPort());
+        String props = proxySelectorDO.getProps();
+        Properties properties = GsonUtils.getInstance().fromJson(props, 
Properties.class);
+        proxySelectorData.setProps(properties);
+        return proxySelectorData;
+    }
+
+    /**
+     * mapToDTO.
+     *
+     * @param proxySelectorDO proxySelectorDO
+     * @return ProxySelectorDTO
+     */
     public ProxySelectorDTO mapToDTO(ProxySelectorDO proxySelectorDO) {
         ProxySelectorDTO proxySelectorDTO = new ProxySelectorDTO();
+        proxySelectorDTO.setId(proxySelectorDO.getId());
         proxySelectorDTO.setName(proxySelectorDO.getName());
         proxySelectorDTO.setType(proxySelectorDO.getType());
         proxySelectorDTO.setProps(proxySelectorDO.getProps());
@@ -116,6 +150,12 @@ public enum DiscoveryTransfer {
         return proxySelectorDTO;
     }
 
+    /**
+     * mapToDTO.
+     *
+     * @param discoveryHandlerDO discoveryHandlerDO
+     * @return DiscoveryHandlerDTO
+     */
     public DiscoveryHandlerDTO mapToDTO(DiscoveryHandlerDO discoveryHandlerDO) 
{
         DiscoveryHandlerDTO discoveryHandlerDTO = new DiscoveryHandlerDTO();
         
discoveryHandlerDTO.setDiscoveryId(discoveryHandlerDO.getDiscoveryId());
@@ -126,6 +166,12 @@ public enum DiscoveryTransfer {
         return discoveryHandlerDTO;
     }
 
+    /**
+     * mapToDTO.
+     *
+     * @param discoveryUpstreamDO discoveryUpstreamDO
+     * @return DiscoveryUpstreamDTO
+     */
     public DiscoveryUpstreamDTO mapToDTO(DiscoveryUpstreamDO 
discoveryUpstreamDO) {
         DiscoveryUpstreamDTO discoveryUpstreamDTO = new DiscoveryUpstreamDTO();
         discoveryUpstreamDTO.setProps(discoveryUpstreamDO.getProps());
@@ -137,4 +183,5 @@ public enum DiscoveryTransfer {
         discoveryUpstreamDTO.setWeight(discoveryUpstreamDO.getWeight());
         return discoveryUpstreamDTO;
     }
+
 }
diff --git 
a/shenyu-admin/src/main/resources/mappers/discovery-handler-sqlmap.xml 
b/shenyu-admin/src/main/resources/mappers/discovery-handler-sqlmap.xml
index 2597c0249..0769b7bb6 100644
--- a/shenyu-admin/src/main/resources/mappers/discovery-handler-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/discovery-handler-sqlmap.xml
@@ -51,11 +51,22 @@
         WHERE id = #{id, jdbcType=VARCHAR}
     </select>
 
-    <select id="selectByDiscoveryId" 
resultType="org.apache.shenyu.admin.model.entity.DiscoveryHandlerDO">
+    <select id="selectByProxySelectorId" 
resultType="org.apache.shenyu.admin.model.entity.DiscoveryHandlerDO">
+        SELECT
+        dh.id,
+        dh.date_created,
+        dh.date_updated,
+        dh.discovery_id,
+        dh.handler,
+        dh.listener_node
+        FROM discovery_handler dh inner join discovery_rel dr on dh.id = 
dr.discovery_handler_id
+        WHERE dr.proxy_selector_id = #{proxySelectorId, jdbcType=VARCHAR}
+    </select>
+
+    <select id="selectAll" 
resultType="org.apache.shenyu.admin.model.entity.DiscoveryHandlerDO">
         SELECT
         <include refid="Base_Column_List"/>
-        FROM discovery_handler
-        WHERE discovery_id = #{discovery_id, jdbcType=VARCHAR}
+        from discovery_handler
     </select>
 
     <insert id="insert" keyColumn="id" keyProperty="id" useGeneratedKeys="true"
diff --git a/shenyu-admin/src/main/resources/mappers/discovery-rel-sqlmap.xml 
b/shenyu-admin/src/main/resources/mappers/discovery-rel-sqlmap.xml
index 55125babf..6eb7c6870 100644
--- a/shenyu-admin/src/main/resources/mappers/discovery-rel-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/discovery-rel-sqlmap.xml
@@ -27,7 +27,7 @@
         <result column="selector_id" jdbcType="VARCHAR" property="selectorId"/>
         <result column="proxy_selector_id" jdbcType="VARCHAR" 
property="proxySelectorId"/>
     </resultMap>
-    
+
     <sql id="Base_Column_List">
         id,
         date_created,
@@ -37,7 +37,7 @@
         selector_id,
         proxy_selector_id
     </sql>
-    
+
     <select id="selectById" parameterType="java.lang.String" 
resultMap="BaseResultMap">
         SELECT
         <include refid="Base_Column_List"/>
@@ -51,7 +51,13 @@
         FROM discovery_rel
         WHERE proxy_selector_id = #{proxySelectorId, jdbcType=VARCHAR}
     </select>
-    
+
+    <select id="selectByDiscoveryHandlerId" 
resultType="org.apache.shenyu.admin.model.entity.DiscoveryRelDO">
+        select
+        <include refid="Base_Column_List"/>
+        from discovery_rel where discovery_handler_id = #{discoveryHandlerId}
+    </select>
+
     <insert id="insert" 
parameterType="org.apache.shenyu.admin.model.entity.DiscoveryRelDO">
         INSERT INTO discovery_rel
         (id,
@@ -70,7 +76,7 @@
         #{selectorId, jdbcType=VARCHAR}),
         #{proxySelectorId, jdbcType=VARCHAR})
     </insert>
-    
+
     <insert id="insertSelective" 
parameterType="org.apache.shenyu.admin.model.entity.DiscoveryRelDO">
         INSERT INTO discovery_rel
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -116,7 +122,7 @@
             </if>
         </trim>
     </insert>
-    
+
     <update id="update" 
parameterType="org.apache.shenyu.admin.model.entity.DiscoveryRelDO">
         UPDATE discovery_rel
         SET date_created = #{dateCreated, jdbcType=TIMESTAMP},
@@ -127,7 +133,7 @@
         proxy_selector_id = #{proxySelectorId, jdbcType=VARCHAR}
         WHERE id = #{id, jdbcType=VARCHAR}
     </update>
-    
+
     <update id="updateSelective" 
parameterType="org.apache.shenyu.admin.model.entity.DiscoveryRelDO">
         UPDATE discovery_rel
         <set>
@@ -152,7 +158,7 @@
         </set>
         WHERE id = #{id, jdbcType=VARCHAR}
     </update>
-    
+
     <delete id="delete" parameterType="java.lang.String">
         DELETE
         FROM discovery_rel
diff --git 
a/shenyu-admin/src/main/resources/mappers/discovery-upstream-sqlmap.xml 
b/shenyu-admin/src/main/resources/mappers/discovery-upstream-sqlmap.xml
index d89699b6b..933b5262a 100644
--- a/shenyu-admin/src/main/resources/mappers/discovery-upstream-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/discovery-upstream-sqlmap.xml
@@ -111,6 +111,17 @@
         WHERE id=#{id, jdbcType=VARCHAR}
     </update>
 
+    <update id="updateDiscoveryHandlerIdAndUrl">
+        UPDATE discovery_upstream
+        SET
+        protocol=#{protocol,jdbcType=VARCHAR},
+        status=#{status,jdbcType=INTEGER},
+        weight=#{weight,jdbcType=INTEGER},
+        props=#{props,jdbcType=VARCHAR},
+        date_updated=#{dateUpdated, jdbcType=TIMESTAMP}
+        WHERE discovery_handler_id=#{id, jdbcType=VARCHAR} and url =#{url}
+    </update>
+
     <select id="selectByIds" parameterType="java.util.List" 
resultMap="BaseResultMap">
         SELECT
         <include refid="Base_Column_List"/>
@@ -130,15 +141,15 @@
 
     <select id="selectByProxySelectorId" resultMap="BaseResultMap">
         SELECT
-            du.id,
-            du.date_created,
-            du.date_updated,
-            du.discovery_handler_id,
-            du.protocol,
-            du.url,
-            du.status,
-            du.weight,
-            du.props
+        du.id,
+        du.date_created,
+        du.date_updated,
+        du.discovery_handler_id,
+        du.protocol,
+        du.url,
+        du.status,
+        du.weight,
+        du.props
         FROM discovery_upstream du
         INNER JOIN discovery_rel dr ON du.discovery_handler_id = 
dr.discovery_handler_id
         <where>
@@ -146,6 +157,12 @@
         </where>
     </select>
 
+    <select id="selectByDiscoveryHandlerIdAndUrl"
+            
resultType="org.apache.shenyu.admin.model.entity.DiscoveryUpstreamDO">
+        SELECT <include refid="Base_Column_List"/> from discovery_upstream 
where discovery_handler_id = #{discoveryHandlerId} and url = #{url}
+
+    </select>
+
     <delete id="deleteByIds" parameterType="java.util.List">
         DELETE FROM discovery_upstream WHERE id IN
         <foreach item="id" collection="ids" open="(" separator="," close=")">
@@ -184,6 +201,6 @@
     </delete>
 
     <delete id="deleteByUrl">
-        DELETE FROM discovery_upstream WHERE url = #{url}
+        DELETE FROM discovery_upstream WHERE discovery_handler_id = 
#{discoveryHandlerId} and url = #{url}
     </delete>
 </mapper>
diff --git a/shenyu-admin/src/main/resources/mappers/proxy-selector-sqlmap.xml 
b/shenyu-admin/src/main/resources/mappers/proxy-selector-sqlmap.xml
index e7f25b157..d27f1b700 100644
--- a/shenyu-admin/src/main/resources/mappers/proxy-selector-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/proxy-selector-sqlmap.xml
@@ -123,10 +123,21 @@
     </select>
 
     <select id="selectByDiscoveryId" 
resultType="org.apache.shenyu.admin.model.entity.ProxySelectorDO">
-        SELECT ps.id , ps.name, ps.plugin_name , ps.type, ps.forward_port , 
ps.props
-        FROM proxy_selector ps inner join discovery_rel dr on ps.id = 
dr.proxy_selector_id
+        SELECT
+        ps.id ,
+        ps.name,
+        ps.plugin_name ,
+        ps.type,
+        ps.forward_port ,
+        ps.props
+        FROM proxy_selector ps
+        inner join discovery_rel dr on ps.id = dr.proxy_selector_id
         inner join discovery_handler dh on dh.id = dr.discovery_handler_id
-        where dh.discovery__id = #{discoveryId}
+        where dh.discovery_id = #{discoveryId, jdbcType=VARCHAR}
+    </select>
+
+    <select id="selectAll" resultMap="BaseResultMap">
+        SELECT <include refid="Base_Column_List"/> FROM proxy_selector
     </select>
 
     <delete id="deleteByIds" parameterType="java.util.List">
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/config/DataSyncConfigurationTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/config/DataSyncConfigurationTest.java
index cca2b122b..35692e0e1 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/config/DataSyncConfigurationTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/config/DataSyncConfigurationTest.java
@@ -28,6 +28,7 @@ import 
org.apache.shenyu.admin.config.properties.HttpSyncProperties;
 import org.apache.shenyu.admin.config.properties.NacosProperties;
 import org.apache.shenyu.admin.config.properties.ZookeeperProperties;
 import org.apache.shenyu.admin.listener.etcd.EtcdClient;
+import org.apache.shenyu.admin.service.DiscoveryService;
 import org.apache.shenyu.admin.service.MetaDataService;
 import org.apache.shenyu.admin.service.PluginService;
 import org.apache.shenyu.admin.service.RuleService;
@@ -89,6 +90,9 @@ public final class DataSyncConfigurationTest extends 
AbstractConfigurationTest {
     @Mock
     private MetaDataService metaDataService;
 
+    @Mock
+    private DiscoveryService discoveryService;
+
     @BeforeAll
     public static void setUpBeforeClass() throws Exception {
         zkServer = new TestingServer();
@@ -130,7 +134,7 @@ public final class DataSyncConfigurationTest extends 
AbstractConfigurationTest {
     @Test
     public void testZookeeperDataInit() {
         final SyncDataService syncDataService = new 
SyncDataServiceImpl(appAuthService, pluginService, selectorService,
-                ruleService, eventPublisher, metaDataService);
+                ruleService, eventPublisher, metaDataService, 
discoveryService);
         DataSyncConfiguration.ZookeeperListener zookeeperListener = new 
DataSyncConfiguration.ZookeeperListener();
         assertNotNull(zookeeperListener.zookeeperDataChangedInit(zkClient));
     }
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/listener/AbstractDataChangedListenerTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/listener/AbstractDataChangedListenerTest.java
index be94859f8..36fed9d25 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/listener/AbstractDataChangedListenerTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/listener/AbstractDataChangedListenerTest.java
@@ -22,12 +22,16 @@ import org.apache.shenyu.admin.service.MetaDataService;
 import org.apache.shenyu.admin.service.PluginService;
 import org.apache.shenyu.admin.service.RuleService;
 import org.apache.shenyu.admin.service.SelectorService;
+import org.apache.shenyu.admin.service.ProxySelectorService;
+import org.apache.shenyu.admin.service.DiscoveryUpstreamService;
 import org.apache.shenyu.common.dto.AppAuthData;
 import org.apache.shenyu.common.dto.ConfigData;
 import org.apache.shenyu.common.dto.MetaData;
 import org.apache.shenyu.common.dto.PluginData;
 import org.apache.shenyu.common.dto.RuleData;
 import org.apache.shenyu.common.dto.SelectorData;
+import org.apache.shenyu.common.dto.ProxySelectorData;
+import org.apache.shenyu.common.dto.DiscoverySyncData;
 import org.apache.shenyu.common.enums.ConfigGroupEnum;
 import org.apache.shenyu.common.enums.DataEventTypeEnum;
 import org.assertj.core.util.Lists;
@@ -62,6 +66,10 @@ public final class AbstractDataChangedListenerTest {
 
     private MetaDataService metaDataService;
 
+    private ProxySelectorService proxySelectorService;
+
+    private DiscoveryUpstreamService discoveryUpstreamService;
+
     @BeforeEach
     public void setUp() throws Exception {
         listener = new MockAbstractDataChangedListener();
@@ -70,6 +78,8 @@ public final class AbstractDataChangedListenerTest {
         ruleService = mock(RuleService.class);
         selectorService = mock(SelectorService.class);
         metaDataService = mock(MetaDataService.class);
+        proxySelectorService = mock(ProxySelectorService.class);
+        discoveryUpstreamService = mock(DiscoveryUpstreamService.class);
 
         Class clazz = MockAbstractDataChangedListener.class.getSuperclass();
         Field appAuthServiceField = clazz.getDeclaredField("appAuthService");
@@ -87,6 +97,12 @@ public final class AbstractDataChangedListenerTest {
         Field metaDataServiceField = clazz.getDeclaredField("metaDataService");
         metaDataServiceField.setAccessible(true);
         metaDataServiceField.set(listener, metaDataService);
+        Field proxySelectorServiceField = 
clazz.getDeclaredField("proxySelectorService");
+        proxySelectorServiceField.setAccessible(true);
+        proxySelectorServiceField.set(listener, proxySelectorService);
+        Field discoveryUpstreamServiceField = 
clazz.getDeclaredField("discoveryUpstreamService");
+        discoveryUpstreamServiceField.setAccessible(true);
+        discoveryUpstreamServiceField.set(listener, discoveryUpstreamService);
 
         List<AppAuthData> appAuthDatas = 
Lists.newArrayList(mock(AppAuthData.class));
         when(appAuthService.listAll()).thenReturn(appAuthDatas);
@@ -98,6 +114,10 @@ public final class AbstractDataChangedListenerTest {
         when(selectorService.listAll()).thenReturn(selectorDatas);
         List<MetaData> metaDatas = Lists.newArrayList(mock(MetaData.class));
         when(metaDataService.listAll()).thenReturn(metaDatas);
+        List<ProxySelectorData> proxySelectorDatas = 
Lists.newArrayList(mock(ProxySelectorData.class));
+        when(proxySelectorService.listAll()).thenReturn(proxySelectorDatas);
+        List<DiscoverySyncData> discoverySyncDatas = 
Lists.newArrayList(mock(DiscoverySyncData.class));
+        
when(discoveryUpstreamService.listAll()).thenReturn(discoverySyncDatas);
     }
 
     @AfterEach
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DiscoveryUpstreamServiceTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DiscoveryUpstreamServiceTest.java
index f0b9acb4a..c20589401 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DiscoveryUpstreamServiceTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DiscoveryUpstreamServiceTest.java
@@ -23,6 +23,8 @@ import org.apache.shenyu.admin.mapper.DiscoveryHandlerMapper;
 import org.apache.shenyu.admin.mapper.DiscoveryMapper;
 import org.apache.shenyu.admin.mapper.DiscoveryUpstreamMapper;
 import org.apache.shenyu.admin.mapper.ProxySelectorMapper;
+import org.apache.shenyu.admin.mapper.DiscoveryRelMapper;
+import org.apache.shenyu.admin.mapper.SelectorMapper;
 import org.apache.shenyu.admin.model.dto.DiscoveryUpstreamDTO;
 import org.apache.shenyu.admin.model.entity.DiscoveryDO;
 import org.apache.shenyu.admin.model.entity.DiscoveryHandlerDO;
@@ -71,6 +73,12 @@ class DiscoveryUpstreamServiceTest {
     @Mock
     private DiscoveryProcessor discoveryProcessor;
 
+    @Mock
+    private DiscoveryRelMapper discoveryRelMapper;
+
+    @Mock
+    private SelectorMapper selectorMapper;
+
     @BeforeEach
     void setUp() {
         DiscoveryHandlerDO discoveryHandlerDO = new DiscoveryHandlerDO();
@@ -81,7 +89,8 @@ class DiscoveryUpstreamServiceTest {
         when(discoveryMapper.selectById(anyString())).thenReturn(discoveryDO);
         
when(discoveryProcessorHolder.chooseProcessor(anyString())).thenReturn(discoveryProcessor);
         
when(proxySelectorMapper.selectByHandlerId(anyString())).thenReturn(new 
ProxySelectorDO());
-        discoveryUpstreamService = new 
DiscoveryUpstreamServiceImpl(discoveryUpstreamMapper, discoveryHandlerMapper, 
proxySelectorMapper, discoveryMapper, discoveryProcessorHolder);
+        discoveryUpstreamService = new 
DiscoveryUpstreamServiceImpl(discoveryUpstreamMapper, discoveryHandlerMapper, 
proxySelectorMapper, discoveryMapper,
+                discoveryRelMapper, selectorMapper, discoveryProcessorHolder);
     }
 
     @Test
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 4fecf8318..039f2a0e5 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
@@ -80,6 +80,15 @@ public final class SyncDataServiceTest {
     @Mock
     private MetaDataService metaDataService;
 
+    @Mock
+    private ProxySelectorService proxySelectorService;
+
+    @Mock
+    private DiscoveryService discoveryService;
+
+    @Mock
+    private DiscoveryUpstreamService discoveryUpstreamService;
+
     @Test
     public void syncAllTest() {
         PluginData pluginData = buildPluginData();
diff --git 
a/shenyu-discovery/shenyu-discovery-api/src/main/java/org/apache/shenyu/discovery/api/ShenyuDiscoveryService.java
 
b/shenyu-discovery/shenyu-discovery-api/src/main/java/org/apache/shenyu/discovery/api/ShenyuDiscoveryService.java
index dece0d7d2..f60f054ab 100644
--- 
a/shenyu-discovery/shenyu-discovery-api/src/main/java/org/apache/shenyu/discovery/api/ShenyuDiscoveryService.java
+++ 
b/shenyu-discovery/shenyu-discovery-api/src/main/java/org/apache/shenyu/discovery/api/ShenyuDiscoveryService.java
@@ -21,6 +21,8 @@ import org.apache.shenyu.discovery.api.config.DiscoveryConfig;
 import org.apache.shenyu.discovery.api.listener.DataChangedEventListener;
 import org.apache.shenyu.spi.SPI;
 
+import java.util.List;
+
 /**
  * The interface for shenyu discovery service.
  */
@@ -63,7 +65,15 @@ public interface ShenyuDiscoveryService {
      * @param key key
      * @return value
      */
-    String getData(String key);
+    List<String> getRegisterData(String key);
+
+    /**
+     * exits.
+     *
+     * @param key key
+     * @return Boolean
+     */
+    Boolean exits(String key);
 
     /**
      * shutdown.
diff --git 
a/shenyu-discovery/shenyu-discovery-zookeeper/src/main/java/org/apache/shenyu/discovery/zookeeper/ZookeeperDiscoveryService.java
 
b/shenyu-discovery/shenyu-discovery-zookeeper/src/main/java/org/apache/shenyu/discovery/zookeeper/ZookeeperDiscoveryService.java
index 51eb09785..f826a1961 100644
--- 
a/shenyu-discovery/shenyu-discovery-zookeeper/src/main/java/org/apache/shenyu/discovery/zookeeper/ZookeeperDiscoveryService.java
+++ 
b/shenyu-discovery/shenyu-discovery-zookeeper/src/main/java/org/apache/shenyu/discovery/zookeeper/ZookeeperDiscoveryService.java
@@ -40,6 +40,9 @@ import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.concurrent.TimeUnit;
 
 /**
  * The type Zookeeper for shenyu discovery service.
@@ -90,7 +93,9 @@ public class ZookeeperDiscoveryService implements 
ShenyuDiscoveryService {
         });
         this.client.start();
         try {
-            this.client.blockUntilConnected();
+            if (!this.client.blockUntilConnected(30, TimeUnit.SECONDS)) {
+                throw new ShenyuException("shenyu start 
ZookeeperDiscoveryService failure 30 seconds timeout");
+            }
         } catch (InterruptedException e) {
             throw new ShenyuException(e);
         }
@@ -122,11 +127,8 @@ public class ZookeeperDiscoveryService implements 
ShenyuDiscoveryService {
                 DiscoveryDataChangedEvent dataChangedEvent;
                 if (Objects.nonNull(data) && Objects.nonNull(data.getData())) {
                     String currentPath = data.getPath();
-                    String parentPath = currentPath.substring(0, 
currentPath.lastIndexOf("/"));
-                    String parentData = this.getData(parentPath);
                     String currentData = new String(data.getData(), 
StandardCharsets.UTF_8);
-                    String resultData = parentData + "|" + currentData;
-                    LOGGER.info("shenyu find resultData ={}", resultData);
+                    LOGGER.info("shenyu find resultData ={}", currentData);
                     Stat stat = data.getStat();
                     boolean isEphemeral = Objects.nonNull(stat) && 
stat.getEphemeralOwner() > 0;
                     if (!isEphemeral) {
@@ -135,16 +137,16 @@ public class ZookeeperDiscoveryService implements 
ShenyuDiscoveryService {
                     }
                     switch (event.getType()) {
                         case NODE_ADDED:
-                            dataChangedEvent = new 
DiscoveryDataChangedEvent(currentPath, resultData, 
DiscoveryDataChangedEvent.Event.ADDED);
+                            dataChangedEvent = new 
DiscoveryDataChangedEvent(currentPath, currentData, 
DiscoveryDataChangedEvent.Event.ADDED);
                             break;
                         case NODE_UPDATED:
-                            dataChangedEvent = new 
DiscoveryDataChangedEvent(currentPath, resultData, 
DiscoveryDataChangedEvent.Event.UPDATED);
+                            dataChangedEvent = new 
DiscoveryDataChangedEvent(currentPath, currentData, 
DiscoveryDataChangedEvent.Event.UPDATED);
                             break;
                         case NODE_REMOVED:
-                            dataChangedEvent = new 
DiscoveryDataChangedEvent(currentPath, resultData, 
DiscoveryDataChangedEvent.Event.DELETED);
+                            dataChangedEvent = new 
DiscoveryDataChangedEvent(currentPath, currentData, 
DiscoveryDataChangedEvent.Event.DELETED);
                             break;
                         default:
-                            dataChangedEvent = new 
DiscoveryDataChangedEvent(currentPath, resultData, 
DiscoveryDataChangedEvent.Event.IGNORED);
+                            dataChangedEvent = new 
DiscoveryDataChangedEvent(currentPath, currentData, 
DiscoveryDataChangedEvent.Event.IGNORED);
                             break;
                     }
                     listener.onChange(dataChangedEvent);
@@ -171,15 +173,26 @@ public class ZookeeperDiscoveryService implements 
ShenyuDiscoveryService {
     }
 
     @Override
-    public String getData(final String key) {
+    public List<String> getRegisterData(final String key) {
         try {
-            TreeCache treeCache = cacheMap.get(key);
-            if (Objects.isNull(treeCache)) {
-                return null;
+            List<String> children = client.getChildren().forPath(key);
+            List<String> datas = new ArrayList<>();
+            for (String child : children) {
+                String nodePath = key + "/" + child;
+                byte[] data = client.getData().forPath(nodePath);
+                datas.add(new String(data, StandardCharsets.UTF_8));
             }
-            ChildData currentData = treeCache.getCurrentData(key);
-            byte[] ret = currentData.getData();
-            return Objects.isNull(ret) ? null : new String(ret, 
StandardCharsets.UTF_8);
+            return datas;
+        } catch (Exception e) {
+            throw new ShenyuException(e);
+        }
+    }
+
+    @Override
+    public Boolean exits(final String key) {
+        try {
+            Stat stat = this.client.checkExists().forPath(key);
+            return stat != null;
         } catch (Exception e) {
             throw new ShenyuException(e);
         }

Reply via email to