This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new 4a1da760b [SCB-2813]Nacos implementation not properly handle instance 
change (#3982)
4a1da760b is described below

commit 4a1da760be13874b159871722f0b6262be8f69cf
Author: liubao68 <[email protected]>
AuthorDate: Mon Oct 23 10:59:16 2023 +0800

    [SCB-2813]Nacos implementation not properly handle instance change (#3982)
---
 .../common/rest/locator/ServicePathManager.java    |  9 ---
 demo/demo-nacos/consumer/pom.xml                   |  4 ++
 demo/demo-nacos/gateway/pom.xml                    |  4 ++
 demo/demo-nacos/pom.xml                            | 14 -----
 demo/demo-nacos/provider/pom.xml                   |  4 ++
 demo/demo-nacos/test-client/pom.xml                | 13 ++---
 .../servicecomb/samples/TestClientApplication.java |  6 +-
 .../test-client/src/main/resources/application.yml |  4 --
 .../org/apache/servicecomb/samples/NocasIT.java    | 36 ++++++------
 .../config/nacos/NacosDynamicPropertiesSource.java |  2 +-
 .../foundation/metrics/MetricsBootstrap.java       |  2 +-
 .../foundation/metrics/MetricsBootstrapConfig.java |  2 +-
 .../servicecomb/registry/DiscoveryManager.java     | 64 +++++++++++++---------
 .../discovery/StatefulDiscoveryInstance.java       | 10 ++--
 .../foundation/common/utils/SPIServiceUtils.java   |  5 +-
 .../registry/nacos/NacosConfiguration.java         | 12 +---
 .../servicecomb/registry/nacos/NacosDiscovery.java | 45 +++++++++++----
 .../registry/nacos/NacosDiscoveryInstance.java     |  8 ++-
 .../registry/nacos/NacosRegistration.java          | 24 ++------
 .../registry/nacos/NamingServiceManager.java       | 20 -------
 20 files changed, 135 insertions(+), 153 deletions(-)

diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/locator/ServicePathManager.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/locator/ServicePathManager.java
index 0876f432f..d59d7019b 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/locator/ServicePathManager.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/locator/ServicePathManager.java
@@ -27,16 +27,12 @@ import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.definition.SchemaMeta;
 import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.registry.definition.DefinitionConst;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 
 /**
  * 对静态路径和动态路径的operation进行预先处理,加速operation的查询定位
  */
 public class ServicePathManager {
-  private static final Logger LOGGER = 
LoggerFactory.getLogger(ServicePathManager.class);
-
   private static final String REST_PATH_MANAGER = "RestServicePathManager";
 
   protected MicroserviceMeta microserviceMeta;
@@ -71,11 +67,6 @@ public class ServicePathManager {
       operationMeta.putExtData(RestConst.SWAGGER_REST_OPERATION, 
restOperationMeta);
       addResource(restOperationMeta);
     }
-
-    LOGGER.info("add schema to service paths. {}:{}:{}.",
-        schemaMeta.getAppId(),
-        schemaMeta.getMicroserviceName(),
-        schemaMeta.getSchemaId());
   }
 
   public OperationLocator consumerLocateOperation(String path, String 
httpMethod) {
diff --git a/demo/demo-nacos/consumer/pom.xml b/demo/demo-nacos/consumer/pom.xml
index d1d46fbb5..5a223fdb8 100644
--- a/demo/demo-nacos/consumer/pom.xml
+++ b/demo/demo-nacos/consumer/pom.xml
@@ -34,6 +34,10 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>java-chassis-spring-boot-starter-standalone</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>registry-nacos</artifactId>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/demo/demo-nacos/gateway/pom.xml b/demo/demo-nacos/gateway/pom.xml
index 157bfa5d9..f1135e3ab 100644
--- a/demo/demo-nacos/gateway/pom.xml
+++ b/demo/demo-nacos/gateway/pom.xml
@@ -38,6 +38,10 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>edge-core</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>registry-nacos</artifactId>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
diff --git a/demo/demo-nacos/pom.xml b/demo/demo-nacos/pom.xml
index 5c82f13c0..20c38c7d8 100644
--- a/demo/demo-nacos/pom.xml
+++ b/demo/demo-nacos/pom.xml
@@ -33,20 +33,6 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>solution-basic</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.servicecomb</groupId>
-      <artifactId>registry-nacos</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.servicecomb</groupId>
-      <artifactId>servicestage-environment</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>org.apache.servicecomb</groupId>
-          <artifactId>registry-service-center</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
     <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-slf4j-impl</artifactId>
diff --git a/demo/demo-nacos/provider/pom.xml b/demo/demo-nacos/provider/pom.xml
index 9f930ab78..d80ae394c 100644
--- a/demo/demo-nacos/provider/pom.xml
+++ b/demo/demo-nacos/provider/pom.xml
@@ -38,6 +38,10 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>java-chassis-spring-boot-starter-standalone</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>registry-nacos</artifactId>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/demo/demo-nacos/test-client/pom.xml 
b/demo/demo-nacos/test-client/pom.xml
index 6015c22f7..1ad589a02 100644
--- a/demo/demo-nacos/test-client/pom.xml
+++ b/demo/demo-nacos/test-client/pom.xml
@@ -42,17 +42,12 @@
       <groupId>org.apache.servicecomb.demo</groupId>
       <artifactId>demo-schema</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>registry-local</artifactId>
+    </dependency>
   </dependencies>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-maven-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </build>
-
   <profiles>
     <profile>
       <id>docker</id>
diff --git 
a/demo/demo-nacos/test-client/src/main/java/org/apache/servicecomb/samples/TestClientApplication.java
 
b/demo/demo-nacos/test-client/src/main/java/org/apache/servicecomb/samples/TestClientApplication.java
index 10d62c6bb..26a2a491b 100644
--- 
a/demo/demo-nacos/test-client/src/main/java/org/apache/servicecomb/samples/TestClientApplication.java
+++ 
b/demo/demo-nacos/test-client/src/main/java/org/apache/servicecomb/samples/TestClientApplication.java
@@ -33,7 +33,7 @@ public class TestClientApplication {
     try {
       new 
SpringApplicationBuilder().web(WebApplicationType.NONE).sources(TestClientApplication.class).run(args);
 
-      CategorizedTestCaseRunner.runCategorizedTestCase("consumer");
+      run();
     } catch (Exception e) {
       TestMgr.failed("test case run failed", e);
       LOGGER.error("-------------- test failed -------------");
@@ -42,4 +42,8 @@ public class TestClientApplication {
     }
     TestMgr.summary();
   }
+
+  public static void run() throws Exception {
+    CategorizedTestCaseRunner.runCategorizedTestCase("consumer");
+  }
 }
diff --git a/demo/demo-nacos/test-client/src/main/resources/application.yml 
b/demo/demo-nacos/test-client/src/main/resources/application.yml
index 5caa50190..2e8b29356 100644
--- a/demo/demo-nacos/test-client/src/main/resources/application.yml
+++ b/demo/demo-nacos/test-client/src/main/resources/application.yml
@@ -20,10 +20,6 @@ servicecomb:
     application: demo-nacos
     name: test-client
     version: 0.0.1
-  registry:
-    nacos:
-      enabled: true
-      serverAddr: ${PAAS_CSE_NACOS_ENDPOINT:http://127.0.0.1:8848}
 
   rest:
     address: 0.0.0.0:9097 # should be same with server.port to use web 
container
diff --git 
a/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/InstancesChangeEventListener.java
 
b/demo/demo-nacos/test-client/src/test/java/org/apache/servicecomb/samples/NocasIT.java
similarity index 51%
rename from 
service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/InstancesChangeEventListener.java
rename to 
demo/demo-nacos/test-client/src/test/java/org/apache/servicecomb/samples/NocasIT.java
index 12c56fc91..bc7b5a6b9 100644
--- 
a/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/InstancesChangeEventListener.java
+++ 
b/demo/demo-nacos/test-client/src/test/java/org/apache/servicecomb/samples/NocasIT.java
@@ -15,29 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.registry.nacos;
+package org.apache.servicecomb.samples;
 
-import org.springframework.beans.factory.annotation.Autowired;
+import org.apache.servicecomb.demo.TestMgr;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
 
-import com.alibaba.nacos.client.naming.event.InstancesChangeEvent;
-import com.alibaba.nacos.common.notify.Event;
-import com.alibaba.nacos.common.notify.listener.Subscriber;
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = TestClientApplication.class)
+public class NocasIT {
 
-public class InstancesChangeEventListener extends 
Subscriber<InstancesChangeEvent> {
-  private final NacosDiscovery nacosDiscovery;
-
-  @Autowired
-  public InstancesChangeEventListener(NacosDiscovery nacosDiscovery) {
-    this.nacosDiscovery = nacosDiscovery;
+  @BeforeEach
+  public void setUp() {
+    TestMgr.errors().clear();
   }
 
-  @Override
-  public void onEvent(InstancesChangeEvent event) {
-    nacosDiscovery.onInstanceChangedEvent(event);
-  }
+  @Test
+  public void clientGetsNoError() throws Exception {
+    TestClientApplication.run();
 
-  @Override
-  public Class<? extends Event> subscribeType() {
-    return InstancesChangeEvent.class;
+    Assertions.assertTrue(TestMgr.errors().isEmpty());
   }
 }
diff --git 
a/dynamic-config/config-nacos/src/main/java/org/apache/servicecomb/config/nacos/NacosDynamicPropertiesSource.java
 
b/dynamic-config/config-nacos/src/main/java/org/apache/servicecomb/config/nacos/NacosDynamicPropertiesSource.java
index 1ee1750f9..a533d22bd 100644
--- 
a/dynamic-config/config-nacos/src/main/java/org/apache/servicecomb/config/nacos/NacosDynamicPropertiesSource.java
+++ 
b/dynamic-config/config-nacos/src/main/java/org/apache/servicecomb/config/nacos/NacosDynamicPropertiesSource.java
@@ -33,7 +33,7 @@ import org.springframework.core.env.MapPropertySource;
 import com.google.common.annotations.VisibleForTesting;
 
 public class NacosDynamicPropertiesSource implements DynamicPropertiesSource {
-  public static final String SOURCE_NAME = "kie";
+  public static final String SOURCE_NAME = "nacos";
 
   private static final Logger LOGGER = 
LoggerFactory.getLogger(NacosDynamicPropertiesSource.class);
 
diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java
index 977ed1b1a..5b014afe8 100644
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java
+++ 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java
@@ -80,7 +80,7 @@ public class MetricsBootstrap {
 
   protected void startPoll() {
     executorService.scheduleAtFixedRate(this::pollMeters,
-        0,
+        config.getMsPollInterval(),
         config.getMsPollInterval(),
         TimeUnit.MILLISECONDS);
   }
diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrapConfig.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrapConfig.java
index db7dcb495..53ab9a6d6 100644
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrapConfig.java
+++ 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrapConfig.java
@@ -26,7 +26,7 @@ public class MetricsBootstrapConfig {
   public static final String CONFIG_LATENCY_DISTRIBUTION_MIN_SCOPE_LEN =
       
"servicecomb.metrics.publisher.defaultLog.invocation.latencyDistribution.minScopeLength";
 
-  public static final int DEFAULT_METRICS_WINDOW_TIME = 60000;
+  public static final int DEFAULT_METRICS_WINDOW_TIME = 300_000;
 
   private long msPollInterval;
 
diff --git 
a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/DiscoveryManager.java
 
b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/DiscoveryManager.java
index 378010ff5..8280199dd 100644
--- 
a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/DiscoveryManager.java
+++ 
b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/DiscoveryManager.java
@@ -27,7 +27,6 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.foundation.common.cache.VersionedCache;
 import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import org.apache.servicecomb.registry.api.Discovery;
@@ -98,7 +97,7 @@ public class DiscoveryManager implements LifeCycle {
             changed = true;
           }
           // check ping status
-          if (System.currentTimeMillis() - instance.getPingSuccessTime() > 
180_000L) {
+          if (System.currentTimeMillis() - instance.getPingTime() > 180_000L) {
             boolean pingResult = ping.ping(instance);
             if (pingResult && instance.getPingStatus() != PingStatus.OK) {
               instance.setPingStatus(PingStatus.OK);
@@ -107,9 +106,7 @@ public class DiscoveryManager implements LifeCycle {
               instance.setPingStatus(PingStatus.FAIL);
               changed = true;
             }
-            if (pingResult) {
-              instance.setPingSuccessTime(System.currentTimeMillis());
-            }
+            instance.setPingTime(System.currentTimeMillis());
           }
           // check unused
           if (instance.getHistoryStatus() == HistoryStatus.HISTORY) {
@@ -118,11 +115,16 @@ public class DiscoveryManager implements LifeCycle {
                 instance.getIsolationStatus() == IsolationStatus.ISOLATED) {
               removed.computeIfAbsent(apps.getKey(), k -> new HashMap<>())
                   .computeIfAbsent(services.getKey(), k -> new 
ArrayList<>()).add(instance.getInstanceId());
+              LOGGER.info("Remove instance {}/{}/{}/{}/{}/{}/{}/{}",
+                  apps.getKey(), services.getKey(), instance.getRegistryName(),
+                  instance.getInstanceId(), instance.getHistoryStatus(),
+                  instance.getStatus(), instance.getPingStatus(), 
instance.getIsolationStatus());
+              changed = true;
             }
           }
         }
         if (changed) {
-          rebuildVersionCache(apps.getKey(), apps.getKey());
+          rebuildVersionCache(apps.getKey(), services.getKey());
         }
       }
     }
@@ -130,12 +132,7 @@ public class DiscoveryManager implements LifeCycle {
     for (Entry<String, Map<String, List<String>>> apps : removed.entrySet()) {
       for (Entry<String, List<String>> services : apps.getValue().entrySet()) {
         for (String instance : services.getValue()) {
-          StatefulDiscoveryInstance removedInstance =
-              
allInstances.get(apps.getKey()).get(services.getKey()).remove(instance);
-          LOGGER.info("Remove instance {}/{}/{}/{}/{}/{}/{}/{}",
-              apps.getKey(), services.getKey(), 
removedInstance.getRegistryName(),
-              instance, removedInstance.getHistoryStatus(),
-              removedInstance.getStatus(), removedInstance.getPingStatus(), 
removedInstance.getIsolationStatus());
+          
allInstances.get(apps.getKey()).get(services.getKey()).remove(instance);
         }
       }
     }
@@ -152,27 +149,28 @@ public class DiscoveryManager implements LifeCycle {
         new ConcurrentHashMapEx<>()).computeIfAbsent(serviceName, key -> new 
ConcurrentHashMapEx<>());
 
     for (StatefulDiscoveryInstance statefulInstance : 
statefulInstances.values()) {
-      if (StringUtils.isEmpty(registryName)) {
-        statefulInstance.setHistoryStatus(HistoryStatus.HISTORY);
-        continue;
-      }
-      if (registryName.equals(statefulInstance.getRegistryName())) {
-        statefulInstance.setHistoryStatus(HistoryStatus.HISTORY);
+      if (registryName == null || 
registryName.equals(statefulInstance.getRegistryName())) {
+        if (!instances.contains(statefulInstance)) {
+          statefulInstance.setPingTime(0);
+          statefulInstance.setHistoryStatus(HistoryStatus.HISTORY);
+        }
       }
     }
 
     for (DiscoveryInstance instance : instances) {
-      StatefulDiscoveryInstance target = 
statefulInstances.get(instance.getInstanceId());
-      if (target == null) {
-        statefulInstances.put(instance.getInstanceId(), new 
StatefulDiscoveryInstance(instance));
+      StatefulDiscoveryInstance target = new 
StatefulDiscoveryInstance(instance);
+      StatefulDiscoveryInstance origin = 
statefulInstances.get(instance.getInstanceId());
+      if (origin == null) {
+        statefulInstances.put(instance.getInstanceId(), target);
         continue;
       }
-      target.setHistoryStatus(HistoryStatus.CURRENT);
-      target.setMicroserviceInstanceStatus(instance.getStatus());
+      target.setPingTime(origin.getPingTime());
+      target.setPingStatus(origin.getPingStatus());
+      target.setIsolateDuration(origin.getIsolateDuration());
+      target.setIsolationStatus(origin.getIsolationStatus());
+      statefulInstances.put(instance.getInstanceId(), target);
     }
 
-    rebuildVersionCache(application, serviceName);
-
     StringBuilder instanceInfo = new StringBuilder();
     for (DiscoveryInstance instance : instances) {
       instanceInfo.append("{")
@@ -184,6 +182,8 @@ public class DiscoveryManager implements LifeCycle {
     }
     LOGGER.info("Applying new instance list for {}/{}/{}. Endpoints {}",
         application, serviceName, instances.size(), instanceInfo);
+
+    rebuildVersionCache(application, serviceName);
   }
 
   public void onInstanceIsolated(StatefulDiscoveryInstance instance, long 
isolateDuration) {
@@ -233,6 +233,20 @@ public class DiscoveryManager implements LifeCycle {
         result.add(instance);
       }
     }
+    StringBuilder instanceInfo = new StringBuilder();
+    for (StatefulDiscoveryInstance instance : result) {
+      instanceInfo.append("{")
+          .append(instance.getInstanceId()).append(",")
+          .append(instance.getHistoryStatus()).append(",")
+          .append(instance.getStatus()).append(",")
+          .append(instance.getPingStatus()).append(",")
+          .append(instance.getIsolationStatus()).append(",")
+          .append(instance.getEndpoints()).append(",")
+          .append(instance.getRegistryName())
+          .append("}");
+    }
+    LOGGER.info("Rebuild cached instance list for {}/{}/{}. Endpoints {}",
+        application, serviceName, result.size(), instanceInfo);
     return new VersionedCache()
         .name(application + ":" + serviceName)
         .autoCacheVersion()
diff --git 
a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/discovery/StatefulDiscoveryInstance.java
 
b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/discovery/StatefulDiscoveryInstance.java
index 58c50e70b..fbcb16143 100644
--- 
a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/discovery/StatefulDiscoveryInstance.java
+++ 
b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/discovery/StatefulDiscoveryInstance.java
@@ -56,7 +56,7 @@ public class StatefulDiscoveryInstance extends 
AbstractDiscoveryInstance {
 
   private PingStatus pingStatus = PingStatus.UNKNOWN;
 
-  private long pingSuccessTime;
+  private long pingTime = 0;
 
   private HistoryStatus historyStatus = HistoryStatus.CURRENT;
 
@@ -114,12 +114,12 @@ public class StatefulDiscoveryInstance extends 
AbstractDiscoveryInstance {
     this.isolateDuration = isolateDuration;
   }
 
-  public long getPingSuccessTime() {
-    return pingSuccessTime;
+  public long getPingTime() {
+    return pingTime;
   }
 
-  public void setPingSuccessTime(long pingSuccessTime) {
-    this.pingSuccessTime = pingSuccessTime;
+  public void setPingTime(long pingTime) {
+    this.pingTime = pingTime;
   }
 
   @Override
diff --git 
a/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/common/utils/SPIServiceUtils.java
 
b/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/common/utils/SPIServiceUtils.java
index ea8a0bc12..abd2dcab3 100644
--- 
a/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/common/utils/SPIServiceUtils.java
+++ 
b/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/common/utils/SPIServiceUtils.java
@@ -76,11 +76,12 @@ public final class SPIServiceUtils {
         .map(Entry::getValue)
         .collect(Collectors.toList());
 
-    LOGGER.info("Found SPI service {}, count={}.", serviceType.getName(), 
services.size());
+    StringBuilder info = new StringBuilder();
     for (int idx = 0; idx < services.size(); idx++) {
       T service = services.get(idx);
-      LOGGER.info("  {}. {}.", idx, service.getClass().getName());
+      
info.append("{").append(idx).append(",").append(service.getClass().getSimpleName()).append("}");
     }
+    LOGGER.info("Found SPI service {}, services={}.", 
serviceType.getSimpleName(), info);
 
     return services;
   }
diff --git 
a/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosConfiguration.java
 
b/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosConfiguration.java
index e1cd555a9..2a1adbaae 100644
--- 
a/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosConfiguration.java
+++ 
b/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosConfiguration.java
@@ -36,10 +36,8 @@ public class NacosConfiguration {
   public NacosRegistration nacosRegistration(
       DataCenterProperties dataCenterProperties,
       @Qualifier("nacosDiscoveryProperties") NacosDiscoveryProperties 
nacosDiscoveryProperties,
-      Environment environment,
-      @Qualifier("instancesChangeEventListener") InstancesChangeEventListener 
instancesChangeEventListener) {
-    return new NacosRegistration(dataCenterProperties, 
nacosDiscoveryProperties, environment,
-        instancesChangeEventListener);
+      Environment environment) {
+    return new NacosRegistration(dataCenterProperties, 
nacosDiscoveryProperties, environment);
   }
 
   @Bean
@@ -47,10 +45,4 @@ public class NacosConfiguration {
       @Qualifier("nacosDiscoveryProperties") NacosDiscoveryProperties 
nacosDiscoveryProperties) {
     return new NacosDiscovery(nacosDiscoveryProperties);
   }
-
-  @Bean
-  public InstancesChangeEventListener instancesChangeEventListener(
-      @Qualifier("nacosDiscovery") NacosDiscovery nacosDiscovery) {
-    return new InstancesChangeEventListener(nacosDiscovery);
-  }
 }
diff --git 
a/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosDiscovery.java
 
b/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosDiscovery.java
index a60634238..87d03fa46 100644
--- 
a/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosDiscovery.java
+++ 
b/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosDiscovery.java
@@ -19,21 +19,27 @@ package org.apache.servicecomb.registry.nacos;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.servicecomb.registry.api.Discovery;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.util.CollectionUtils;
 
-import com.alibaba.nacos.api.exception.NacosException;
 import com.alibaba.nacos.api.naming.NamingService;
+import com.alibaba.nacos.api.naming.listener.NamingEvent;
 import com.alibaba.nacos.api.naming.pojo.Instance;
-import com.alibaba.nacos.client.naming.event.InstancesChangeEvent;
 
 public class NacosDiscovery implements Discovery<NacosDiscoveryInstance> {
   public static final String NACOS_DISCOVERY_ENABLED = 
"servicecomb.registry.nacos.%s.%s.enabled";
 
+  private static final Map<String, Map<String, AtomicBoolean>> SUBSCRIBES = 
new HashMap<>();
+
+  private final Object lock = new Object();
+
   private final NacosDiscoveryProperties nacosDiscoveryProperties;
 
   private Environment environment;
@@ -48,6 +54,7 @@ public class NacosDiscovery implements 
Discovery<NacosDiscoveryInstance> {
   }
 
   @Autowired
+  @SuppressWarnings("unused")
   public void setEnvironment(Environment environment) {
     this.environment = environment;
   }
@@ -66,20 +73,39 @@ public class NacosDiscovery implements 
Discovery<NacosDiscoveryInstance> {
   @Override
   public List<NacosDiscoveryInstance> findServiceInstances(String application, 
String serviceName) {
     try {
+      AtomicBoolean result = SUBSCRIBES.computeIfAbsent(application,
+          k -> new HashMap<>()).computeIfAbsent(serviceName, k -> new 
AtomicBoolean(true));
+      if (result.get()) {
+        synchronized (lock) {
+          if (result.get()) {
+            namingService.subscribe(serviceName, application, (event) -> {
+              if (result.getAndSet(false)) {
+                // ignore the first event.
+                return;
+              }
+              if (event instanceof NamingEvent) {
+                this.instanceChangedListener.onInstanceChanged(name(), 
application, serviceName,
+                    convertServiceInstanceList(((NamingEvent) 
event).getInstances(), application, serviceName));
+              }
+            });
+          }
+        }
+      }
       List<Instance> instances = namingService.getAllInstances(serviceName, 
application, true);
-      return convertServiceInstanceList(instances, application);
-    } catch (NacosException e) {
-      throw new IllegalStateException("updateMicroserviceInstanceStatus 
process is interrupted.");
+      return convertServiceInstanceList(instances, application, serviceName);
+    } catch (Exception e) {
+      throw new IllegalStateException(e);
     }
   }
 
-  private List<NacosDiscoveryInstance> 
convertServiceInstanceList(List<Instance> instances, String application) {
+  private List<NacosDiscoveryInstance> convertServiceInstanceList(
+      List<Instance> instances, String application, String serviceName) {
     if (CollectionUtils.isEmpty(instances)) {
       return Collections.emptyList();
     }
     List<NacosDiscoveryInstance> result = new ArrayList<>();
     for (Instance instance : instances) {
-      result.add(new NacosDiscoveryInstance(instance, application, 
environment));
+      result.add(new NacosDiscoveryInstance(instance, application, 
serviceName, environment));
     }
     return result;
   }
@@ -89,11 +115,6 @@ public class NacosDiscovery implements 
Discovery<NacosDiscoveryInstance> {
     this.instanceChangedListener = instanceChangedListener;
   }
 
-  public void onInstanceChangedEvent(InstancesChangeEvent event) {
-    this.instanceChangedListener.onInstanceChanged(name(), 
event.getGroupName(), event.getServiceName(),
-        convertServiceInstanceList(event.getHosts(), event.getGroupName()));
-  }
-
   @Override
   public void init() {
     namingService = NamingServiceManager.buildNamingService(environment, 
nacosDiscoveryProperties);
diff --git 
a/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosDiscoveryInstance.java
 
b/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosDiscoveryInstance.java
index bdcf70af2..7104498ed 100644
--- 
a/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosDiscoveryInstance.java
+++ 
b/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosDiscoveryInstance.java
@@ -37,17 +37,20 @@ public class NacosDiscoveryInstance extends 
AbstractDiscoveryInstance {
 
   private final String application;
 
+  private final String serviceName;
+
   private final Environment environment;
 
   private final Map<String, String> schemas;
 
   private final List<String> endpoints;
 
-  public NacosDiscoveryInstance(Instance instance, String application,
+  public NacosDiscoveryInstance(Instance instance, String application, String 
serviceName,
       Environment environment) {
     this.instance = instance;
     this.environment = environment;
     this.application = application;
+    this.serviceName = serviceName;
     this.endpoints = readEndpoints(instance);
     this.schemas = readSchemas(instance);
   }
@@ -74,7 +77,8 @@ public class NacosDiscoveryInstance extends 
AbstractDiscoveryInstance {
 
   @Override
   public String getServiceName() {
-    return instance.getServiceName();
+    // nacos instance service name may contain group and `@` annotations
+    return this.serviceName;
   }
 
   @Override
diff --git 
a/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosRegistration.java
 
b/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosRegistration.java
index 79cd58411..97d016a97 100644
--- 
a/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosRegistration.java
+++ 
b/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NacosRegistration.java
@@ -32,18 +32,14 @@ import org.springframework.core.env.Environment;
 import org.springframework.util.CollectionUtils;
 
 import com.alibaba.nacos.api.exception.NacosException;
-import com.alibaba.nacos.api.naming.NamingMaintainService;
 import com.alibaba.nacos.api.naming.NamingService;
 import com.alibaba.nacos.api.naming.pojo.Instance;
-import com.alibaba.nacos.common.notify.NotifyCenter;
 
 public class NacosRegistration implements 
Registration<NacosRegistrationInstance> {
   private final NacosDiscoveryProperties nacosDiscoveryProperties;
 
   private final Environment environment;
 
-  private final InstancesChangeEventListener instancesChangeEventListener;
-
   private final String instanceId;
 
   private final DataCenterProperties dataCenterProperties;
@@ -54,16 +50,13 @@ public class NacosRegistration implements 
Registration<NacosRegistrationInstance
 
   private NamingService namingService;
 
-  private NamingMaintainService namingMaintainService;
-
   @Autowired
   public NacosRegistration(DataCenterProperties dataCenterProperties, 
NacosDiscoveryProperties nacosDiscoveryProperties,
-      Environment environment, InstancesChangeEventListener 
instancesChangeEventListener) {
+      Environment environment) {
     this.instanceId = buildInstanceId();
     this.dataCenterProperties = dataCenterProperties;
     this.nacosDiscoveryProperties = nacosDiscoveryProperties;
     this.environment = environment;
-    this.instancesChangeEventListener = instancesChangeEventListener;
   }
 
   @Override
@@ -75,8 +68,6 @@ public class NacosRegistration implements 
Registration<NacosRegistrationInstance
         environment);
 
     namingService = NamingServiceManager.buildNamingService(environment, 
nacosDiscoveryProperties);
-    namingMaintainService = 
NamingServiceManager.buildNamingMaintainService(environment, 
nacosDiscoveryProperties);
-    NotifyCenter.registerSubscriber(instancesChangeEventListener);
   }
 
   @Override
@@ -87,7 +78,7 @@ public class NacosRegistration implements 
Registration<NacosRegistrationInstance
       
namingService.registerInstance(nacosRegistrationInstance.getServiceName(),
           nacosRegistrationInstance.getApplication(), instance);
     } catch (NacosException e) {
-      throw new IllegalStateException("registry process is interrupted.");
+      throw new IllegalStateException(e);
     }
   }
 
@@ -139,14 +130,9 @@ public class NacosRegistration implements 
Registration<NacosRegistrationInstance
 
   @Override
   public boolean updateMicroserviceInstanceStatus(MicroserviceInstanceStatus 
status) {
-    try {
-      instance.setEnabled(MicroserviceInstanceStatus.DOWN != status);
-      
namingMaintainService.updateInstance(nacosRegistrationInstance.getServiceName(),
-          nacosRegistrationInstance.getApplication(), instance);
-      return true;
-    } catch (NacosException e) {
-      throw new IllegalStateException(e);
-    }
+    // Do not support Nacos update status now. Because update status will fail
+    // due to some unknown reasons(Maybe different constrains in register and 
maintain api).
+    return true;
   }
 
   @Override
diff --git 
a/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NamingServiceManager.java
 
b/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NamingServiceManager.java
index 2e68213b5..67f5ee9e9 100644
--- 
a/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NamingServiceManager.java
+++ 
b/service-registry/registry-nacos/src/main/java/org/apache/servicecomb/registry/nacos/NamingServiceManager.java
@@ -24,16 +24,12 @@ import org.apache.servicecomb.config.BootStrapProperties;
 import org.springframework.core.env.Environment;
 
 import com.alibaba.nacos.api.exception.NacosException;
-import com.alibaba.nacos.api.naming.NamingMaintainService;
 import com.alibaba.nacos.api.naming.NamingService;
-import com.alibaba.nacos.client.naming.NacosNamingMaintainService;
 import com.alibaba.nacos.client.naming.NacosNamingService;
 
 public class NamingServiceManager {
   private static volatile NamingService namingService;
 
-  private static volatile NamingMaintainService namingMaintainService;
-
   public static NamingService buildNamingService(Environment environment, 
NacosDiscoveryProperties properties) {
     if (Objects.isNull(namingService)) {
       synchronized (NamingServiceManager.class) {
@@ -49,22 +45,6 @@ public class NamingServiceManager {
     return namingService;
   }
 
-  public static NamingMaintainService buildNamingMaintainService(Environment 
environment,
-      NacosDiscoveryProperties properties) {
-    if (Objects.isNull(namingMaintainService)) {
-      synchronized (NamingServiceManager.class) {
-        if (Objects.isNull(namingMaintainService)) {
-          try {
-            namingMaintainService = new 
NacosNamingMaintainService(getProperties(environment, properties));
-          } catch (NacosException e) {
-            throw new IllegalStateException("build namingMaintainService 
failed.");
-          }
-        }
-      }
-    }
-    return namingMaintainService;
-  }
-
   private static Properties getProperties(Environment environment,
       NacosDiscoveryProperties nacosDiscoveryProperties) {
     Properties properties = new Properties();


Reply via email to