This is an automated email from the ASF dual-hosted git repository.
zhangzicheng 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 1b08ed0eb [ISSUE #4686] ZookeeperClientRegisterRepository active
offline (#4806)
1b08ed0eb is described below
commit 1b08ed0ebc669a7ded2c1983462bf0da0ffc1396
Author: xuziyang <[email protected]>
AuthorDate: Fri Jul 7 10:07:21 2023 +0800
[ISSUE #4686] ZookeeperClientRegisterRepository active offline (#4806)
Co-authored-by: dragon-zhang <[email protected]>
Co-authored-by: xiaoyu <[email protected]>
---
.../ZookeeperClientServerRegisterRepository.java | 43 +++++++++++-----------
.../ZookeeperServerRegisterRepositoryTest.java | 24 +++++++++---
2 files changed, 41 insertions(+), 26 deletions(-)
diff --git
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/main/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientServerRegisterRepository.java
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/main/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientServerRegisterRepository.java
index e37d95027..3cc385067 100644
---
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/main/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientServerRegisterRepository.java
+++
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/main/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperClientServerRegisterRepository.java
@@ -19,13 +19,11 @@ package org.apache.shenyu.register.client.server.zookeeper;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
-import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
-import org.apache.shenyu.common.constant.Constants;
import org.apache.shenyu.common.enums.RpcTypeEnum;
import org.apache.shenyu.common.utils.GsonUtils;
import
org.apache.shenyu.register.client.server.api.ShenyuClientServerRegisterPublisher;
@@ -33,13 +31,14 @@ import
org.apache.shenyu.register.client.server.api.ShenyuClientServerRegisterRe
import org.apache.shenyu.register.common.config.ShenyuRegisterCenterConfig;
import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
import org.apache.shenyu.register.common.dto.URIRegisterDTO;
+import org.apache.shenyu.register.common.enums.EventType;
import org.apache.shenyu.register.common.path.RegisterPathConstants;
import org.apache.shenyu.spi.Join;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;
-import java.util.LinkedList;
+import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.Properties;
@@ -117,6 +116,7 @@ public class ZookeeperClientServerRegisterRepository
implements ShenyuClientServ
}
abstract static class AbstractRegisterListener implements
TreeCacheListener {
+
@Override
public final void childEvent(final CuratorFramework client, final
TreeCacheEvent event) {
ChildData childData = event.getData();
@@ -157,29 +157,30 @@ public class ZookeeperClientServerRegisterRepository
implements ShenyuClientServ
}
class URICacheListener extends AbstractRegisterListener {
+
@Override
public void event(final TreeCacheEvent.Type type, final String path,
final ChildData data) {
- // if not uri register path, return.
- if (!path.contains(RegisterPathConstants.ROOT_PATH)) {
+ // Non-leaf node, return directly
+ if (data.getData() == null || data.getData().length == 0) {
+ return;
+ }
+ URIRegisterDTO uriRegisterDTO = GsonUtils.getInstance()
+ .fromJson(new String(data.getData()),
URIRegisterDTO.class);
+ if (uriRegisterDTO == null) {
return;
}
- // get children under context path
- int lastSepIndex = path.lastIndexOf(Constants.PATH_SEPARATOR);
- String contextPath = path.substring(0, lastSepIndex);
- List<String> childrenList = client.getChildren(contextPath);
-
- List<URIRegisterDTO> registerDTOList = new LinkedList<>();
- childrenList.forEach(addPath -> {
- String realPath =
RegisterPathConstants.buildRealNode(contextPath, addPath);
-
registerDTOList.add(GsonUtils.getInstance().fromJson(client.get(realPath),
URIRegisterDTO.class));
- });
-
- if (CollectionUtils.isEmpty(registerDTOList)) {
- String[] paths = contextPath.split(Constants.PATH_SEPARATOR);
- URIRegisterDTO uriRegisterDTO =
URIRegisterDTO.builder().contextPath(Constants.PATH_SEPARATOR +
paths[paths.length - 1]).rpcType(paths[paths.length - 2]).build();
- registerDTOList.add(uriRegisterDTO);
+ switch (type) {
+ case NODE_ADDED:
+ uriRegisterDTO.setEventType(EventType.REGISTER);
+ publishRegisterURI(Arrays.asList(uriRegisterDTO));
+ break;
+ case NODE_REMOVED:
+ uriRegisterDTO.setEventType(EventType.OFFLINE);
+ publishRegisterURI(Arrays.asList(uriRegisterDTO));
+ break;
+ default:
+ break;
}
- publishRegisterURI(registerDTOList);
}
}
}
diff --git
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
index c942cb930..6de72524f 100644
---
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
+++
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-zookeeper/src/test/java/org/apache/shenyu/register/client/server/zookeeper/ZookeeperServerRegisterRepositoryTest.java
@@ -69,10 +69,23 @@ public class ZookeeperServerRegisterRepositoryTest {
List<TreeCacheEvent> treeCacheEvent = new ArrayList<>();
// register uri
-
treeCacheEvent.add(treeCacheEvent("/shenyu/register/uri/test/test/test"));
- // register metadata
-
treeCacheEvent.add(treeCacheEvent("/shenyu/register/metadata/test/test/test"));
+ treeCacheEvent.add(
+ treeCacheEvent(TreeCacheEvent.Type.NODE_ADDED,
"/shenyu/register/uri/test/test/test", "{}")
+ );
+ treeCacheEvent.add(
+ treeCacheEvent(TreeCacheEvent.Type.NODE_ADDED,
"/shenyu/register/uri/test/test/test", "")
+ );
+ treeCacheEvent.add(
+ treeCacheEvent(TreeCacheEvent.Type.NODE_REMOVED,
"/shenyu/register/uri/test/test/test", "{}")
+ );
+ treeCacheEvent.add(
+ treeCacheEvent(TreeCacheEvent.Type.NODE_REMOVED,
"/shenyu/register/uri/test/test/test", "")
+ );
+ // register metadata
+ treeCacheEvent.add(
+ treeCacheEvent(TreeCacheEvent.Type.NODE_ADDED,
"/shenyu/register/metadata/test/test/test", "{}")
+ );
for (TreeCacheListener treeCacheListener : treeCacheListeners) {
for (TreeCacheEvent event : treeCacheEvent) {
treeCacheListener.childEvent(curatorFramework, event);
@@ -96,12 +109,13 @@ public class ZookeeperServerRegisterRepositoryTest {
}
}
- private static TreeCacheEvent treeCacheEvent(final String path) {
+ private static TreeCacheEvent treeCacheEvent(final TreeCacheEvent.Type
type, final String path, final String data) {
TreeCacheEvent treeCacheEvent = mock(TreeCacheEvent.class);
ChildData childData = mock(ChildData.class);
+ when(treeCacheEvent.getType()).thenReturn(type);
when(treeCacheEvent.getData()).thenReturn(childData);
when(childData.getPath()).thenReturn(path);
- when(childData.getData()).thenReturn("{}".getBytes());
+ when(childData.getData()).thenReturn(data.getBytes());
return treeCacheEvent;
}
}