You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ya...@apache.org on 2020/03/09 16:15:01 UTC

[servicecomb-java-chassis] 12/19: [SCB-1691] Each ServiceRegistry uses an isolated EventBus

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

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

commit c79d5e122b2d526fe4227ecbfb5061f5d174859e
Author: yhs0092 <yh...@163.com>
AuthorDate: Tue Feb 11 21:16:33 2020 +0800

    [SCB-1691] Each ServiceRegistry uses an isolated EventBus
---
 .../servicecomb/serviceregistry/RegistryUtils.java | 38 +++++++++++++++++++---
 .../registry/ServiceRegistryFactory.java           |  8 +++++
 2 files changed, 42 insertions(+), 4 deletions(-)

diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
index 49f28e2..3f99eae 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
@@ -25,6 +25,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.regex.Matcher;
@@ -52,10 +53,13 @@ import org.apache.servicecomb.serviceregistry.registry.cache.MicroserviceCache;
 import org.apache.servicecomb.serviceregistry.registry.cache.MicroserviceCache.MicroserviceCacheStatus;
 import org.apache.servicecomb.serviceregistry.registry.cache.MicroserviceCacheKey;
 import org.apache.servicecomb.serviceregistry.swagger.SwaggerLoader;
+import org.apache.servicecomb.serviceregistry.task.MicroserviceInstanceRegisterTask;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.util.StringUtils;
 
 import com.google.common.base.Charsets;
+import com.google.common.eventbus.Subscribe;
 import com.google.common.hash.Hashing;
 import com.netflix.config.DynamicPropertyFactory;
 
@@ -115,14 +119,13 @@ public final class RegistryUtils {
 
   private static void initializeServiceRegistries(MicroserviceDefinition microserviceDefinition) {
     serviceRegistry =
-        ServiceRegistryFactory
-            .create(EventManager.eventBus, ServiceRegistryConfig.INSTANCE, microserviceDefinition);
+        ServiceRegistryFactory.create(ServiceRegistryConfig.INSTANCE, microserviceDefinition);
     EXTRA_SERVICE_REGISTRY_CONFIGS.forEach((k, v) -> {
-      ServiceRegistry serviceRegistry = ServiceRegistryFactory
-          .create(EventManager.getEventBus(), v, microserviceDefinition);
+      ServiceRegistry serviceRegistry = ServiceRegistryFactory.create(v, microserviceDefinition);
       addExtraServiceRegistry(serviceRegistry);
     });
     executeOnEachServiceRegistry(ServiceRegistry::init);
+    executeOnEachServiceRegistry(AfterServiceInstanceRegistryHandler::new);
   }
 
   public static void run() {
@@ -411,4 +414,31 @@ public final class RegistryUtils {
           "Illegal registry name, the format should be " + ServiceRegistry.REGISTRY_NAME_FORMAT);
     }
   }
+
+  public static class AfterServiceInstanceRegistryHandler {
+    private static AtomicInteger instanceRegisterCounter = new AtomicInteger(EXTRA_SERVICE_REGISTRIES.size() + 1);
+
+    private ServiceRegistry serviceRegistry;
+
+    AfterServiceInstanceRegistryHandler(ServiceRegistry serviceRegistry) {
+      this.serviceRegistry = serviceRegistry;
+      serviceRegistry.getEventBus().register(this);
+    }
+
+    @Subscribe
+    public void afterRegistryInstance(MicroserviceInstanceRegisterTask microserviceInstanceRegisterTask) {
+      LOGGER.info("receive MicroserviceInstanceRegisterTask event of [{}]", serviceRegistry.getName());
+      if (StringUtils.isEmpty(serviceRegistry.getMicroserviceInstance().getInstanceId())) {
+        return;
+      }
+
+      LOGGER.info("ServiceRegistry[{}] has completed instance registry", serviceRegistry.getName());
+      EventManager.unregister(this);
+
+      if (instanceRegisterCounter.decrementAndGet() > 0) {
+        return;
+      }
+      EventManager.getEventBus().post(microserviceInstanceRegisterTask);
+    }
+  }
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/ServiceRegistryFactory.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/ServiceRegistryFactory.java
index 0dab855..a672bbf 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/ServiceRegistryFactory.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/ServiceRegistryFactory.java
@@ -52,8 +52,16 @@ public final class ServiceRegistryFactory {
     return new LocalServiceRegistry(eventBus, serviceRegistryConfig, microserviceDefinition).localFile(localFile);
   }
 
+  public static ServiceRegistry create(ServiceRegistryConfig serviceRegistryConfig,
+      MicroserviceDefinition microserviceDefinition) {
+    return create(null, serviceRegistryConfig, microserviceDefinition);
+  }
+
   public static ServiceRegistry create(EventBus eventBus, ServiceRegistryConfig serviceRegistryConfig,
       MicroserviceDefinition microserviceDefinition) {
+    if (null == eventBus) {
+      eventBus = new SimpleEventBus();
+    }
     String localModeFile = System.getProperty(LocalServiceRegistryClientImpl.LOCAL_REGISTRY_FILE_KEY);
     if (!StringUtils.isEmpty(localModeFile)) {
       LOGGER.info(