You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shenyu.apache.org by xi...@apache.org on 2023/06/14 03:58:15 UTC

[shenyu] branch master updated: [type:refactor] refactor shenyu-register-instance-api. (#4715)

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 7e61c451a [type:refactor] refactor shenyu-register-instance-api. (#4715)
7e61c451a is described below

commit 7e61c451ac6780a73410399b378d187c7026ff36
Author: yunlongn <yu...@outlook.com>
AuthorDate: Wed Jun 14 11:58:04 2023 +0800

    [type:refactor] refactor shenyu-register-instance-api. (#4715)
    
    * [type:refactor] refactor shenyu-register-instance-api.
    
    * [type:refactor] refactor shenyu-register-instance-api.
    
    * [type:refactor] refactor shenyu-register-instance-api.
    
    ---------
    
    Co-authored-by: xiaoyu <xi...@apache.org>
    Co-authored-by: dragon-zhang <zh...@apache.org>
---
 .../api/ShenyuInstanceRegisterRepository.java      |  6 ++--
 .../instance/api/watcher/WatcherListener.java      | 36 -------------------
 .../apollo/ApolloInstanceRegisterRepository.java   | 20 +++++++----
 .../consul/ConsulInstanceRegisterRepository.java   | 42 ++++++++++------------
 .../ConsulInstanceRegisterRepositoryTest.java      |  3 +-
 .../etcd/EtcdInstanceRegisterRepository.java       | 15 +++++---
 .../etcd/EtcdInstanceRegisterRepositoryTest.java   |  3 +-
 .../eureka/EurekaInstanceRegisterRepository.java   | 14 +-------
 .../EurekaInstanceRegisterRepositoryTest.java      |  5 +--
 .../nacos/NacosInstanceRegisterRepository.java     | 13 ++-----
 .../nacos/NacosInstanceRegisterRepositoryTest.java |  4 +--
 .../ZookeeperInstanceRegisterRepository.java       | 23 ++++++++----
 .../ZookeeperInstanceRegisterRepositoryTest.java   |  3 +-
 .../sdk/core/client/AbstractShenyuSdkClient.java   | 14 ++------
 .../spring/proxy/ShenyuClientMethodHandler.java    |  5 +++
 .../websocket/client/ShenyuWebsocketClient.java    |  7 +++-
 16 files changed, 86 insertions(+), 127 deletions(-)

diff --git a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-api/src/main/java/org/apache/shenyu/register/instance/api/ShenyuInstanceRegisterRepository.java b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-api/src/main/java/org/apache/shenyu/register/instance/api/ShenyuInstanceRegisterRepository.java
index f1dd39dfb..7d951f60b 100644
--- a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-api/src/main/java/org/apache/shenyu/register/instance/api/ShenyuInstanceRegisterRepository.java
+++ b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-api/src/main/java/org/apache/shenyu/register/instance/api/ShenyuInstanceRegisterRepository.java
@@ -19,7 +19,6 @@ package org.apache.shenyu.register.instance.api;
 
 import org.apache.shenyu.register.instance.api.config.RegisterConfig;
 import org.apache.shenyu.register.instance.api.entity.InstanceEntity;
-import org.apache.shenyu.register.instance.api.watcher.WatcherListener;
 import org.apache.shenyu.spi.SPI;
 
 import java.util.Collections;
@@ -47,13 +46,12 @@ public interface ShenyuInstanceRegisterRepository {
     void persistInstance(InstanceEntity instance);
 
     /**
-     * selectInstancesAndWatcher.
+     * selectInstances.
      *
      * @param selectKey selectKey
-     * @param watcherListener watcherListener
      * @return {@link List}
      */
-    default List<InstanceEntity> selectInstancesAndWatcher(final String selectKey, final WatcherListener watcherListener) {
+    default List<InstanceEntity> selectInstances(final String selectKey) {
         return Collections.emptyList();
     }
 
diff --git a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-api/src/main/java/org/apache/shenyu/register/instance/api/watcher/WatcherListener.java b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-api/src/main/java/org/apache/shenyu/register/instance/api/watcher/WatcherListener.java
deleted file mode 100644
index 6c1460752..000000000
--- a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-api/src/main/java/org/apache/shenyu/register/instance/api/watcher/WatcherListener.java
+++ /dev/null
@@ -1,36 +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.register.instance.api.watcher;
-
-import org.apache.shenyu.register.instance.api.entity.InstanceEntity;
-
-import java.util.List;
-
-/**
- * WatcherListener InstanceEntity.
- */
-@FunctionalInterface
-public interface WatcherListener {
-
-    /**
-     * listener InstanceEntity.
-     *
-     * @param instanceRegisterDTOs instanceRegisterDTOs
-     */
-    void listener(List<InstanceEntity> instanceRegisterDTOs);
-}
diff --git a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-apollo/src/main/java/org/apache/shenyu/register/instance/apollo/ApolloInstanceRegisterRepository.java b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-apollo/src/main/java/org/apache/shenyu/register/instance/apollo/ApolloInstanceRegisterRepository.java
index 1a25e9cd1..9c3dcecfb 100644
--- a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-apollo/src/main/java/org/apache/shenyu/register/instance/apollo/ApolloInstanceRegisterRepository.java
+++ b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-apollo/src/main/java/org/apache/shenyu/register/instance/apollo/ApolloInstanceRegisterRepository.java
@@ -28,17 +28,16 @@ import org.apache.shenyu.register.instance.api.ShenyuInstanceRegisterRepository;
 import org.apache.shenyu.register.instance.api.config.RegisterConfig;
 import org.apache.shenyu.register.instance.api.entity.InstanceEntity;
 import org.apache.shenyu.register.instance.api.path.InstancePathConstants;
-import org.apache.shenyu.register.instance.api.watcher.WatcherListener;
 import org.apache.shenyu.spi.Join;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.Set;
-import java.util.Optional;
-import java.util.HashMap;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -62,6 +61,8 @@ public class ApolloInstanceRegisterRepository implements ShenyuInstanceRegisterR
 
     private final Map<String, ConfigChangeListener> configChangeListenerMap = Maps.newConcurrentMap();
 
+    private final Map<String, List<InstanceEntity>> watcherInstanceRegisterMap = new HashMap<>();
+
     private String namespace;
 
     private Config configService;
@@ -114,12 +115,17 @@ public class ApolloInstanceRegisterRepository implements ShenyuInstanceRegisterR
     }
 
     @Override
-    public List<InstanceEntity> selectInstancesAndWatcher(final String selectKey, final WatcherListener watcherListener) {
+    public List<InstanceEntity> selectInstances(final String selectKey) {
         final String watchKey = InstancePathConstants.buildInstanceParentPath(selectKey);
 
         final Function<Map<String, String>, List<InstanceEntity>> getInstanceRegisterFun = childrenList ->
                 childrenList.values().stream().map(x -> GsonUtils.getInstance().fromJson(x, InstanceEntity.class)).collect(Collectors.toList());
         Map<String, String> childrenList = new HashMap<>();
+
+        if (watcherInstanceRegisterMap.containsKey(selectKey)) {
+            return watcherInstanceRegisterMap.get(selectKey);
+        }
+
         configService.getPropertyNames().forEach(key -> {
             if (key.startsWith(watchKey)) {
                 String itemValue = apolloClient.getItemValue(key);
@@ -142,13 +148,15 @@ public class ApolloInstanceRegisterRepository implements ShenyuInstanceRegisterR
                         default:
                             break;
                     }
-                    watcherListener.listener(getInstanceRegisterFun.apply(childrenList));
+                    watcherInstanceRegisterMap.put(selectKey, getInstanceRegisterFun.apply(childrenList));
                 }
             });
         };
         configService.addChangeListener(configChangeListener);
         configChangeListenerMap.put(watchKey, configChangeListener);
-        return getInstanceRegisterFun.apply(childrenList);
+        final List<InstanceEntity> instanceEntities = getInstanceRegisterFun.apply(childrenList);
+        watcherInstanceRegisterMap.put(selectKey, instanceEntities);
+        return instanceEntities;
     }
 
     private String buildInstanceNodeName(final InstanceEntity instance) {
diff --git a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-consul/src/main/java/org/apache/shenyu/register/instance/consul/ConsulInstanceRegisterRepository.java b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-consul/src/main/java/org/apache/shenyu/register/instance/consul/ConsulInstanceRegisterRepository.java
index 56b0539cd..478a6146e 100644
--- a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-consul/src/main/java/org/apache/shenyu/register/instance/consul/ConsulInstanceRegisterRepository.java
+++ b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-consul/src/main/java/org/apache/shenyu/register/instance/consul/ConsulInstanceRegisterRepository.java
@@ -29,11 +29,9 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.shenyu.common.concurrent.ShenyuThreadFactory;
 import org.apache.shenyu.common.constant.Constants;
 import org.apache.shenyu.common.utils.GsonUtils;
-import org.apache.shenyu.common.utils.MapUtils;
 import org.apache.shenyu.register.instance.api.ShenyuInstanceRegisterRepository;
 import org.apache.shenyu.register.instance.api.config.RegisterConfig;
 import org.apache.shenyu.register.instance.api.entity.InstanceEntity;
-import org.apache.shenyu.register.instance.api.watcher.WatcherListener;
 import org.apache.shenyu.spi.Join;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,7 +46,6 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.Properties;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
@@ -72,10 +69,6 @@ public class ConsulInstanceRegisterRepository implements ShenyuInstanceRegisterR
 
     private final List<ScheduledFuture<?>> watchFutures = new ArrayList<>();
 
-    private final Map<String, Set<WatcherListener>> listenerMap = new ConcurrentHashMap<>();
-
-    private final Object lock = new Object();
-
     private final AtomicBoolean running = new AtomicBoolean(false);
 
     private final Map<String, Long> consulIndexes = new HashMap<>();
@@ -92,6 +85,10 @@ public class ConsulInstanceRegisterRepository implements ShenyuInstanceRegisterR
 
     private TtlScheduler ttlScheduler;
 
+    private final Map<String, List<InstanceEntity>> watcherInstanceRegisterMap = new HashMap<>();
+
+    private final Set<String> watchSelectKeySet = new HashSet<>();
+
     @Override
     public void init(final RegisterConfig config) {
         final Properties props = config.getProps();
@@ -149,29 +146,26 @@ public class ConsulInstanceRegisterRepository implements ShenyuInstanceRegisterR
     }
 
     @Override
-    public List<InstanceEntity> selectInstancesAndWatcher(final String selectKey, final WatcherListener watcherListener) {
-        this.watcherStart(selectKey, watcherListener);
-        return this.getHealthServices(selectKey, "-1");
+    public List<InstanceEntity> selectInstances(final String selectKey) {
+        if (watcherInstanceRegisterMap.containsKey(selectKey)) {
+            return watcherInstanceRegisterMap.get(selectKey);
+        }
+        this.watcherStart(selectKey);
+        final List<InstanceEntity> healthServices = this.getHealthServices(selectKey, "-1");
+        watcherInstanceRegisterMap.put(selectKey, healthServices);
+        return healthServices;
     }
 
     /**
      * async to watch data change.
      *
      * @param selectKey selectKey
-     * @param watcherListener watcherListener
      */
-    public void watcherStart(final String selectKey, final WatcherListener watcherListener) {
+    public void watcherStart(final String selectKey) {
         this.running.compareAndSet(false, true);
-        // avoid duplicate watchers
-        Set<WatcherListener> eventListeners = listenerMap.get(selectKey);
-        if (!ObjectUtils.isEmpty(eventListeners)) {
-            eventListeners.add(watcherListener);
+        if (!watchSelectKeySet.add(selectKey)) {
             return;
         }
-        synchronized (lock) {
-            eventListeners = MapUtils.computeIfAbsent(listenerMap, selectKey, s -> new HashSet<>());
-        }
-        eventListeners.add(watcherListener);
         watchFutures.add(this.executor.scheduleWithFixedDelay(() -> this.watchConfigKeyValues(selectKey),
                 5, Integer.parseInt(watchDelay), TimeUnit.SECONDS));
     }
@@ -186,9 +180,11 @@ public class ConsulInstanceRegisterRepository implements ShenyuInstanceRegisterR
             return;
         }
         final List<InstanceEntity> healthServices = this.getHealthServices(selectKey, waitTime);
-        Set<WatcherListener> eventListeners = Optional.ofNullable(listenerMap.get(selectKey)).orElse(Collections.emptySet());
-        // Long polling getHealthServices
-        eventListeners.forEach(eventListener -> eventListener.listener(healthServices));
+        if (!ObjectUtils.isEmpty(healthServices)) {
+            watcherInstanceRegisterMap.put(selectKey, healthServices);
+        } else {
+            watcherInstanceRegisterMap.remove(selectKey);
+        }
     }
 
     /**
diff --git a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-consul/src/test/java/org/apache/shenyu/register/instance/consul/ConsulInstanceRegisterRepositoryTest.java b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-consul/src/test/java/org/apache/shenyu/register/instance/consul/ConsulInstanceRegisterRepositoryTest.java
index 33591a9e5..2f914953a 100644
--- a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-consul/src/test/java/org/apache/shenyu/register/instance/consul/ConsulInstanceRegisterRepositoryTest.java
+++ b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-consul/src/test/java/org/apache/shenyu/register/instance/consul/ConsulInstanceRegisterRepositoryTest.java
@@ -22,7 +22,6 @@ import com.ecwid.consul.v1.agent.model.NewService;
 import org.apache.shenyu.register.instance.api.config.RegisterConfig;
 import org.apache.shenyu.register.instance.api.entity.InstanceEntity;
 import org.apache.shenyu.register.instance.api.path.InstancePathConstants;
-import org.apache.shenyu.register.instance.api.watcher.WatcherListener;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.MockedConstruction;
@@ -114,7 +113,7 @@ class ConsulInstanceRegisterRepositoryTest {
             properties.setProperty("enabledServerRebalance", "true");
             instanceConfig.setProps(properties);
             repository.init(instanceConfig);
-            repository.selectInstancesAndWatcher(InstancePathConstants.buildInstanceParentPath(), mock(WatcherListener.class));
+            repository.selectInstances(InstancePathConstants.buildInstanceParentPath());
             repository.close();
         }
     }
diff --git a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-etcd/src/main/java/org/apache/shenyu/register/instance/etcd/EtcdInstanceRegisterRepository.java b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-etcd/src/main/java/org/apache/shenyu/register/instance/etcd/EtcdInstanceRegisterRepository.java
index 019a6b3fd..5e043ca70 100644
--- a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-etcd/src/main/java/org/apache/shenyu/register/instance/etcd/EtcdInstanceRegisterRepository.java
+++ b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-etcd/src/main/java/org/apache/shenyu/register/instance/etcd/EtcdInstanceRegisterRepository.java
@@ -25,12 +25,12 @@ import org.apache.shenyu.register.instance.api.ShenyuInstanceRegisterRepository;
 import org.apache.shenyu.register.instance.api.config.RegisterConfig;
 import org.apache.shenyu.register.instance.api.entity.InstanceEntity;
 import org.apache.shenyu.register.instance.api.path.InstancePathConstants;
-import org.apache.shenyu.register.instance.api.watcher.WatcherListener;
 import org.apache.shenyu.spi.Join;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -47,6 +47,8 @@ public class EtcdInstanceRegisterRepository implements ShenyuInstanceRegisterRep
 
     private EtcdClient client;
 
+    private final Map<String, List<InstanceEntity>> watcherInstanceRegisterMap = new HashMap<>();
+
     @Override
     public void init(final RegisterConfig config) {
         Properties props = config.getProps();
@@ -66,10 +68,13 @@ public class EtcdInstanceRegisterRepository implements ShenyuInstanceRegisterRep
     }
 
     @Override
-    public List<InstanceEntity> selectInstancesAndWatcher(final String selectKey, final WatcherListener watcherListener) {
+    public List<InstanceEntity> selectInstances(final String selectKey) {
         final String watchKey = InstancePathConstants.buildInstanceParentPath(selectKey);
         final Function<Map<String, String>, List<InstanceEntity>> getInstanceRegisterFun = childrenList ->
                 childrenList.values().stream().map(x -> GsonUtils.getInstance().fromJson(x, InstanceEntity.class)).collect(Collectors.toList());
+        if (watcherInstanceRegisterMap.containsKey(selectKey)) {
+            return getInstanceRegisterFun.apply(client.getKeysMapByPrefix(watchKey));
+        }
         Map<String, String> serverNodes = client.getKeysMapByPrefix(watchKey);
         this.client.watchKeyChanges(watchKey, Watch.listener(response -> {
             for (WatchEvent event : response.getEvents()) {
@@ -87,9 +92,11 @@ public class EtcdInstanceRegisterRepository implements ShenyuInstanceRegisterRep
                     default:
                 }
             }
-            watcherListener.listener(getInstanceRegisterFun.apply(serverNodes));
+            watcherInstanceRegisterMap.put(selectKey, getInstanceRegisterFun.apply(serverNodes));
         }));
-        return getInstanceRegisterFun.apply(serverNodes);
+        final List<InstanceEntity> instanceEntities = getInstanceRegisterFun.apply(serverNodes);
+        watcherInstanceRegisterMap.put(selectKey, instanceEntities);
+        return instanceEntities;
     }
 
     private String buildInstanceNodeName(final InstanceEntity instance) {
diff --git a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-etcd/src/test/java/org/apache/shenyu/register/instance/etcd/EtcdInstanceRegisterRepositoryTest.java b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-etcd/src/test/java/org/apache/shenyu/register/instance/etcd/EtcdInstanceRegisterRepositoryTest.java
index 61e81d1a3..b94cec729 100644
--- a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-etcd/src/test/java/org/apache/shenyu/register/instance/etcd/EtcdInstanceRegisterRepositoryTest.java
+++ b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-etcd/src/test/java/org/apache/shenyu/register/instance/etcd/EtcdInstanceRegisterRepositoryTest.java
@@ -26,7 +26,6 @@ import org.apache.shenyu.common.utils.GsonUtils;
 import org.apache.shenyu.register.instance.api.config.RegisterConfig;
 import org.apache.shenyu.register.instance.api.entity.InstanceEntity;
 import org.apache.shenyu.register.instance.api.path.InstancePathConstants;
-import org.apache.shenyu.register.instance.api.watcher.WatcherListener;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -154,7 +153,7 @@ public final class EtcdInstanceRegisterRepositoryTest {
             RegisterConfig config = new RegisterConfig();
             repository.init(config);
             repository.persistInstance(data);
-            repository.selectInstancesAndWatcher(InstancePathConstants.buildInstanceParentPath(), mock(WatcherListener.class));
+            repository.selectInstances(InstancePathConstants.buildInstanceParentPath());
             repository.close();
         }
     }
diff --git a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-eureka/src/main/java/org/apache/shenyu/register/instance/eureka/EurekaInstanceRegisterRepository.java b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-eureka/src/main/java/org/apache/shenyu/register/instance/eureka/EurekaInstanceRegisterRepository.java
index cbdcf9856..a7b0dcef6 100644
--- a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-eureka/src/main/java/org/apache/shenyu/register/instance/eureka/EurekaInstanceRegisterRepository.java
+++ b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-eureka/src/main/java/org/apache/shenyu/register/instance/eureka/EurekaInstanceRegisterRepository.java
@@ -36,12 +36,10 @@ import org.apache.shenyu.common.utils.IpUtils;
 import org.apache.shenyu.register.instance.api.ShenyuInstanceRegisterRepository;
 import org.apache.shenyu.register.instance.api.config.RegisterConfig;
 import org.apache.shenyu.register.instance.api.entity.InstanceEntity;
-import org.apache.shenyu.register.instance.api.watcher.WatcherListener;
 import org.apache.shenyu.spi.Join;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -54,8 +52,6 @@ public class EurekaInstanceRegisterRepository implements ShenyuInstanceRegisterR
 
     private EurekaHttpClient eurekaHttpClient;
 
-    private final List<String> watcher = new ArrayList<>();
-
     @Override
     public void init(final RegisterConfig config) {
         ConfigurationManager.getConfigInstance().setProperty("eureka.client.service-url.defaultZone", config.getServerLists());
@@ -87,15 +83,7 @@ public class EurekaInstanceRegisterRepository implements ShenyuInstanceRegisterR
     }
 
     @Override
-    public List<InstanceEntity> selectInstancesAndWatcher(final String selectKey, final WatcherListener watcherListener) {
-        if (!watcher.contains(selectKey)) {
-            synchronized (this) {
-                if (!watcher.contains(selectKey)) {
-                    watcher.add(selectKey);
-                    eurekaClient.registerEventListener(event -> watcherListener.listener(getInstances(selectKey)));
-                }
-            }
-        }
+    public List<InstanceEntity> selectInstances(final String selectKey) {
         return getInstances(selectKey);
     }
 
diff --git a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-eureka/src/test/java/org/apache/shenyu/register/instance/eureka/EurekaInstanceRegisterRepositoryTest.java b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-eureka/src/test/java/org/apache/shenyu/register/instance/eureka/EurekaInstanceRegisterRepositoryTest.java
index 3c590143d..48f90928f 100644
--- a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-eureka/src/test/java/org/apache/shenyu/register/instance/eureka/EurekaInstanceRegisterRepositoryTest.java
+++ b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-eureka/src/test/java/org/apache/shenyu/register/instance/eureka/EurekaInstanceRegisterRepositoryTest.java
@@ -25,7 +25,6 @@ import com.netflix.discovery.shared.transport.EurekaHttpClient;
 import com.netflix.discovery.shared.transport.EurekaHttpResponse;
 import com.netflix.discovery.shared.transport.jersey.JerseyApplicationClient;
 import org.apache.shenyu.register.instance.api.entity.InstanceEntity;
-import org.apache.shenyu.register.instance.api.watcher.WatcherListener;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -107,9 +106,7 @@ public final class EurekaInstanceRegisterRepositoryTest {
 
     @Test
     public void testSelectInstancesAndWatcher() {
-        WatcherListener watcherListener = mock(WatcherListener.class);
-        repository.selectInstancesAndWatcher(instanceId, watcherListener);
-        assertTrue(eurekaEventStorage.containsKey(instanceId));
+        repository.selectInstances(instanceId);
         repository.close();
         assertTrue(eurekaEventStorage.isEmpty());
     }
diff --git a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-nacos/src/main/java/org/apache/shenyu/register/instance/nacos/NacosInstanceRegisterRepository.java b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-nacos/src/main/java/org/apache/shenyu/register/instance/nacos/NacosInstanceRegisterRepository.java
index 6a13a6153..6f1dc830d 100644
--- a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-nacos/src/main/java/org/apache/shenyu/register/instance/nacos/NacosInstanceRegisterRepository.java
+++ b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-nacos/src/main/java/org/apache/shenyu/register/instance/nacos/NacosInstanceRegisterRepository.java
@@ -27,7 +27,6 @@ import org.apache.shenyu.common.exception.ShenyuException;
 import org.apache.shenyu.register.instance.api.ShenyuInstanceRegisterRepository;
 import org.apache.shenyu.register.instance.api.config.RegisterConfig;
 import org.apache.shenyu.register.instance.api.entity.InstanceEntity;
-import org.apache.shenyu.register.instance.api.watcher.WatcherListener;
 import org.apache.shenyu.spi.Join;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -54,7 +53,7 @@ public class NacosInstanceRegisterRepository implements ShenyuInstanceRegisterRe
     public void init(final RegisterConfig config) {
         Properties properties = config.getProps();
         Properties nacosProperties = new Properties();
-        this.groupName = properties.getProperty("groupName", "DEFAULT_GROUP");
+        this.groupName = properties.getProperty("groupName", "SHENYU_GROUP");
         String serverAddr = config.getServerLists();
         nacosProperties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
         nacosProperties.put(PropertyKeyConst.NAMESPACE, properties.getProperty(NAMESPACE, ""));
@@ -87,13 +86,7 @@ public class NacosInstanceRegisterRepository implements ShenyuInstanceRegisterRe
     }
 
     @Override
-    public List<InstanceEntity> selectInstancesAndWatcher(final String selectKey, final WatcherListener watcherListener) {
-        try {
-            namingService.subscribe(selectKey, event -> watcherListener.listener(getInstanceRegisterDTOS(selectKey)));
-        } catch (Exception e) {
-            LOGGER.error("selectInstancesAndWatcher error", e);
-        }
-
+    public List<InstanceEntity> selectInstances(final String selectKey) {
         return getInstanceRegisterDTOS(selectKey);
     }
 
@@ -117,7 +110,7 @@ public class NacosInstanceRegisterRepository implements ShenyuInstanceRegisterRe
     private InstanceEntity convertFromInstance(final Instance instance) {
         InstanceEntity instanceEntity = new InstanceEntity();
         instanceEntity.setPort(instance.getPort());
-        instanceEntity.setHost(instance.getInstanceId());
+        instanceEntity.setHost(instance.getIp());
         instanceEntity.setAppName(instance.getServiceName());
         return instanceEntity;
     }
diff --git a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-nacos/src/test/java/org/apache/shenyu/register/instance/nacos/NacosInstanceRegisterRepositoryTest.java b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-nacos/src/test/java/org/apache/shenyu/register/instance/nacos/NacosInstanceRegisterRepositoryTest.java
index 9903e77b6..d7e9a0378 100644
--- a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-nacos/src/test/java/org/apache/shenyu/register/instance/nacos/NacosInstanceRegisterRepositoryTest.java
+++ b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-nacos/src/test/java/org/apache/shenyu/register/instance/nacos/NacosInstanceRegisterRepositoryTest.java
@@ -21,7 +21,6 @@ import com.alibaba.nacos.api.exception.NacosException;
 import com.alibaba.nacos.api.naming.NamingService;
 import com.alibaba.nacos.api.naming.pojo.Instance;
 import org.apache.shenyu.register.instance.api.entity.InstanceEntity;
-import org.apache.shenyu.register.instance.api.watcher.WatcherListener;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -98,8 +97,7 @@ public final class NacosInstanceRegisterRepositoryTest {
     @Test
     public void testSelectInstancesAndWatcher() {
         String selectKey = "shenyu-instances";
-        WatcherListener watcherListener = mock(WatcherListener.class);
-        repository.selectInstancesAndWatcher(selectKey, watcherListener);
+        repository.selectInstances(selectKey);
         repository.close();
     }
 }
diff --git a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/main/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepository.java b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/main/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepository.java
index 3addfdc61..89d4cc1cb 100644
--- a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/main/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepository.java
+++ b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/main/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepository.java
@@ -26,7 +26,6 @@ import org.apache.shenyu.register.instance.api.ShenyuInstanceRegisterRepository;
 import org.apache.shenyu.register.instance.api.config.RegisterConfig;
 import org.apache.shenyu.register.instance.api.entity.InstanceEntity;
 import org.apache.shenyu.register.instance.api.path.InstancePathConstants;
-import org.apache.shenyu.register.instance.api.watcher.WatcherListener;
 import org.apache.shenyu.spi.Join;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.WatchedEvent;
@@ -54,6 +53,8 @@ public class ZookeeperInstanceRegisterRepository implements ShenyuInstanceRegist
 
     private final Map<String, String> nodeDataMap = new HashMap<>();
 
+    private final Map<String, List<InstanceEntity>> watcherInstanceRegisterMap = new HashMap<>();
+
     @Override
     public void init(final RegisterConfig config) {
         Properties props = config.getProps();
@@ -105,27 +106,37 @@ public class ZookeeperInstanceRegisterRepository implements ShenyuInstanceRegist
     }
 
     @Override
-    public List<InstanceEntity> selectInstancesAndWatcher(final String selectKey, final WatcherListener watcherListener) {
+    public List<InstanceEntity> selectInstances(final String selectKey) {
         final String watchKey = InstancePathConstants.buildInstanceParentPath(selectKey);
         final Function<List<String>, List<InstanceEntity>> getInstanceRegisterFun = childrenList -> childrenList.stream().map(childPath -> {
             String instanceRegisterJsonStr = client.get(InstancePathConstants.buildRealNode(watchKey, childPath));
             return GsonUtils.getInstance().fromJson(instanceRegisterJsonStr, InstanceEntity.class);
         }).collect(Collectors.toList());
 
+        if (watcherInstanceRegisterMap.containsKey(selectKey)) {
+            return watcherInstanceRegisterMap.get(selectKey);
+        }
+
         List<String> childrenPathList = client.subscribeChildrenChanges(watchKey, new CuratorWatcher() {
             @Override
             public void process(final WatchedEvent event) {
-                if (watcherListener != null) {
-                    String path = Objects.isNull(event.getPath()) ? "" : event.getPath();
+                try {
+                    String path = Objects.isNull(event.getPath()) ? selectKey : event.getPath();
                     List<String> childrenList = StringUtils.isNotBlank(path) ? client.subscribeChildrenChanges(path, this)
                             : Collections.emptyList();
                     if (!childrenList.isEmpty()) {
-                        watcherListener.listener(getInstanceRegisterFun.apply(childrenList));
+                        watcherInstanceRegisterMap.put(selectKey, getInstanceRegisterFun.apply(childrenList));
                     }
+                } catch (Exception e) {
+                    watcherInstanceRegisterMap.remove(selectKey);
+                    LOGGER.error("zookeeper client subscribeChildrenChanges watch interrupt error:", e);
                 }
             }
         });
-        return getInstanceRegisterFun.apply(childrenPathList);
+
+        final List<InstanceEntity> instanceEntities = getInstanceRegisterFun.apply(childrenPathList);
+        watcherInstanceRegisterMap.put(selectKey, instanceEntities);
+        return instanceEntities;
     }
 
     @Override
diff --git a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepositoryTest.java b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepositoryTest.java
index 8292d347b..c9a7ce79a 100644
--- a/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepositoryTest.java
+++ b/shenyu-register-center/shenyu-register-instance/shenyu-register-instance-zookeeper/src/test/java/org/apache/shenyu/register/instance/zookeeper/ZookeeperInstanceRegisterRepositoryTest.java
@@ -26,7 +26,6 @@ import org.apache.shenyu.common.utils.GsonUtils;
 import org.apache.shenyu.register.instance.api.config.RegisterConfig;
 import org.apache.shenyu.register.instance.api.entity.InstanceEntity;
 import org.apache.shenyu.register.instance.api.path.InstancePathConstants;
-import org.apache.shenyu.register.instance.api.watcher.WatcherListener;
 import org.apache.zookeeper.WatchedEvent;
 import org.junit.jupiter.api.Test;
 import org.mockito.MockedConstruction;
@@ -99,7 +98,7 @@ public final class ZookeeperInstanceRegisterRepositoryTest {
             final Properties configProps = config.getProps();
             configProps.setProperty("digest", "digest");
             repository.init(config);
-            repository.selectInstancesAndWatcher(InstancePathConstants.buildInstanceParentPath(), mock(WatcherListener.class));
+            repository.selectInstances(InstancePathConstants.buildInstanceParentPath());
             WatchedEvent mockEvent = mock(WatchedEvent.class);
             when(mockEvent.getPath()).thenReturn(InstancePathConstants.buildInstanceParentPath());
             watcherArr[0].process(mockEvent);
diff --git a/shenyu-sdk/shenyu-sdk-core/src/main/java/org/apache/shenyu/sdk/core/client/AbstractShenyuSdkClient.java b/shenyu-sdk/shenyu-sdk-core/src/main/java/org/apache/shenyu/sdk/core/client/AbstractShenyuSdkClient.java
index 5f5d2412a..f4e9880ff 100644
--- a/shenyu-sdk/shenyu-sdk-core/src/main/java/org/apache/shenyu/sdk/core/client/AbstractShenyuSdkClient.java
+++ b/shenyu-sdk/shenyu-sdk-core/src/main/java/org/apache/shenyu/sdk/core/client/AbstractShenyuSdkClient.java
@@ -38,9 +38,7 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.net.URI;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Properties;
@@ -63,8 +61,6 @@ public abstract class AbstractShenyuSdkClient implements ShenyuSdkClient {
 
     private List<ShenyuSdkRequestInterceptor> requestInterceptors;
 
-    private final Map<String, List<InstanceEntity>> watcherInstanceRegisterMap = new HashMap<>();
-
     private RegisterConfig registerConfig;
 
     private String algorithm;
@@ -152,6 +148,7 @@ public abstract class AbstractShenyuSdkClient implements ShenyuSdkClient {
      * @return {@linkplain String}
      */
     private String loadBalancerInstances(final ShenyuRequest request) {
+        // all addresses of registry
         final List<Upstream> upstreams;
         if (Objects.isNull(registerRepository)) {
             List<String> serverList = Arrays.asList(registerConfig.getServerLists().split(","));
@@ -162,12 +159,7 @@ public abstract class AbstractShenyuSdkClient implements ShenyuSdkClient {
                     .map(serverAddress -> Upstream.builder().url(UriUtils.appendScheme(serverAddress, scheme)).build())
                     .collect(Collectors.toList());
         } else {
-            List<InstanceEntity> instanceRegisters = watcherInstanceRegisterMap.get(request.getName());
-            if (instanceRegisters == null) {
-                instanceRegisters = registerRepository.selectInstancesAndWatcher(request.getName(),
-                    instanceRegisterDTOs -> watcherInstanceRegisterMap.put(request.getName(), instanceRegisterDTOs));
-                watcherInstanceRegisterMap.put(request.getName(), instanceRegisters);
-            }
+            List<InstanceEntity> instanceRegisters = registerRepository.selectInstances(request.getName());
             if (ObjectUtils.isEmpty(instanceRegisters)) {
                 throw new ShenyuException("Gateway address not found from registry.");
             }
@@ -178,7 +170,7 @@ public abstract class AbstractShenyuSdkClient implements ShenyuSdkClient {
                     })
                     .collect(Collectors.toList());
         }
-        // loadBalancer
+        // loadBalancer upstreams
         final Upstream upstream = LoadBalancerFactory.selector(upstreams, algorithm, "");
         return replaceUrl(upstream.getUrl(), request.getUrl());
     }
diff --git a/shenyu-sdk/shenyu-sdk-spring/src/main/java/org/apache/shenyu/sdk/spring/proxy/ShenyuClientMethodHandler.java b/shenyu-sdk/shenyu-sdk-spring/src/main/java/org/apache/shenyu/sdk/spring/proxy/ShenyuClientMethodHandler.java
index 64909f63b..a3fec3c14 100644
--- a/shenyu-sdk/shenyu-sdk-spring/src/main/java/org/apache/shenyu/sdk/spring/proxy/ShenyuClientMethodHandler.java
+++ b/shenyu-sdk/shenyu-sdk-spring/src/main/java/org/apache/shenyu/sdk/spring/proxy/ShenyuClientMethodHandler.java
@@ -24,6 +24,8 @@ import org.apache.shenyu.sdk.core.client.ShenyuSdkClient;
 import org.apache.shenyu.sdk.core.common.RequestTemplate;
 import org.apache.shenyu.sdk.spring.ShenyuClient;
 import org.apache.shenyu.sdk.spring.factory.AnnotatedParameterProcessor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpStatus;
 import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
@@ -38,6 +40,8 @@ import java.util.Map;
  */
 public class ShenyuClientMethodHandler {
 
+    private static final Logger log = LoggerFactory.getLogger(ShenyuClientMethodHandler.class);
+
     private final ShenyuClient shenyuClient;
 
     private final ShenyuSdkClient shenyuHttpClient;
@@ -75,6 +79,7 @@ public class ShenyuClientMethodHandler {
         } else if (ShenyuResponse.class == returnType) {
             return shenyuResponse;
         } else if (shenyuResponse.getStatus() != HttpStatus.OK.value()) {
+            log.warn("handlerResponse http status warn shenyuResponse {}", JsonUtils.toJson(shenyuResponse));
             throw new HttpClientErrorException(HttpStatus.valueOf(shenyuResponse.getStatus()));
         } else if (StringUtils.hasText(shenyuResponse.getBody())) {
             return JsonUtils.jsonToObject(shenyuResponse.getBody(), returnType);
diff --git a/shenyu-sync-data-center/shenyu-sync-data-websocket/src/main/java/org/apache/shenyu/plugin/sync/data/websocket/client/ShenyuWebsocketClient.java b/shenyu-sync-data-center/shenyu-sync-data-websocket/src/main/java/org/apache/shenyu/plugin/sync/data/websocket/client/ShenyuWebsocketClient.java
index dc92ec9e4..e3a55a8b6 100644
--- a/shenyu-sync-data-center/shenyu-sync-data-websocket/src/main/java/org/apache/shenyu/plugin/sync/data/websocket/client/ShenyuWebsocketClient.java
+++ b/shenyu-sync-data-center/shenyu-sync-data-websocket/src/main/java/org/apache/shenyu/plugin/sync/data/websocket/client/ShenyuWebsocketClient.java
@@ -171,7 +171,12 @@ public final class ShenyuWebsocketClient extends WebSocketClient {
             LOG.error("websocket connect is error :{}", e.getMessage());
         }
     }
-    
+
+    /**
+     * handle admin message.
+     *
+     * @param result result
+     */
     private void handleResult(final String result) {
         LOG.info("handleResult({})", result);
         WebsocketData<?> websocketData = GsonUtils.getInstance().fromJson(result, WebsocketData.class);