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/incubator-servicecomb-java-chassis.git
commit 92bf20b43da023d378f116bab0f66197b7177a3a Author: yaohaishi <[email protected]> AuthorDate: Wed Sep 19 16:38:14 2018 +0800 [SCB-926] implement StaticMicroserviceVersions --- .../registry/StaticMicroservice.java} | 26 +--- .../serviceregistry/consumer/AppManager.java | 10 ++ .../consumer/MicroserviceVersions.java | 8 +- ....java => StaticMicroserviceVersionFactory.java} | 26 +--- .../consumer/StaticMicroserviceVersions.java | 57 +++++++- .../consumer/StaticMicroserviceVersionsTest.java | 155 +++++++++++++++++++++ 6 files changed, 234 insertions(+), 48 deletions(-) diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/StaticMicroservice.java similarity index 58% copy from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java copy to service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/StaticMicroservice.java index 692a5a2..60d5900 100644 --- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java +++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/StaticMicroservice.java @@ -15,30 +15,16 @@ * limitations under the License. */ -package org.apache.servicecomb.serviceregistry.consumer; - -import java.util.List; - -import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance; - -public class StaticMicroserviceVersions extends MicroserviceVersions { +package org.apache.servicecomb.serviceregistry.api.registry; +public class StaticMicroservice extends Microservice { private Class<?> schemaIntfCls; - public StaticMicroserviceVersions(AppManager appManager, String appId, String microserviceName, - Class<?> schemaIntfCls) { - super(appManager, appId, microserviceName); - - validated = true; - this.schemaIntfCls = schemaIntfCls; + public Class<?> getSchemaIntfCls() { + return schemaIntfCls; } - @Override - public void pullInstances() { - // instance information is stored locally, do not pull from sc - } - - public void addInstances(String version, List<MicroserviceInstance> instances) { - + public void setSchemaIntfCls(Class<?> schemaIntfCls) { + this.schemaIntfCls = schemaIntfCls; } } diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java index 7cc45e2..0e0fb6a 100644 --- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java +++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java @@ -31,6 +31,8 @@ public class AppManager { // key: appId private Map<String, MicroserviceManager> apps = new ConcurrentHashMapEx<>(); + private StaticMicroserviceVersionFactory staticMicroserviceVersionFactory; + public AppManager(EventBus eventBus) { this.eventBus = eventBus; } @@ -67,4 +69,12 @@ public class AppManager { MicroserviceManager microserviceManager = getOrCreateMicroserviceManager(appId); return microserviceManager.getOrCreateMicroserviceVersions(microserviceName); } + + public StaticMicroserviceVersionFactory getStaticMicroserviceVersionFactory() { + return staticMicroserviceVersionFactory; + } + + public void setStaticMicroserviceVersionFactory(StaticMicroserviceVersionFactory staticMicroserviceVersionFactory) { + this.staticMicroserviceVersionFactory = staticMicroserviceVersionFactory; + } } diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java index 4e4ae38..e85c513 100644 --- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java +++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java @@ -43,7 +43,7 @@ import com.google.common.eventbus.Subscribe; public class MicroserviceVersions { private static final Logger LOGGER = LoggerFactory.getLogger(MicroserviceVersions.class); - private AppManager appManager; + AppManager appManager; private String appId; @@ -58,13 +58,13 @@ public class MicroserviceVersions { // in the future: // pulledInstances means all instance // instances means available instance - private List<MicroserviceInstance> instances; + List<MicroserviceInstance> instances; // key is service id - private Map<String, MicroserviceVersion> versions = new ConcurrentHashMapEx<>(); + Map<String, MicroserviceVersion> versions = new ConcurrentHashMapEx<>(); // key is version rule - private Map<String, MicroserviceVersionRule> versionRules = new ConcurrentHashMapEx<>(); + Map<String, MicroserviceVersionRule> versionRules = new ConcurrentHashMapEx<>(); // process pulled instances and create versionRule must be protected by lock // otherwise maybe lost instance or version in versionRule diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersionFactory.java similarity index 56% copy from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java copy to service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersionFactory.java index 692a5a2..d2fb60d 100644 --- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java +++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersionFactory.java @@ -17,28 +17,8 @@ package org.apache.servicecomb.serviceregistry.consumer; -import java.util.List; +import org.apache.servicecomb.serviceregistry.api.registry.StaticMicroservice; -import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance; - -public class StaticMicroserviceVersions extends MicroserviceVersions { - - private Class<?> schemaIntfCls; - - public StaticMicroserviceVersions(AppManager appManager, String appId, String microserviceName, - Class<?> schemaIntfCls) { - super(appManager, appId, microserviceName); - - validated = true; - this.schemaIntfCls = schemaIntfCls; - } - - @Override - public void pullInstances() { - // instance information is stored locally, do not pull from sc - } - - public void addInstances(String version, List<MicroserviceInstance> instances) { - - } +public interface StaticMicroserviceVersionFactory { + MicroserviceVersion create(StaticMicroservice microservice); } diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java index 692a5a2..286ff95 100644 --- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java +++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java @@ -17,20 +17,28 @@ package org.apache.servicecomb.serviceregistry.consumer; +import java.util.ArrayList; import java.util.List; +import java.util.UUID; +import org.apache.servicecomb.serviceregistry.RegistryUtils; import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance; +import org.apache.servicecomb.serviceregistry.api.registry.StaticMicroservice; +import org.apache.servicecomb.serviceregistry.version.Version; public class StaticMicroserviceVersions extends MicroserviceVersions { private Class<?> schemaIntfCls; + private String environment; + public StaticMicroserviceVersions(AppManager appManager, String appId, String microserviceName, Class<?> schemaIntfCls) { super(appManager, appId, microserviceName); validated = true; this.schemaIntfCls = schemaIntfCls; + this.environment = RegistryUtils.getMicroservice().getEnvironment(); } @Override @@ -38,7 +46,54 @@ public class StaticMicroserviceVersions extends MicroserviceVersions { // instance information is stored locally, do not pull from sc } - public void addInstances(String version, List<MicroserviceInstance> instances) { + public void addInstances(String version, List<MicroserviceInstance> addedInstances) { + Version parsedVersion = new Version(version); + String serviceId = computeServiceId(parsedVersion); + + for (MicroserviceInstance instance : addedInstances) { + instance.setServiceId(serviceId); + instance.setInstanceId(serviceId + "-" + UUID.randomUUID()); + } + + mergeInstances(addedInstances); + + // ensure microserviceVersion exists + versions.computeIfAbsent(serviceId, microserviceId -> { + StaticMicroservice microservice = createMicroservice(parsedVersion, serviceId); + MicroserviceVersion microserviceVersion = appManager.getStaticMicroserviceVersionFactory().create(microservice); + for (MicroserviceVersionRule microserviceVersionRule : versionRules.values()) { + microserviceVersionRule.addMicroserviceVersion(microserviceVersion); + } + return microserviceVersion; + }); + + for (MicroserviceVersionRule microserviceVersionRule : versionRules.values()) { + microserviceVersionRule.setInstances(this.instances); + } + } + + private void mergeInstances(List<MicroserviceInstance> instances) { + if (null == this.instances) { + this.instances = new ArrayList<>(instances.size()); + } + this.instances.addAll(instances); + } + + private StaticMicroservice createMicroservice(Version parsedVersion, String serviceId) { + StaticMicroservice microservice = new StaticMicroservice(); + microservice.setAppId(this.getAppId()); + microservice.setServiceId(serviceId); + microservice.setServiceName(this.getMicroserviceName()); + microservice.setVersion(parsedVersion.getVersion()); + microservice.setEnvironment(RegistryUtils.getMicroservice().getEnvironment()); + microservice.setSchemaIntfCls(this.schemaIntfCls); + return microservice; + } + private String computeServiceId(Version parsedVersion) { + return this.getAppId() + "-" + + this.environment + "-" + + this.getMicroserviceName() + "-" + + parsedVersion.getVersion(); } } diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersionsTest.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersionsTest.java new file mode 100644 index 0000000..ca3c3b3 --- /dev/null +++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersionsTest.java @@ -0,0 +1,155 @@ +/* + * 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. + */ + +package org.apache.servicecomb.serviceregistry.consumer; + +import java.util.Collections; + +import org.apache.servicecomb.serviceregistry.RegistryUtils; +import org.apache.servicecomb.serviceregistry.api.registry.Microservice; +import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance; +import org.apache.servicecomb.serviceregistry.api.registry.StaticMicroservice; +import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient; +import org.apache.servicecomb.serviceregistry.definition.MicroserviceDefinition; +import org.apache.servicecomb.serviceregistry.registry.AbstractServiceRegistry; +import org.apache.servicecomb.serviceregistry.version.Version; +import org.apache.servicecomb.serviceregistry.version.VersionUtils; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.google.common.eventbus.EventBus; + +import mockit.Mock; +import mockit.MockUp; + +public class StaticMicroserviceVersionsTest { + + private static final String APP_ID = "testAppId"; + + private static final String THIS_SERVICE = "thisService"; + + private static final String MICROSERVICE_NAME = "3rdPartyService"; + + private static final String ENVIRONMENT = "production"; + + private static final String SERVICE_ID_PREFIX = APP_ID + "-" + ENVIRONMENT + "-" + MICROSERVICE_NAME + "-"; + + @BeforeClass + public static void beforeClass() { + RegistryUtils.setServiceRegistry(new AbstractServiceRegistry(null, null, + MicroserviceDefinition.create(APP_ID, THIS_SERVICE)) { + @Override + protected ServiceRegistryClient createServiceRegistryClient() { + return null; + } + }); + RegistryUtils.getMicroservice().setEnvironment(ENVIRONMENT); + } + + @Test + public void addInstanceBasic() { + StaticMicroserviceVersions staticMicroserviceVersions = createStaticMicroserviceVersions(); + + MicroserviceInstance instance = new MicroserviceInstance(); + String serviceVersion = "1.2.1"; + staticMicroserviceVersions.addInstances(serviceVersion, Collections.singletonList(instance)); + + MicroserviceVersionRule versionRule = staticMicroserviceVersions.getOrCreateMicroserviceVersionRule(serviceVersion); + MicroserviceVersion latestMicroserviceVersion = versionRule.getLatestMicroserviceVersion(); + Assert.assertEquals(new Version(serviceVersion), latestMicroserviceVersion.getVersion()); + Microservice latestMicroservice = latestMicroserviceVersion.getMicroservice(); + Assert.assertEquals(APP_ID, latestMicroservice.getAppId()); + Assert.assertEquals(SERVICE_ID_PREFIX + serviceVersion, latestMicroservice.getServiceId()); + Assert.assertEquals(MICROSERVICE_NAME, latestMicroservice.getServiceName()); + Assert.assertEquals(serviceVersion, latestMicroservice.getVersion()); + Assert.assertEquals(ENVIRONMENT, latestMicroservice.getEnvironment()); + Assert.assertEquals(TestServiceIntf.class, ((StaticMicroservice) latestMicroservice).getSchemaIntfCls()); + Assert.assertEquals(1, versionRule.getInstances().size()); + Assert.assertSame(instance, versionRule.getInstances().get(instance.getInstanceId())); + Assert.assertEquals(SERVICE_ID_PREFIX + serviceVersion, instance.getServiceId()); + Assert.assertTrue(instance.getInstanceId().startsWith(SERVICE_ID_PREFIX + serviceVersion + "-")); + } + + @Test + public void addInstancesAndGetVersionRuleMultiTimes() { + StaticMicroserviceVersions staticMicroserviceVersions = createStaticMicroserviceVersions(); + + // add instance1 with version 1.1.0 + MicroserviceInstance instance1 = new MicroserviceInstance(); + staticMicroserviceVersions.addInstances("1.1.0", Collections.singletonList(instance1)); + + MicroserviceVersionRule versionRule = staticMicroserviceVersions.getOrCreateMicroserviceVersionRule("0.0.0+"); + MicroserviceVersion latestMicroserviceVersion = versionRule.getLatestMicroserviceVersion(); + Assert.assertEquals(new Version("1.1.0"), latestMicroserviceVersion.getVersion()); + Assert.assertEquals(1, versionRule.getInstances().size()); + Assert.assertSame(instance1, versionRule.getInstances().get(instance1.getInstanceId())); + + // add instance2 with version 1.1.1 + MicroserviceInstance instance2 = new MicroserviceInstance(); + staticMicroserviceVersions.addInstances("1.1.1", Collections.singletonList(instance2)); + + versionRule = staticMicroserviceVersions.getOrCreateMicroserviceVersionRule("0.0.0+"); + latestMicroserviceVersion = versionRule.getLatestMicroserviceVersion(); + Assert.assertEquals(new Version("1.1.1"), latestMicroserviceVersion.getVersion()); + Assert.assertEquals(2, versionRule.getInstances().size()); + Assert.assertSame(instance1, versionRule.getInstances().get(instance1.getInstanceId())); + Assert.assertSame(instance2, versionRule.getInstances().get(instance2.getInstanceId())); + + // add instance3 with version 0.1.0 + MicroserviceInstance instance3 = new MicroserviceInstance(); + staticMicroserviceVersions.addInstances("0.1.0", Collections.singletonList(instance3)); + + versionRule = staticMicroserviceVersions.getOrCreateMicroserviceVersionRule("0.0.0+"); + latestMicroserviceVersion = versionRule.getLatestMicroserviceVersion(); + Assert.assertEquals(new Version("1.1.1"), latestMicroserviceVersion.getVersion()); + Assert.assertEquals(3, versionRule.getInstances().size()); + Assert.assertSame(instance1, versionRule.getInstances().get(instance1.getInstanceId())); + Assert.assertSame(instance2, versionRule.getInstances().get(instance2.getInstanceId())); + Assert.assertSame(instance3, versionRule.getInstances().get(instance3.getInstanceId())); + + // instance3 should be filtered out + versionRule = staticMicroserviceVersions.getOrCreateMicroserviceVersionRule("1.0.0+"); + latestMicroserviceVersion = versionRule.getLatestMicroserviceVersion(); + Assert.assertEquals(new Version("1.1.1"), latestMicroserviceVersion.getVersion()); + Assert.assertEquals(2, versionRule.getInstances().size()); + Assert.assertSame(instance1, versionRule.getInstances().get(instance1.getInstanceId())); + Assert.assertSame(instance2, versionRule.getInstances().get(instance2.getInstanceId())); + Assert.assertNull(versionRule.getInstances().get(instance3.getInstanceId())); + } + + private StaticMicroserviceVersions createStaticMicroserviceVersions() { + EventBus eventBus = new EventBus(); + AppManager appManager = new AppManager(eventBus); + appManager.setStaticMicroserviceVersionFactory(microservice -> new MockUp<MicroserviceVersion>() { + @Mock + public Version getVersion() { + return VersionUtils.getOrCreate(microservice.getVersion()); + } + + @Mock + public Microservice getMicroservice() { + return microservice; + } + }.getMockInstance()); + return new StaticMicroserviceVersions( + appManager, APP_ID, MICROSERVICE_NAME, TestServiceIntf.class); + } + + private interface TestServiceIntf { + } +} \ No newline at end of file
