All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.scalecube.seed.SeedRunner Maven / Gradle / Ivy

package io.scalecube.seed;

import io.scalecube.config.ConfigRegistry;
import io.scalecube.config.ConfigRegistrySettings;
import io.scalecube.config.audit.Slf4JConfigEventListener;
import io.scalecube.config.source.ClassPathConfigSource;
import io.scalecube.config.source.SystemEnvironmentConfigSource;
import io.scalecube.config.source.SystemPropertiesConfigSource;
import io.scalecube.services.Microservices;
import io.scalecube.services.transport.api.Address;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/** Seed Node server. */
public class SeedRunner {

  private static final Logger LOGGER = LoggerFactory.getLogger(SeedRunner.class);
  private static final String DECORATOR =
      "#######################################################################";

  /**
   * Main runner.
   *
   * @param args program arguments
   * @throws InterruptedException exception thrown
   */
  public static void main(String[] args) throws InterruptedException {
    LOGGER.info("Reading seed configuration");
    ConfigRegistry configRegistry = ConfigBootstrap.configRegistry();

    Config config =
        configRegistry
            .objectProperty("io.scalecube.seed", Config.class)
            .value()
            .orElseThrow(() -> new IllegalStateException("Couldn't load config"));

    LOGGER.info(DECORATOR);
    LOGGER.info("Starting Seed with {}", config);
    LOGGER.info(DECORATOR);

    Microservices.builder()
        .discovery(
            options ->
                options
                    .seeds(
                        Arrays.stream(config.seedAddresses())
                            .map(address -> Address.create(address.host(), address.port()))
                            .toArray(Address[]::new))
                    .port(config.discoveryPort)
                    .memberHost(config.memberHost)
                    .memberPort(config.memberPort))
        .startAwait();

    Thread.currentThread().join();
  }

  public static class Config {

    Integer discoveryPort;
    List seeds;
    String memberHost;
    Integer memberPort;

    /**
     * Returns seeds as an {@link Address}'s array.
     *
     * @return {@link Address}'s array
     */
    Address[] seedAddresses() {
      return Optional.ofNullable(seeds)
          .map(
              seeds ->
                  seeds
                      .stream()
                      .filter(Objects::nonNull)
                      .filter(s -> !s.isEmpty())
                      .map(Address::from)
                      .toArray(Address[]::new))
          .orElse(new Address[0]);
    }

    @Override
    public String toString() {
      final StringBuilder sb = new StringBuilder("Config{");
      sb.append("discoveryPort=").append(discoveryPort);
      sb.append(", seeds=").append(seeds);
      sb.append(", memberHost=").append(memberHost);
      sb.append(", memberPort=").append(memberPort);
      sb.append('}');
      return sb.toString();
    }
  }

  static class ConfigBootstrap {

    private static final Pattern CONFIG_FILE_PATTERN =
        Pattern.compile("(.*)config(.*)?\\.properties");
    private static final Predicate CONFIG_PATH_PREDICATE =
        path -> CONFIG_FILE_PATTERN.matcher(path.getFileName().toString()).matches();

    /**
     * ConfigRegistry method factory.
     *
     * @return configRegistry
     */
    static ConfigRegistry configRegistry() {
      return ConfigRegistry.create(
          ConfigRegistrySettings.builder()
              .addListener(new Slf4JConfigEventListener())
              .addLastSource("sys_prop", new SystemPropertiesConfigSource())
              .addLastSource("env_var", new SystemEnvironmentConfigSource())
              .addLastSource("cp", new ClassPathConfigSource(CONFIG_PATH_PREDICATE))
              .jmxEnabled(false)
              .build());
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy