[SCB-2799]change registry model definition
diff --git a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/BootStrapProperties.java b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/BootStrapProperties.java
index 2e88297..7c18f58 100644
--- a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/BootStrapProperties.java
+++ b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/BootStrapProperties.java
@@ -82,6 +82,8 @@
 
   public static final String CONFIG_SERVICE_PATHS = "servicecomb.service.paths";
 
+  public static final String CONFIG_SERVICE_ALIAS = "servicecomb.service.alias";
+
   // service instance definition keys of new version
   public static final String CONFIG_SERVICE_INSTANCE_PROPERTIES = "servicecomb.instance.properties";
 
diff --git a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/RegistrationManager.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/RegistrationManager.java
index be59114..ecdee35 100644
--- a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/RegistrationManager.java
+++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/RegistrationManager.java
@@ -28,7 +28,6 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import com.google.common.annotations.VisibleForTesting;
 import org.apache.http.client.utils.URIBuilder;
 import org.apache.servicecomb.foundation.common.event.EnableExceptionPropagation;
 import org.apache.servicecomb.foundation.common.event.EventManager;
@@ -42,6 +41,7 @@
 import org.apache.servicecomb.registry.api.event.MicroserviceInstanceRegisteredEvent;
 import org.apache.servicecomb.registry.api.registry.BasePath;
 import org.apache.servicecomb.registry.api.registry.Microservice;
+import org.apache.servicecomb.registry.api.registry.MicroserviceFactory;
 import org.apache.servicecomb.registry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.registry.api.registry.MicroserviceInstanceStatus;
 import org.apache.servicecomb.registry.consumer.MicroserviceManager;
@@ -50,7 +50,9 @@
 import org.apache.servicecomb.registry.swagger.SwaggerLoader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.core.env.Environment;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.eventbus.Subscribe;
 import com.netflix.config.DynamicPropertyFactory;
 
@@ -70,14 +72,17 @@
 
   private final List<Registration> registrationList = new ArrayList<>();
 
-  private Registration primary;
+  private Microservice microservice;
+
+  private final MicroserviceFactory microserviceFactory = new MicroserviceFactory();
+
+  private Environment environment;
 
   private RegistrationManager() {
     SPIServiceUtils.getOrLoadSortedService(Registration.class)
         .stream()
         .filter((SPIEnabled::enabled))
         .forEach(registrationList::add);
-    initPrimary();
   }
 
   @VisibleForTesting
@@ -86,24 +91,15 @@
   }
 
   public MicroserviceInstance getMicroserviceInstance() {
-    return primary.getMicroserviceInstance();
+    return this.microservice.getInstance();
   }
 
   public Microservice getMicroservice() {
-    assertPrimaryNotNull();
-    return primary.getMicroservice();
-  }
-
-  private void assertPrimaryNotNull() {
-    if (primary == null) {
-      throw new NullPointerException("At least one Registration implementation configured. Missed"
-          + " to include dependency ? e.g. <artifactId>registry-service-center</artifactId>");
-    }
+    return this.microservice;
   }
 
   public String getAppId() {
-    assertPrimaryNotNull();
-    return primary.getAppId();
+    return microservice.getAppId();
   }
 
   public SwaggerLoader getSwaggerLoader() {
@@ -140,22 +136,15 @@
     registrationList.forEach(LifeCycle::run);
   }
 
-  public void init() {
+  public void init(Environment environment) {
+    this.environment = environment;
+    this.microservice = this.microserviceFactory.create(this.environment);
+
     BeanUtils.addBeans(Registration.class, registrationList);
 
-    initPrimary();
     registrationList.forEach(LifeCycle::init);
   }
 
-  private void initPrimary() {
-    if (registrationList.isEmpty()) {
-      LOGGER.warn("No registration is enabled. Fix this if only in unit tests.");
-      primary = null;
-    } else {
-      primary = registrationList.get(0);
-    }
-  }
-
   /**
    * <p>
    * Register a third party service if not registered before, and set it's instances into
@@ -308,7 +297,6 @@
           .getHostAddress();
     }
 
-
     return new IpPort(publicAddressSetting, publishPort);
   }
 
diff --git a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/registry/Microservice.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/registry/Microservice.java
index bd77191..8241d23 100644
--- a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/registry/Microservice.java
+++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/registry/Microservice.java
@@ -61,6 +61,10 @@
 
   private String description;
 
+  @Deprecated
+  /**
+   * No meaning in real world.
+   */
   private String level;
 
   private List<String> schemas = new ArrayList<>();
@@ -68,6 +72,10 @@
   @JsonIgnore
   private final Map<String, String> schemaMap = new HashMap<>();
 
+  @Deprecated
+  /**
+   * Can use registered Open API information instead.
+   */
   private List<BasePath> paths = new ArrayList<>();
 
   private MicroserviceStatus status = MicroserviceStatus.UP;
@@ -164,10 +172,12 @@
     this.description = description;
   }
 
+  @Deprecated
   public String getLevel() {
     return level;
   }
 
+  @Deprecated
   public void setLevel(String level) {
     this.level = level;
   }
@@ -211,10 +221,12 @@
     return sb.toString();
   }
 
+  @Deprecated
   public List<BasePath> getPaths() {
     return paths;
   }
 
+  @Deprecated
   public void setPaths(List<BasePath> paths) {
     this.paths = paths;
   }
diff --git a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/registry/MicroserviceFactory.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/registry/MicroserviceFactory.java
index 16b7147..e2276f3 100644
--- a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/registry/MicroserviceFactory.java
+++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/registry/MicroserviceFactory.java
@@ -16,72 +16,47 @@
  */
 package org.apache.servicecomb.registry.api.registry;
 
-import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.APP_MAPPING;
 import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.CONFIG_DEFAULT_REGISTER_BY;
 import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.CONFIG_FRAMEWORK_DEFAULT_NAME;
-import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.SERVICE_MAPPING;
-import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.VERSION_MAPPING;
 
 import java.util.Map;
 
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.EnvironmentConfiguration;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.config.BootStrapProperties;
-import org.apache.servicecomb.config.ConfigUtil;
-import org.apache.servicecomb.registry.config.ConfigurePropertyUtils;
-import org.apache.servicecomb.registry.config.MicroservicePropertiesLoader;
 import org.apache.servicecomb.foundation.common.Version;
+import org.apache.servicecomb.registry.config.MicroservicePropertiesLoader;
+import org.springframework.core.env.Environment;
 
 public class MicroserviceFactory {
-  public Microservice create() {
-    return create(ConfigUtil.createLocalConfig());
-  }
-
-  public Microservice create(Configuration configuration) {
-    Microservice microservice = createMicroserviceFromConfiguration(configuration);
-    microservice.setInstance(MicroserviceInstance.createFromDefinition(configuration));
+  public Microservice create(Environment environment) {
+    Microservice microservice = createMicroserviceFromConfiguration(environment);
+    microservice.setInstance(MicroserviceInstance.createFromDefinition(environment));
     return microservice;
   }
 
-  private Microservice createMicroserviceFromConfiguration(Configuration configuration) {
+  private Microservice createMicroserviceFromConfiguration(Environment environment) {
     Microservice microservice = new Microservice();
 
-    EnvironmentConfiguration envConfig = new EnvironmentConfiguration();
-    if (!StringUtils.isEmpty(envConfig.getString(APP_MAPPING)) &&
-        !StringUtils.isEmpty(envConfig.getString(envConfig.getString(APP_MAPPING)))) {
-      microservice.setAppId(envConfig.getString(envConfig.getString(APP_MAPPING)));
-    } else {
-      microservice.setAppId(BootStrapProperties.readApplication(configuration));
-    }
-    if (!StringUtils.isEmpty(envConfig.getString(SERVICE_MAPPING)) &&
-        !StringUtils.isEmpty(envConfig.getString(envConfig.getString(SERVICE_MAPPING)))) {
-      microservice.setServiceName(envConfig.getString(envConfig.getString(SERVICE_MAPPING)));
-    } else {
-      microservice.setServiceName(BootStrapProperties.readServiceName(configuration));
-    }
-    String version;
-    if (!StringUtils.isEmpty(envConfig.getString(VERSION_MAPPING)) &&
-        !StringUtils.isEmpty(envConfig.getString(envConfig.getString(VERSION_MAPPING)))) {
-      version = envConfig.getString(envConfig.getString(VERSION_MAPPING));
-    } else {
-      version = BootStrapProperties.readServiceVersion(configuration);
-    }
+    microservice.setEnvironment(environment.getProperty(BootStrapProperties.CONFIG_SERVICE_ENVIRONMENT,
+        BootStrapProperties.DEFAULT_MICROSERVICE_ENVIRONMENT));
+    microservice.setAppId(environment.getProperty(BootStrapProperties.CONFIG_SERVICE_APPLICATION,
+        BootStrapProperties.DEFAULT_APPLICATION));
+    microservice.setServiceName(environment.getProperty(BootStrapProperties.CONFIG_SERVICE_NAME,
+        BootStrapProperties.DEFAULT_MICROSERVICE_NAME));
+    microservice.setVersion(environment.getProperty(BootStrapProperties.CONFIG_SERVICE_VERSION,
+        BootStrapProperties.DEFAULT_MICROSERVICE_VERSION));
     // just check version format
-    new Version(version);
-    microservice.setVersion(version);
+    new Version(microservice.getVersion());
 
-    microservice.setDescription(BootStrapProperties.readServiceDescription(configuration));
-    microservice.setLevel(BootStrapProperties.readServiceRole(configuration));
-    microservice.setPaths(ConfigurePropertyUtils.getMicroservicePaths(configuration));
-    Map<String, String> propertiesMap = MicroservicePropertiesLoader.INSTANCE.loadProperties(configuration);
+    microservice.setDescription(environment.getProperty(BootStrapProperties.CONFIG_SERVICE_DESCRIPTION));
+    Map<String, String> propertiesMap = MicroservicePropertiesLoader.INSTANCE.loadProperties(environment);
     microservice.setProperties(propertiesMap);
-    microservice.setEnvironment(BootStrapProperties.readServiceEnvironment(configuration));
 
     // set alias name when allow cross app
     if (microservice.allowCrossApp()) {
       microservice.setAlias(Microservice.generateAbsoluteMicroserviceName(microservice.getAppId(),
           microservice.getServiceName()));
+    } else {
+      microservice.setAlias(environment.getProperty(BootStrapProperties.CONFIG_SERVICE_ALIAS));
     }
 
     microservice.setFramework(createFramework());
diff --git a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/registry/MicroserviceInstance.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/registry/MicroserviceInstance.java
index 954fe04..1807597 100644
--- a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/registry/MicroserviceInstance.java
+++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/registry/MicroserviceInstance.java
@@ -22,13 +22,11 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.configuration.Configuration;
 import org.apache.servicecomb.config.BootStrapProperties;
 import org.apache.servicecomb.registry.config.InstancePropertiesLoader;
-import org.apache.servicecomb.registry.definition.DefinitionConst;
+import org.springframework.core.env.Environment;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.netflix.config.DynamicPropertyFactory;
 
 /**
  * Created by   on 2016/12/5.
@@ -51,12 +49,24 @@
 
   private Map<String, String> properties = new HashMap<>(); // reserved key list: region|az|stage|group
 
+  @Deprecated
+  /**
+   * This property is registry implementation specific.
+   */
   private HealthCheck healthCheck;
 
+  @Deprecated
+  /**
+   * Not meaning full property.
+   */
   private String stage;
 
   private DataCenterInfo dataCenterInfo;
 
+  @Deprecated
+  /**
+   * Not meaning full property.
+   */
   private String timestamp;
 
   @Override
@@ -69,10 +79,12 @@
     return sb.toString();
   }
 
+  @Deprecated
   public String getTimestamp() {
     return timestamp;
   }
 
+  @Deprecated
   public void setTimestamp(String timestamp) {
     this.timestamp = timestamp;
   }
@@ -174,34 +186,25 @@
     this.dataCenterInfo = dataCenterInfo;
   }
 
-  // Some properties of microservice instance are dynamic changed, not cover them all now.
-  public static MicroserviceInstance createFromDefinition(Configuration configuration) {
+  public static MicroserviceInstance createFromDefinition(Environment environment) {
     MicroserviceInstance microserviceInstance = new MicroserviceInstance();
-    // default hard coded values
-    microserviceInstance.setStage(DefinitionConst.DEFAULT_STAGE);
     microserviceInstance.setStatus(MicroserviceInstanceStatus
-        .valueOf(BootStrapProperties.readServiceInstanceInitialStatus()));
-    HealthCheck healthCheck = new HealthCheck();
-    healthCheck.setMode(HealthCheckMode.HEARTBEAT);
-    microserviceInstance.setHealthCheck(healthCheck);
+        .valueOf(environment.getProperty(BootStrapProperties.CONFIG_SERVICE_INSTANCE_INITIAL_STATUS,
+            BootStrapProperties.DEFAULT_MICROSERVICE_INSTANCE_INITIAL_STATUS)));
 
     // load properties
-    Map<String, String> propertiesMap = InstancePropertiesLoader.INSTANCE.loadProperties(configuration);
+    Map<String, String> propertiesMap = InstancePropertiesLoader.INSTANCE.loadProperties(environment);
     microserviceInstance.setProperties(propertiesMap);
 
     // load data center information
-    loadDataCenterInfo(microserviceInstance);
+    loadDataCenterInfo(microserviceInstance, environment);
     return microserviceInstance;
   }
 
-  private static void loadDataCenterInfo(MicroserviceInstance microserviceInstance) {
-    String dataCenterName = DynamicPropertyFactory.getInstance()
-        .getStringProperty("servicecomb.datacenter.name", null)
-        .get();
-    String region = DynamicPropertyFactory.getInstance().
-        getStringProperty("servicecomb.datacenter.region", null).get();
-    String availableZone = DynamicPropertyFactory.getInstance().
-        getStringProperty("servicecomb.datacenter.availableZone", null).get();
+  private static void loadDataCenterInfo(MicroserviceInstance microserviceInstance, Environment environment) {
+    String dataCenterName = environment.getProperty("servicecomb.datacenter.name");
+    String region = environment.getProperty("servicecomb.datacenter.region");
+    String availableZone = environment.getProperty("servicecomb.datacenter.availableZone");
     if (dataCenterName == null && region == null && availableZone == null) {
       return;
     }
diff --git a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/config/AbstractPropertiesLoader.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/config/AbstractPropertiesLoader.java
index 4cee687..f3f0351 100644
--- a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/config/AbstractPropertiesLoader.java
+++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/config/AbstractPropertiesLoader.java
@@ -20,11 +20,11 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.commons.configuration.Configuration;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.registry.api.PropertyExtended;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.core.env.Environment;
 
 /**
  * Loading microservice properties
@@ -32,24 +32,24 @@
 public abstract class AbstractPropertiesLoader {
   private static final Logger LOGGER = LoggerFactory.getLogger(AbstractPropertiesLoader.class);
 
-  public Map<String, String> loadProperties(Configuration configuration) {
+  public Map<String, String> loadProperties(Environment environment) {
     Map<String, String> propertiesMap = new HashMap<>();
-    loadPropertiesFromConfigMap(configuration, propertiesMap);
-    loadPropertiesFromExtendedClass(configuration, propertiesMap);
+    loadPropertiesFromConfigMap(environment, propertiesMap);
+    loadPropertiesFromExtendedClass(environment, propertiesMap);
 
     return propertiesMap;
   }
 
-  protected abstract Map<String, String> readProperties(Configuration configuration);
+  protected abstract Map<String, String> readProperties(Environment environment);
 
-  protected abstract String readPropertiesExtendedClass(Configuration configuration);
+  protected abstract String readPropertiesExtendedClass(Environment environment);
 
-  private void loadPropertiesFromConfigMap(Configuration configuration, Map<String, String> propertiesMap) {
-    propertiesMap.putAll(readProperties(configuration));
+  private void loadPropertiesFromConfigMap(Environment environment, Map<String, String> propertiesMap) {
+    propertiesMap.putAll(readProperties(environment));
   }
 
-  private void loadPropertiesFromExtendedClass(Configuration configuration, Map<String, String> propertiesMap) {
-    String extendedPropertyClass = readPropertiesExtendedClass(configuration);
+  private void loadPropertiesFromExtendedClass(Environment environment, Map<String, String> propertiesMap) {
+    String extendedPropertyClass = readPropertiesExtendedClass(environment);
 
     if (StringUtils.isEmpty(extendedPropertyClass)) {
       return;
diff --git a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/config/InstancePropertiesLoader.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/config/InstancePropertiesLoader.java
index 99ac20c..f1ce406 100644
--- a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/config/InstancePropertiesLoader.java
+++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/config/InstancePropertiesLoader.java
@@ -19,8 +19,8 @@
 
 import java.util.Map;
 
-import org.apache.commons.configuration.Configuration;
 import org.apache.servicecomb.config.BootStrapProperties;
+import org.springframework.core.env.Environment;
 
 public final class InstancePropertiesLoader extends AbstractPropertiesLoader {
 
@@ -29,14 +29,13 @@
   private InstancePropertiesLoader() {
   }
 
-
   @Override
-  protected Map<String, String> readProperties(Configuration configuration) {
-    return BootStrapProperties.readServiceInstanceProperties(configuration);
+  protected Map<String, String> readProperties(Environment environment) {
+    return environment.getProperty(BootStrapProperties.CONFIG_SERVICE_INSTANCE_PROPERTIES, Map.class);
   }
 
   @Override
-  protected String readPropertiesExtendedClass(Configuration configuration) {
-    return BootStrapProperties.readServiceInstanceExtendedClass(configuration);
+  protected String readPropertiesExtendedClass(Environment environment) {
+    return environment.getProperty(BootStrapProperties.CONFIG_SERVICE_INSTANCE_EXTENDED_CLASS);
   }
 }
diff --git a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/config/MicroservicePropertiesLoader.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/config/MicroservicePropertiesLoader.java
index 2ac8865..174a8e3 100644
--- a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/config/MicroservicePropertiesLoader.java
+++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/config/MicroservicePropertiesLoader.java
@@ -19,8 +19,8 @@
 
 import java.util.Map;
 
-import org.apache.commons.configuration.Configuration;
 import org.apache.servicecomb.config.BootStrapProperties;
+import org.springframework.core.env.Environment;
 
 public final class MicroservicePropertiesLoader extends AbstractPropertiesLoader {
 
@@ -30,12 +30,12 @@
   }
 
   @Override
-  protected Map<String, String> readProperties(Configuration configuration) {
-    return BootStrapProperties.readServiceProperties(configuration);
+  protected Map<String, String> readProperties(Environment environment) {
+    return environment.getProperty(BootStrapProperties.CONFIG_SERVICE_PROPERTIES, Map.class);
   }
 
   @Override
-  protected String readPropertiesExtendedClass(Configuration configuration) {
-    return BootStrapProperties.readServiceExtendedClass(configuration);
+  protected String readPropertiesExtendedClass(Environment environment) {
+    return environment.getProperty(BootStrapProperties.CONFIG_SERVICE_EXTENDED_CLASS);
   }
 }