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:14:50 UTC

[servicecomb-java-chassis] 01/19: [SCB-1691] modify instance status change interface

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 0b507b459e0a512e74e368e19063a3c23196b16e
Author: yhs0092 <yh...@163.com>
AuthorDate: Sat Dec 28 17:51:43 2019 +0800

    [SCB-1691] modify instance status change interface
---
 .../client/LocalServiceRegistryClientImpl.java     |  30 +++---
 .../client/ServiceRegistryClient.java              |  23 ++++-
 .../client/http/ServiceRegistryClientImpl.java     |  34 +++----
 .../client/LocalServiceRegistryClientImplTest.java |  66 ++++++++++++++
 .../client/http/TestServiceRegistryClientImpl.java | 101 ++++++++++++++++-----
 5 files changed, 199 insertions(+), 55 deletions(-)

diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/LocalServiceRegistryClientImpl.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/LocalServiceRegistryClientImpl.java
index 4b1b6a6..cf8963f 100755
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/LocalServiceRegistryClientImpl.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/LocalServiceRegistryClientImpl.java
@@ -434,30 +434,26 @@ public class LocalServiceRegistryClientImpl implements ServiceRegistryClient {
   }
 
   @Override
-  public boolean undateMicroserviceInstanceStatus(String microserviceId, String microserviceInstanceId, String status) {
+  public boolean updateMicroserviceInstanceStatus(String microserviceId, String instanceId,
+      MicroserviceInstanceStatus status) {
+    if (null == status) {
+      throw new IllegalArgumentException("null status is now allowed");
+    }
+
     Map<String, MicroserviceInstance> instanceMap = microserviceInstanceMap.get(microserviceId);
     if (instanceMap == null) {
       throw new IllegalArgumentException("Invalid serviceId, serviceId=" + microserviceId);
     }
 
-    MicroserviceInstance microserviceInstance = instanceMap.get(microserviceInstanceId);
+    MicroserviceInstance microserviceInstance = instanceMap.get(instanceId);
     if (microserviceInstance == null) {
       throw new IllegalArgumentException(
-              String.format("Invalid argument. microserviceId=%s, microserviceInstanceId=%s.",
-                      microserviceId,
-                      microserviceInstanceId));
-    }
-    MicroserviceInstanceStatus instanceStatus;
-    try {
-      instanceStatus = MicroserviceInstanceStatus.valueOf(status);
-    }
-    catch (IllegalArgumentException e){
-      throw new IllegalArgumentException("Invalid status.");
-    }
-    if (null != instanceStatus) {
-      microserviceInstance.setStatus(instanceStatus);
-      return true;
+          String.format("Invalid argument. microserviceId=%s, instanceId=%s.",
+              microserviceId,
+              instanceId));
     }
-    return false;
+
+    microserviceInstance.setStatus(status);
+    return true;
   }
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/ServiceRegistryClient.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/ServiceRegistryClient.java
index 81f61bf..b093c0c 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/ServiceRegistryClient.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/ServiceRegistryClient.java
@@ -179,6 +179,27 @@ public interface ServiceRegistryClient {
    * @param microserviceId
    * @param microserviceInstanceId
    * @return
+   * @deprecated use {@link #updateMicroserviceInstanceStatus(String, String, MicroserviceInstanceStatus)} instead
    */
-  boolean undateMicroserviceInstanceStatus(String microserviceId, String microserviceInstanceId, String status);
+  @Deprecated
+  default boolean undateMicroserviceInstanceStatus(String microserviceId, String microserviceInstanceId,
+      String status) {
+    MicroserviceInstanceStatus instanceStatus;
+    try {
+      instanceStatus = MicroserviceInstanceStatus.valueOf(status);
+    } catch (IllegalArgumentException e) {
+      throw new IllegalArgumentException("Invalid status: " + status);
+    }
+
+    return updateMicroserviceInstanceStatus(microserviceId, microserviceInstanceId, instanceStatus);
+  }
+
+  /**
+   * Update the instance status registered in service center.
+   * @param microserviceId the microserviceId of the instance
+   * @param instanceId the instanceId of the instance
+   * @param status update to this status
+   * @return whether this operation success
+   */
+  boolean updateMicroserviceInstanceStatus(String microserviceId, String instanceId, MicroserviceInstanceStatus status);
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java
index 3c5930f..ed2e369 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java
@@ -39,6 +39,7 @@ import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.api.Const;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;
 import org.apache.servicecomb.serviceregistry.api.registry.ServiceCenterInfo;
 import org.apache.servicecomb.serviceregistry.api.request.CreateSchemaRequest;
 import org.apache.servicecomb.serviceregistry.api.request.CreateServiceRequest;
@@ -62,7 +63,6 @@ import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
 import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.util.StringUtils;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.cache.CacheBuilder;
@@ -78,7 +78,9 @@ public final class ServiceRegistryClientImpl implements ServiceRegistryClient {
   private static final Logger LOGGER = LoggerFactory.getLogger(ServiceRegistryClientImpl.class);
 
   private static final String ERROR_CODE = "errorCode";
+
   private static final String ERR_SERVICE_NOT_EXISTS = "400012";
+
   private static final String ERR_SCHEMA_NOT_EXISTS = "400016";
 
   private IpPortManager ipPortManager;
@@ -691,7 +693,7 @@ public final class ServiceRegistryClientImpl implements ServiceRegistryClient {
                 callback);
             onClose.success(null);
           }, bodyBuffer -> {
-            MicroserviceInstanceChangedEvent response = null;
+            MicroserviceInstanceChangedEvent response;
             try {
               response = JsonUtils.readValue(bodyBuffer.getBytes(),
                   MicroserviceInstanceChangedEvent.class);
@@ -904,22 +906,22 @@ public final class ServiceRegistryClientImpl implements ServiceRegistryClient {
   }
 
   @Override
-  public boolean undateMicroserviceInstanceStatus(String microserviceId, String microserviceInstanceId, String status) {
+  public boolean updateMicroserviceInstanceStatus(String microserviceId, String instanceId,
+      MicroserviceInstanceStatus status) {
+    if (null == status) {
+      throw new IllegalArgumentException("null status is now allowed");
+    }
+
     Holder<HttpClientResponse> holder = new Holder<>();
     IpPort ipPort = ipPortManager.getAvailableAddress();
     try {
-      if (LOGGER.isDebugEnabled()) {
-        LOGGER.debug("update status of microservice instance: {}", status);
-      }
-      String url = String.format(Const.REGISTRY_API.MICROSERVICE_INSTANCE_STATUS, microserviceId, microserviceInstanceId);
-      if (StringUtils.isEmpty(status)) {
-        LOGGER.debug("empty status");
-        return false;
-      }
+      LOGGER.debug("update status of microservice instance: {}", status);
+      String url = String.format(Const.REGISTRY_API.MICROSERVICE_INSTANCE_STATUS, microserviceId, instanceId);
       Map<String, String[]> queryParams = new HashMap<>();
-      queryParams.put("value", new String[] {status});
+      queryParams.put("value", new String[] {status.toString()});
       CountDownLatch countDownLatch = new CountDownLatch(1);
-      RestUtils.put(ipPort, url, new RequestParam().setQueryParams(queryParams), syncHandler(countDownLatch, HttpClientResponse.class, holder));
+      RestUtils.put(ipPort, url, new RequestParam().setQueryParams(queryParams),
+          syncHandler(countDownLatch, HttpClientResponse.class, holder));
       countDownLatch.await();
       if (holder.value != null) {
         if (holder.value.statusCode() == Status.OK.getStatusCode()) {
@@ -929,9 +931,9 @@ public final class ServiceRegistryClientImpl implements ServiceRegistryClient {
       }
     } catch (Exception e) {
       LOGGER.error("update status of microservice instance {}/{} failed",
-              microserviceId,
-              microserviceInstanceId,
-              e);
+          microserviceId,
+          instanceId,
+          e);
     }
     return false;
   }
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/LocalServiceRegistryClientImplTest.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/LocalServiceRegistryClientImplTest.java
index a1f0f03..375f299 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/LocalServiceRegistryClientImplTest.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/LocalServiceRegistryClientImplTest.java
@@ -17,11 +17,14 @@
 
 package org.apache.servicecomb.serviceregistry.client;
 
+import static org.junit.Assert.fail;
+
 import java.io.InputStream;
 import java.util.List;
 
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;
 import org.apache.servicecomb.serviceregistry.api.registry.ServiceCenterInfo;
 import org.apache.servicecomb.serviceregistry.api.response.GetSchemaResponse;
 import org.apache.servicecomb.serviceregistry.client.http.Holder;
@@ -196,5 +199,68 @@ public class LocalServiceRegistryClientImplTest {
     Assert.assertThat(microservice.getSchemas().size(), Is.is(1));
     Assert.assertTrue(microservice.getSchemas().contains("hello"));
   }
+
+  @SuppressWarnings("deprecation")
+  @Test
+  public void undateMicroserviceInstanceStatus() {
+    List<MicroserviceInstance> m = registryClient
+        .findServiceInstance("", "default", "ms2", DefinitionConst.VERSION_RULE_ALL);
+    MicroserviceInstance instance = m.get(0);
+    Assert.assertEquals(MicroserviceInstanceStatus.UP, instance.getStatus());
+
+    boolean updateOperationResult = registryClient
+        .undateMicroserviceInstanceStatus(instance.getServiceId(), instance.getInstanceId(), "TESTING");
+    Assert.assertTrue(updateOperationResult);
+
+    m = registryClient
+        .findServiceInstance("", "default", "ms2", DefinitionConst.VERSION_RULE_ALL);
+    instance = m.get(0);
+    Assert.assertEquals(MicroserviceInstanceStatus.TESTING, instance.getStatus());
+  }
+
+  @SuppressWarnings("deprecation")
+  @Test
+  public void undateMicroserviceInstanceStatus_instance_not_found() {
+    try {
+      registryClient.undateMicroserviceInstanceStatus("msIdNotExist", "", "UP");
+      shouldThrowException();
+    } catch (IllegalArgumentException e) {
+      Assert.assertEquals("Invalid serviceId, serviceId=msIdNotExist", e.getMessage());
+    }
+
+    try {
+      registryClient.undateMicroserviceInstanceStatus("002", "instanceIdNotExist", "UP");
+      shouldThrowException();
+    } catch (IllegalArgumentException e) {
+      Assert.assertEquals("Invalid argument. microserviceId=002, instanceId=instanceIdNotExist.",
+          e.getMessage());
+    }
+  }
+
+  @SuppressWarnings("deprecation")
+  @Test
+  public void undateMicroserviceInstanceStatus_illegal_status() {
+    List<MicroserviceInstance> m = registryClient
+        .findServiceInstance("", "default", "ms2", DefinitionConst.VERSION_RULE_ALL);
+    MicroserviceInstance instance = m.get(0);
+
+    try {
+      registryClient.undateMicroserviceInstanceStatus(instance.getServiceId(), instance.getInstanceId(), null);
+      shouldThrowException();
+    } catch (NullPointerException e) {
+      Assert.assertEquals("Name is null", e.getMessage());
+    }
+    try {
+      registryClient
+          .undateMicroserviceInstanceStatus(instance.getServiceId(), instance.getInstanceId(), "IllegalStatus");
+      shouldThrowException();
+    } catch (IllegalArgumentException e) {
+      Assert.assertEquals("Invalid status: IllegalStatus", e.getMessage());
+    }
+  }
+
+  private void shouldThrowException() {
+    fail("an exception is expected");
+  }
 }
 
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/http/TestServiceRegistryClientImpl.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/http/TestServiceRegistryClientImpl.java
index d1c855b..3a7662b 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/http/TestServiceRegistryClientImpl.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/http/TestServiceRegistryClientImpl.java
@@ -18,6 +18,7 @@
 package org.apache.servicecomb.serviceregistry.client.http;
 
 import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.fail;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -124,25 +125,21 @@ public class TestServiceRegistryClientImpl {
   public void testException() {
     MicroserviceFactory microserviceFactory = new MicroserviceFactory();
     Microservice microservice = microserviceFactory.create("app", "ms");
-    Assert.assertEquals(null, oClient.registerMicroservice(microservice));
-    Assert.assertEquals(null, oClient.registerMicroserviceInstance(microservice.getInstance()));
+    Assert.assertNull(oClient.registerMicroservice(microservice));
+    Assert.assertNull(oClient.registerMicroserviceInstance(microservice.getInstance()));
     oClient.init();
-    Assert.assertEquals(null,
-        oClient.getMicroserviceId(microservice.getAppId(),
-            microservice.getServiceName(),
-            microservice.getVersion(),
-            microservice.getEnvironment()));
+    Assert.assertNull(oClient.getMicroserviceId(microservice.getAppId(),
+        microservice.getServiceName(),
+        microservice.getVersion(),
+        microservice.getEnvironment()));
     Assert.assertThat(oClient.getAllMicroservices().isEmpty(), is(true));
-    Assert.assertEquals(null, oClient.registerMicroservice(microservice));
-    Assert.assertEquals(null, oClient.getMicroservice("microserviceId"));
-    Assert.assertEquals(null, oClient.getMicroserviceInstance("consumerId", "providerId"));
-    Assert.assertEquals(false,
-        oClient.unregisterMicroserviceInstance("microserviceId", "microserviceInstanceId"));
-    Assert.assertEquals(null, oClient.heartbeat("microserviceId", "microserviceInstanceId"));
-    Assert.assertEquals(null,
-        oClient.findServiceInstance("selfMicroserviceId", "appId", "serviceName", "versionRule"));
-    Assert.assertEquals(null,
-        oClient.findServiceInstances("selfMicroserviceId", "appId", "serviceName", "versionRule", "0"));
+    Assert.assertNull(oClient.registerMicroservice(microservice));
+    Assert.assertNull(oClient.getMicroservice("microserviceId"));
+    Assert.assertNull(oClient.getMicroserviceInstance("consumerId", "providerId"));
+    Assert.assertFalse(oClient.unregisterMicroserviceInstance("microserviceId", "microserviceInstanceId"));
+    Assert.assertNull(oClient.heartbeat("microserviceId", "microserviceInstanceId"));
+    Assert.assertNull(oClient.findServiceInstance("selfMicroserviceId", "appId", "serviceName", "versionRule"));
+    Assert.assertNull(oClient.findServiceInstances("selfMicroserviceId", "appId", "serviceName", "versionRule", "0"));
 
     Assert.assertEquals("a", new ClientException("a").getMessage());
   }
@@ -324,14 +321,13 @@ public class TestServiceRegistryClientImpl {
       @Mock
       void httpDo(RequestContext requestContext, Handler<RestResponse> responseHandler) {
         Holder<GetServiceResponse> holder = Deencapsulation.getField(responseHandler, "arg$4");
-        GetServiceResponse serviceResp = Json
+        holder.value = Json
             .decodeValue(
                 "{\"service\":{\"serviceId\":\"serviceId\",\"framework\":null"
                     + ",\"registerBy\":null,\"environment\":null,\"appId\":\"appId\",\"serviceName\":null,"
                     + "\"alias\":null,\"version\":null,\"description\":null,\"level\":null,\"schemas\":[],"
                     + "\"paths\":[],\"status\":\"UP\",\"properties\":{},\"intance\":null}}",
                 GetServiceResponse.class);
-        holder.value = serviceResp;
         RequestParam requestParam = requestContext.getParams();
         Assert.assertEquals("global=true", requestParam.getQueryParams());
       }
@@ -351,11 +347,10 @@ public class TestServiceRegistryClientImpl {
       @Mock
       void httpDo(RequestContext requestContext, Handler<RestResponse> responseHandler) {
         Holder<GetSchemaResponse> holder = Deencapsulation.getField(responseHandler, "arg$4");
-        GetSchemaResponse schemasResp = Json
+        holder.value = Json
             .decodeValue(
                 "{ \"schema\": \"schema\", \"schemaId\":\"metricsEndpoint\",\"summary\":\"c1188d709631a9038874f9efc6eb894f\"}",
                 GetSchemaResponse.class);
-        holder.value = schemasResp;
         RequestParam requestParam = requestContext.getParams();
         Assert.assertEquals("global=true", requestParam.getQueryParams());
       }
@@ -545,4 +540,68 @@ public class TestServiceRegistryClientImpl {
       }
     }.run();
   }
+
+  @SuppressWarnings("deprecation")
+  @Test
+  public void undateMicroserviceInstanceStatus() {
+    HttpClientResponse httpClientResponse = new MockUp<HttpClientResponse>() {
+      @Mock
+      int statusCode() {
+        return 200;
+      }
+    }.getMockInstance();
+    new MockUp<RestUtils>() {
+      @Mock
+      void put(IpPort ipPort, String uri, RequestParam requestParam, Handler<RestResponse> responseHandler) {
+        Holder<HttpClientResponse> holder = Deencapsulation.getField(responseHandler, "arg$4");
+        holder.value = httpClientResponse;
+      }
+    };
+
+    boolean result = oClient.undateMicroserviceInstanceStatus("svcId", "instanceId", "UP");
+    Assert.assertTrue(result);
+  }
+
+  @SuppressWarnings("deprecation")
+  @Test
+  public void undateMicroserviceInstanceStatus_response_failure() {
+    HttpClientResponse httpClientResponse = new MockUp<HttpClientResponse>() {
+      @Mock
+      int statusCode() {
+        return 400;
+      }
+    }.getMockInstance();
+    new MockUp<RestUtils>() {
+      @Mock
+      void put(IpPort ipPort, String uri, RequestParam requestParam, Handler<RestResponse> responseHandler) {
+        Holder<HttpClientResponse> holder = Deencapsulation.getField(responseHandler, "arg$4");
+        holder.value = httpClientResponse;
+      }
+    };
+
+    boolean result = oClient.undateMicroserviceInstanceStatus("svcId", "instanceId", "UP");
+    Assert.assertFalse(result);
+  }
+
+  @SuppressWarnings("deprecation")
+  @Test
+  public void undateMicroserviceInstanceStatus_illegal_status() {
+    try {
+      oClient.undateMicroserviceInstanceStatus("svcId", "instanceId", null);
+      shouldThrowException();
+    } catch (NullPointerException e) {
+      Assert.assertEquals("Name is null", e.getMessage());
+    }
+    try {
+      oClient
+          .undateMicroserviceInstanceStatus("svcId", "instanceId", "IllegalStatus");
+      shouldThrowException();
+    } catch (IllegalArgumentException e) {
+      Assert.assertEquals("Invalid status: IllegalStatus", e.getMessage());
+    }
+  }
+
+  private void shouldThrowException() {
+    fail("an exception is expected");
+  }
 }