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);