From 6d7cbbb7a4492ef841a0f50e613059f4f3618eb9 Mon Sep 17 00:00:00 2001 From: sodaRyCN <757083350@qq.com> Date: Wed, 29 May 2024 10:20:57 +0800 Subject: [PATCH] reactor registry --- .../registry/AbstractRegistryListener.java | 14 --- .../eventmesh/registry/NotifyEvent.java | 30 ++++++ .../registry/RegisterServerInfo.java | 13 +++ .../apache/eventmesh/registry/Registry.java | 76 ------------- .../eventmesh/registry/RegistryFactory.java | 28 +++++ .../eventmesh/registry/RegistryListener.java | 2 +- .../eventmesh/registry/RegistryService.java | 1 - .../registry/nacos/NacosDiscoveryService.java | 100 ++++++++++++++---- .../nacos/NacosRegistryConfiguration.java | 23 ++-- ....apache.eventmesh.registry.RegistryService | 16 +++ 10 files changed, 177 insertions(+), 126 deletions(-) delete mode 100644 eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/AbstractRegistryListener.java create mode 100644 eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/NotifyEvent.java delete mode 100644 eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/Registry.java create mode 100644 eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegistryFactory.java create mode 100644 eventmesh-registry/eventmesh-registry-nacos/src/main/resources/META-INF/eventmesh/org.apache.eventmesh.registry.RegistryService diff --git a/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/AbstractRegistryListener.java b/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/AbstractRegistryListener.java deleted file mode 100644 index f5e36677ca..0000000000 --- a/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/AbstractRegistryListener.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.apache.eventmesh.registry; - -public abstract class AbstractRegistryListener implements RegistryListener { - protected abstract boolean checkType(Object data); - @Override - @SuppressWarnings("unchecked") - public void onChange(Object data) { - if (!checkType(data)) { - return; - } - process((T)data); - } - protected abstract void process(T data); -} diff --git a/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/NotifyEvent.java b/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/NotifyEvent.java new file mode 100644 index 0000000000..7b27a22959 --- /dev/null +++ b/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/NotifyEvent.java @@ -0,0 +1,30 @@ +package org.apache.eventmesh.registry; + +import lombok.Getter; + +import java.util.List; + +public class NotifyEvent { + + public NotifyEvent(){ + + } + + public NotifyEvent(List instances) { + this(instances, false); + } + + public NotifyEvent(List instances, boolean isIncrement) { + this.isIncrement = isIncrement; + this.instances = instances; + } + + + + // means whether it is an increment data + @Getter + private boolean isIncrement; + + @Getter + private List instances; +} diff --git a/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegisterServerInfo.java b/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegisterServerInfo.java index a46b846df5..5ad4f288c2 100644 --- a/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegisterServerInfo.java +++ b/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegisterServerInfo.java @@ -38,4 +38,17 @@ public void setMetadata(Map metadata) { public void addMetadata(String key, String value) { this.metadata.put(key, value); } + + public void setExtFields(Map extFields) { + if (extFields == null) { + this.extFields.clear(); + return; + } + + this.extFields = extFields; + } + + public void addExtFields(String key, Object value) { + this.extFields.put(key, value); + } } diff --git a/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/Registry.java b/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/Registry.java deleted file mode 100644 index 5a48f8c947..0000000000 --- a/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/Registry.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.apache.eventmesh.registry; - -import lombok.extern.slf4j.Slf4j; -import org.apache.eventmesh.registry.exception.RegistryException; -import org.apache.eventmesh.spi.EventMeshExtensionFactory; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; - -@Slf4j -public class Registry implements RegistryService { - private static final Map META_CACHE = new HashMap<>(16); - private RegistryService registryService; - - private final AtomicBoolean initFlag = new AtomicBoolean(false); - private final AtomicBoolean shutdownFlag = new AtomicBoolean(false); - - public static Registry getInstance(String registryPluginType) { - return META_CACHE.computeIfAbsent(registryPluginType, Registry::registryBuilder); - } - - private static Registry registryBuilder(String registryPluginType) { - RegistryService registryServiceExt = EventMeshExtensionFactory.getExtension(RegistryService.class, registryPluginType); - if (registryServiceExt == null) { - String errorMsg = "can't load the metaService plugin, please check."; - log.error(errorMsg); - throw new RuntimeException(errorMsg); - } - Registry metaStorage = new Registry(); - metaStorage.registryService = registryServiceExt; - - return metaStorage; - } - - @Override - public void init() throws RegistryException { - if (initFlag.compareAndSet(false, true)) { - return; - } - this.registryService.init(); - } - - @Override - public void shutdown() throws RegistryException { - if (shutdownFlag.compareAndSet(false, true)) { - this.registryService.shutdown(); - } - } - - @Override - public void subscribe(RegistryListener registryListener, String serviceName) { - this.registryService.subscribe(registryListener, serviceName); - } - - @Override - public void unsubscribe(RegistryListener registryListener, String serviceName) { - this.registryService.unsubscribe(registryListener, serviceName); - } - - @Override - public List selectInstances(QueryInstances serverInfo) { - return this.registryService.selectInstances(serverInfo); - } - - @Override - public boolean register(RegisterServerInfo registerInfo) throws RegistryException { - return this.registryService.register(registerInfo); - } - - @Override - public boolean unRegister(RegisterServerInfo unRegisterInfo) throws RegistryException { - return this.registryService.unRegister(unRegisterInfo); - } -} diff --git a/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegistryFactory.java b/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegistryFactory.java new file mode 100644 index 0000000000..ff135b0b22 --- /dev/null +++ b/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegistryFactory.java @@ -0,0 +1,28 @@ +package org.apache.eventmesh.registry; + +import lombok.extern.slf4j.Slf4j; +import org.apache.eventmesh.spi.EventMeshExtensionFactory; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +public class RegistryFactory { + private static final Map META_CACHE = new HashMap<>(16); + + public static RegistryService getInstance(String registryPluginType) { + return META_CACHE.computeIfAbsent(registryPluginType, RegistryFactory::registryBuilder); + } + + private static RegistryService registryBuilder(String registryPluginType) { + RegistryService registryServiceExt = EventMeshExtensionFactory.getExtension(RegistryService.class, registryPluginType); + if (registryServiceExt == null) { + String errorMsg = "can't load the registry plugin, please check."; + log.error(errorMsg); + throw new RuntimeException(errorMsg); + } + log.info("build registry plugin [{}] by type [{}] success", registryServiceExt.getClass().getSimpleName(), + registryPluginType); + return registryServiceExt; + } +} diff --git a/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegistryListener.java b/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegistryListener.java index 4f53e4b769..32d542ba22 100644 --- a/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegistryListener.java +++ b/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegistryListener.java @@ -1,5 +1,5 @@ package org.apache.eventmesh.registry; public interface RegistryListener { - void onChange(Object data); + void onChange(NotifyEvent event) throws Exception; } diff --git a/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegistryService.java b/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegistryService.java index f549e136dc..72536a08b4 100644 --- a/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegistryService.java +++ b/eventmesh-registry/eventmesh-registry-api/src/main/java/org/apache/eventmesh/registry/RegistryService.java @@ -9,7 +9,6 @@ @EventMeshSPI(eventMeshExtensionType = EventMeshExtensionType.REGISTRY) public interface RegistryService { - String ConfigurationKey = "registry"; void init() throws RegistryException; void shutdown() throws RegistryException; diff --git a/eventmesh-registry/eventmesh-registry-nacos/src/main/java/org/apache/eventmesh/registry/nacos/NacosDiscoveryService.java b/eventmesh-registry/eventmesh-registry-nacos/src/main/java/org/apache/eventmesh/registry/nacos/NacosDiscoveryService.java index dbb9a140c9..13b75df614 100644 --- a/eventmesh-registry/eventmesh-registry-nacos/src/main/java/org/apache/eventmesh/registry/nacos/NacosDiscoveryService.java +++ b/eventmesh-registry/eventmesh-registry-nacos/src/main/java/org/apache/eventmesh/registry/nacos/NacosDiscoveryService.java @@ -4,16 +4,18 @@ import com.alibaba.nacos.api.PropertyKeyConst; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingService; +import com.alibaba.nacos.api.naming.listener.AbstractEventListener; +import com.alibaba.nacos.api.naming.listener.Event; import com.alibaba.nacos.api.naming.listener.EventListener; +import com.alibaba.nacos.api.naming.listener.NamingEvent; import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.api.naming.pojo.ServiceInfo; import com.alibaba.nacos.api.naming.utils.NamingUtils; import com.alibaba.nacos.client.naming.utils.UtilAndComs; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.apache.eventmesh.common.config.CommonConfiguration; import org.apache.eventmesh.common.config.ConfigService; -import org.apache.eventmesh.common.utils.ConfigurationContextUtil; +import org.apache.eventmesh.registry.NotifyEvent; import org.apache.eventmesh.registry.QueryInstances; import org.apache.eventmesh.registry.RegisterServerInfo; import org.apache.eventmesh.registry.RegistryListener; @@ -28,6 +30,10 @@ import java.util.Objects; import java.util.Optional; import java.util.Properties; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -35,9 +41,8 @@ @Slf4j public class NacosDiscoveryService implements RegistryService { - private final AtomicBoolean initFlag = new AtomicBoolean(false); - private CommonConfiguration configuration; + private final AtomicBoolean initFlag = new AtomicBoolean(false); private NacosRegistryConfiguration nacosConf; @@ -45,18 +50,23 @@ public class NacosDiscoveryService implements RegistryService { private final Map> listeners = new HashMap<>(); + private static final Executor notifyExecutor = new ThreadPoolExecutor(1, 1, 60L, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(20), r -> { + Thread t = new Thread(r); + t.setName("org.apache.eventmesh.registry.nacos.executor"); + t.setDaemon(true); + return t; + }, new ThreadPoolExecutor.DiscardOldestPolicy() + ); + private final Lock lock = new ReentrantLock(); - private static final String GROUP_NAME = "admin"; + @Override public void init() throws RegistryException { if (!initFlag.compareAndSet(false, true)) { return; } - configuration = ConfigurationContextUtil.get(RegistryService.ConfigurationKey); - if (configuration == null ) { - throw new RegistryException("registry config instance is null"); - } nacosConf = ConfigService.getInstance().buildConfigInstance(NacosRegistryConfiguration.class); if (nacosConf == null) { log.info("nacos registry configuration is null"); @@ -73,12 +83,13 @@ public void init() throws RegistryException { private Properties buildProperties() { Properties properties = new Properties(); - properties.setProperty(PropertyKeyConst.SERVER_ADDR, configuration.getRegistryAddr()); - properties.setProperty(PropertyKeyConst.USERNAME, configuration.getEventMeshRegistryPluginUsername()); - properties.setProperty(PropertyKeyConst.PASSWORD, configuration.getEventMeshRegistryPluginPassword()); if (nacosConf == null) { return properties; } + properties.setProperty(PropertyKeyConst.SERVER_ADDR, nacosConf.getRegistryAddr()); + properties.setProperty(PropertyKeyConst.USERNAME, nacosConf.getEventMeshRegistryPluginUsername()); + properties.setProperty(PropertyKeyConst.PASSWORD, nacosConf.getEventMeshRegistryPluginPassword()); + String endpoint = nacosConf.getEndpoint(); if (Objects.nonNull(endpoint) && endpoint.contains(":")) { int index = endpoint.indexOf(":"); @@ -87,7 +98,8 @@ private Properties buildProperties() { } else { Optional.ofNullable(endpoint).ifPresent(value -> properties.put(PropertyKeyConst.ENDPOINT, endpoint)); String endpointPort = nacosConf.getEndpointPort(); - Optional.ofNullable(endpointPort).ifPresent(value -> properties.put(PropertyKeyConst.ENDPOINT_PORT, endpointPort)); + Optional.ofNullable(endpointPort).ifPresent(value -> properties.put(PropertyKeyConst.ENDPOINT_PORT, + endpointPort)); } String accessKey = nacosConf.getAccessKey(); Optional.ofNullable(accessKey).ifPresent(value -> properties.put(PropertyKeyConst.ACCESS_KEY, accessKey)); @@ -96,7 +108,8 @@ private Properties buildProperties() { String clusterName = nacosConf.getClusterName(); Optional.ofNullable(clusterName).ifPresent(value -> properties.put(PropertyKeyConst.CLUSTER_NAME, clusterName)); String logFileName = nacosConf.getLogFileName(); - Optional.ofNullable(logFileName).ifPresent(value -> properties.put(UtilAndComs.NACOS_NAMING_LOG_NAME, logFileName)); + Optional.ofNullable(logFileName).ifPresent(value -> properties.put(UtilAndComs.NACOS_NAMING_LOG_NAME, + logFileName)); String logLevel = nacosConf.getLogLevel(); Optional.ofNullable(logLevel).ifPresent(value -> properties.put(UtilAndComs.NACOS_NAMING_LOG_LEVEL, logLevel)); Integer pollingThreadCount = nacosConf.getPollingThreadCount(); @@ -122,19 +135,54 @@ public void subscribe(RegistryListener listener, String serviceName) { lock.lock(); try { ServiceInfo serviceInfo = ServiceInfo.fromKey(serviceName); - Map eventListenerMap = listeners.computeIfAbsent(serviceName, k -> new HashMap<>()); + Map eventListenerMap = listeners.computeIfAbsent(serviceName, + k -> new HashMap<>()); if (eventListenerMap.containsKey(listener)) { - log.warn("already use same listener subscribe service name {}" ,serviceName); + log.warn("already use same listener subscribe service name {}", serviceName); return; } - EventListener eventListener = listener::onChange; - List clusters ; + EventListener eventListener = new AbstractEventListener() { + @Override + public Executor getExecutor() { + return notifyExecutor; + } + + @Override + public void onEvent(Event event) { + if (!(event instanceof NamingEvent)) { + log.warn("received notify event type isn't not as expected"); + return; + } + try { + NamingEvent namingEvent = (NamingEvent) event; + List instances = namingEvent.getInstances(); + List list = new ArrayList<>(); + if (instances != null) { + for (Instance instance : instances) { + RegisterServerInfo info = new RegisterServerInfo(); + info.setAddress(instance.getIp() + ":" + instance.getPort()); + info.setMetadata(instance.getMetadata()); + info.setHealth(instance.isHealthy()); + info.setServiceName( + ServiceInfo.getKey(NamingUtils.getGroupedName(namingEvent.getServiceName(), + namingEvent.getGroupName()), + namingEvent.getClusters())); + list.add(info); + } + } + listener.onChange(new NotifyEvent(list)); + } catch (Exception e) { + log.warn(""); + } + } + }; + List clusters; if (serviceInfo.getClusters() == null || serviceInfo.getClusters().isEmpty()) { clusters = new ArrayList<>(); } else { clusters = Arrays.stream(serviceInfo.getClusters().split(",")).collect(Collectors.toList()); } - namingService.subscribe(serviceInfo.getName(),serviceInfo.getGroupName(), clusters, eventListener); + namingService.subscribe(serviceInfo.getName(), serviceInfo.getGroupName(), clusters, eventListener); eventListenerMap.put(listener, eventListener); } catch (Exception e) { log.error("subscribe service name {} fail", serviceName, e); @@ -152,7 +200,7 @@ public void unsubscribe(RegistryListener registryListener, String serviceName) { if (map == null) { return; } - List clusters ; + List clusters; if (serviceInfo.getClusters() == null || serviceInfo.getClusters().isEmpty()) { clusters = new ArrayList<>(); } else { @@ -177,14 +225,18 @@ public List selectInstances(QueryInstances queryInstances) { if (StringUtils.isNotBlank(serviceInfo.getClusters())) { clusters.addAll(Arrays.asList(serviceInfo.getClusters().split(","))); } - List instances = namingService.selectInstances(serviceInfo.getName(), serviceInfo.getGroupName(), clusters, queryInstances.isHealth()); + List instances = namingService.selectInstances(serviceInfo.getName(), + serviceInfo.getGroupName(), clusters, + queryInstances.isHealth()); if (instances != null) { instances.forEach(x -> { RegisterServerInfo instanceInfo = new RegisterServerInfo(); instanceInfo.setMetadata(x.getMetadata()); instanceInfo.setHealth(x.isHealthy()); instanceInfo.setAddress(x.getIp() + ":" + x.getPort()); - instanceInfo.setServiceName(ServiceInfo.getKey(NamingUtils.getGroupedName(x.getServiceName(), serviceInfo.getGroupName()), x.getClusterName())); + instanceInfo.setServiceName( + ServiceInfo.getKey(NamingUtils.getGroupedName(x.getServiceName(), + serviceInfo.getGroupName()), x.getClusterName())); list.add(instanceInfo); }); } @@ -228,7 +280,9 @@ public boolean unRegister(RegisterServerInfo eventMeshRegisterInfo) throws Regis return false; } ServiceInfo serviceInfo = ServiceInfo.fromKey(eventMeshRegisterInfo.getServiceName()); - namingService.deregisterInstance(serviceInfo.getName(), serviceInfo.getGroupName(), ipPort[0], Integer.parseInt(ipPort[1]), serviceInfo.getClusters()); + namingService.deregisterInstance(serviceInfo.getName(), serviceInfo.getGroupName(), ipPort[0], + Integer.parseInt(ipPort[1]), + serviceInfo.getClusters()); return true; } catch (Exception e) { log.error("unregister instance service {} fail", eventMeshRegisterInfo, e); diff --git a/eventmesh-registry/eventmesh-registry-nacos/src/main/java/org/apache/eventmesh/registry/nacos/NacosRegistryConfiguration.java b/eventmesh-registry/eventmesh-registry-nacos/src/main/java/org/apache/eventmesh/registry/nacos/NacosRegistryConfiguration.java index a8c473d275..ffb446edd4 100644 --- a/eventmesh-registry/eventmesh-registry-nacos/src/main/java/org/apache/eventmesh/registry/nacos/NacosRegistryConfiguration.java +++ b/eventmesh-registry/eventmesh-registry-nacos/src/main/java/org/apache/eventmesh/registry/nacos/NacosRegistryConfiguration.java @@ -21,39 +21,40 @@ import com.alibaba.nacos.client.naming.utils.UtilAndComs; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.eventmesh.common.config.CommonConfiguration; import org.apache.eventmesh.common.config.Config; -import org.apache.eventmesh.common.config.ConfigFiled; +import org.apache.eventmesh.common.config.ConfigField; @Data @NoArgsConstructor @Config(prefix = "eventMesh.registry.nacos") -public class NacosRegistryConfiguration { +public class NacosRegistryConfiguration extends CommonConfiguration { - @ConfigFiled(field = PropertyKeyConst.ENDPOINT) + @ConfigField(field = PropertyKeyConst.ENDPOINT) private String endpoint; - @ConfigFiled(field = PropertyKeyConst.ENDPOINT_PORT) + @ConfigField(field = PropertyKeyConst.ENDPOINT_PORT) private String endpointPort; - @ConfigFiled(field = PropertyKeyConst.ACCESS_KEY) + @ConfigField(field = PropertyKeyConst.ACCESS_KEY) private String accessKey; - @ConfigFiled(field = PropertyKeyConst.SECRET_KEY) + @ConfigField(field = PropertyKeyConst.SECRET_KEY) private String secretKey; - @ConfigFiled(field = PropertyKeyConst.CLUSTER_NAME) + @ConfigField(field = PropertyKeyConst.CLUSTER_NAME) private String clusterName; - @ConfigFiled(field = PropertyKeyConst.NAMESPACE) + @ConfigField(field = PropertyKeyConst.NAMESPACE) private String namespace; - @ConfigFiled(field = PropertyKeyConst.NAMING_POLLING_THREAD_COUNT) + @ConfigField(field = PropertyKeyConst.NAMING_POLLING_THREAD_COUNT) private Integer pollingThreadCount = Runtime.getRuntime().availableProcessors() / 2 + 1; - @ConfigFiled(field = UtilAndComs.NACOS_NAMING_LOG_NAME) + @ConfigField(field = UtilAndComs.NACOS_NAMING_LOG_NAME) private String logFileName; - @ConfigFiled(field = UtilAndComs.NACOS_NAMING_LOG_LEVEL) + @ConfigField(field = UtilAndComs.NACOS_NAMING_LOG_LEVEL) private String logLevel; } diff --git a/eventmesh-registry/eventmesh-registry-nacos/src/main/resources/META-INF/eventmesh/org.apache.eventmesh.registry.RegistryService b/eventmesh-registry/eventmesh-registry-nacos/src/main/resources/META-INF/eventmesh/org.apache.eventmesh.registry.RegistryService new file mode 100644 index 0000000000..3301d56e5e --- /dev/null +++ b/eventmesh-registry/eventmesh-registry-nacos/src/main/resources/META-INF/eventmesh/org.apache.eventmesh.registry.RegistryService @@ -0,0 +1,16 @@ +# 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. + +nacos=org.apache.eventmesh.registry.nacos.NacosDiscoveryService \ No newline at end of file