From 57fd7b96b4322c3850b5a8dbaf09bed1b64f2643 Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Sat, 16 May 2020 17:03:55 +0800 Subject: [PATCH] $cluster --- src/META-INF/application-template.xml | 1 + src/org/redkale/boot/ClassFilter.java | 8 ++++++-- src/org/redkale/boot/NodeServer.java | 6 +++--- src/org/redkale/net/sncp/Sncp.java | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/META-INF/application-template.xml b/src/META-INF/application-template.xml index 1cf85fecb..e5801cd77 100644 --- a/src/META-INF/application-template.xml +++ b/src/META-INF/application-template.xml @@ -152,6 +152,7 @@ groups: 所属组的节点,多个节点值用;隔开,如果配置文件中存在多个SNCP协议的Server节点,需要显式指定group属性. 当 protocol == SNCP 时 group表示当前Server与哪些节点组关联。 当 protocol != SNCP 时 group只能是空或者一个group的节点值,不能为多个节点值。 + 特殊值"$cluster", 视为通过第三方服务注册发现管理工具来获取远程模式的ip端口信息 --> diff --git a/src/org/redkale/boot/ClassFilter.java b/src/org/redkale/boot/ClassFilter.java index aecfc2b9c..2c1634ae7 100644 --- a/src/org/redkale/boot/ClassFilter.java +++ b/src/org/redkale/boot/ClassFilter.java @@ -407,7 +407,7 @@ public final class ClassFilter { str = str.trim(); if (str.endsWith(";")) str = str.substring(0, str.length() - 1); } - if (str != null) groups.addAll(Arrays.asList(str.split(";"))); + if (str != null) this.groups.addAll(Arrays.asList(str.split(";"))); this.property = property; this.autoload = autoload; this.expect = expect; @@ -417,7 +417,7 @@ public final class ClassFilter { @Override public String toString() { return this.getClass().getSimpleName() + "[thread=" + Thread.currentThread().getName() - + ", type=" + this.type.getSimpleName() + ", name=" + name + ", groups=" + groups + "]"; + + ", type=" + this.type.getSimpleName() + ", name=" + name + ", groups=" + this.groups + "]"; } @Override @@ -444,6 +444,10 @@ public final class ClassFilter { return property; } + public boolean containsGroup(String group) { + return groups != null && groups.contains(group); + } + public boolean isEmptyGroups() { return groups == null || groups.isEmpty(); } diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index bb04da3ef..730b0b6d2 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -301,7 +301,7 @@ public abstract class NodeServer { if ((src instanceof Service) && Sncp.isRemote((Service) src)) return; //远程模式不需要注入 CacheSource final Service srcService = (Service) src; SncpClient client = Sncp.getSncpClient(srcService); - final InetSocketAddress sncpAddr = client == null ? null : client.getClientAddress(); + final InetSocketAddress sncpAddr = client == null ? null : client.getClientAddress(); SimpleEntry resEntry = cacheResource.get(resourceName); AnyValue sourceConf = resEntry == null ? null : resEntry.getValue(); if (sourceConf == null) { @@ -408,10 +408,10 @@ public abstract class NodeServer { final HashSet groups = entry.getGroups(); //groups.isEmpty()表示没有配置groups属性。 if (groups.isEmpty() && isSNCP() && this.sncpGroup != null) groups.add(this.sncpGroup); - final boolean localed = (this.sncpAddress == null && entry.isEmptyGroups() && !serviceImplClass.isInterface() && !Modifier.isAbstract(serviceImplClass.getModifiers())) //非SNCP的Server,通常是单点服务 + final boolean localed = !entry.containsGroup("$cluster") && ((this.sncpAddress == null && entry.isEmptyGroups() && !serviceImplClass.isInterface() && !Modifier.isAbstract(serviceImplClass.getModifiers())) //非SNCP的Server,通常是单点服务 || groups.contains(this.sncpGroup) //本地IP含在内的 || (this.sncpGroup == null && entry.isEmptyGroups()) //空的SNCP配置 - || serviceImplClass.getAnnotation(Local.class) != null;//本地模式 + || serviceImplClass.getAnnotation(Local.class) != null);//本地模式 if (localed && (serviceImplClass.isInterface() || Modifier.isAbstract(serviceImplClass.getModifiers()))) continue; //本地模式不能实例化接口和抽象类的Service类 final ResourceFactory.ResourceLoader resourceLoader = (ResourceFactory rf, final Object src, final String resourceName, Field field, final Object attachment) -> { try { diff --git a/src/org/redkale/net/sncp/Sncp.java b/src/org/redkale/net/sncp/Sncp.java index e60765f49..90c0baab3 100644 --- a/src/org/redkale/net/sncp/Sncp.java +++ b/src/org/redkale/net/sncp/Sncp.java @@ -529,7 +529,7 @@ public abstract class Sncp { final AnyValue conf) { if (serviceTypeOrImplClass == null) return null; if (!Service.class.isAssignableFrom(serviceTypeOrImplClass)) return null; - Set groups = groups0 == null ? new HashSet<>() : groups0; + final Set groups = groups0 == null ? new HashSet<>() : groups0; ResourceFactory.checkResourceName(name); int mod = serviceTypeOrImplClass.getModifiers(); boolean realed = !(java.lang.reflect.Modifier.isAbstract(mod) || serviceTypeOrImplClass.isInterface());