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

[servicecomb-java-chassis] branch master updated: [SCB-2153]Fix common http dispatcher problem working with other frame… (#2110)

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/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new 9cc06e4  [SCB-2153]Fix common http dispatcher problem working with other frame… (#2110)
9cc06e4 is described below

commit 9cc06e49a914d3f4528f29dfe03f5abc7779a009
Author: bao liu <bi...@qq.com>
AuthorDate: Wed Dec 9 11:52:22 2020 +0800

    [SCB-2153]Fix common http dispatcher problem working with other frame… (#2110)
    
    * [SCB-2153]Fix common http dispatcher problem working with other frameworks like Dubbo
    
    * [SCB-2139]Fix NPE when no service found for CommonHttpEdgeDispatcher
---
 .../core/definition/ServiceRegistryListener.java   |  6 +++-
 .../edge/core/CommonHttpEdgeDispatcher.java        | 18 ++++++++++--
 .../registry/swagger/SwaggerLoader.java            | 32 ++++++----------------
 .../serviceregistry/swagger/TestSwaggerLoader.java |  5 +---
 4 files changed, 30 insertions(+), 31 deletions(-)

diff --git a/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java b/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java
index 69b09d3..7f0599f 100644
--- a/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java
+++ b/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java
@@ -89,7 +89,11 @@ public class ServiceRegistryListener {
       for (String schemaId : microservice.getSchemas()) {
         Swagger swagger = scbEngine.getSwaggerLoader().loadSwagger(microservice, microserviceVersion.getInstances(),
             schemaId);
-        microserviceMeta.registerSchemaMeta(schemaId, swagger);
+        // allow users register schemaId, but without schema contents. This is useful when cooperate with other
+        // non java-chassis framework.
+        if (swagger != null) {
+          microserviceMeta.registerSchemaMeta(schemaId, swagger);
+        }
       }
     }
 
diff --git a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/CommonHttpEdgeDispatcher.java b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/CommonHttpEdgeDispatcher.java
index 91dce26..dbb5f26 100644
--- a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/CommonHttpEdgeDispatcher.java
+++ b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/CommonHttpEdgeDispatcher.java
@@ -42,8 +42,11 @@ import org.slf4j.LoggerFactory;
 import com.netflix.config.ConcurrentCompositeConfiguration;
 import com.netflix.config.DynamicPropertyFactory;
 
+import io.vertx.core.Handler;
+import io.vertx.core.buffer.Buffer;
 import io.vertx.core.http.HttpClient;
 import io.vertx.core.http.HttpClientRequest;
+import io.vertx.core.http.HttpClientResponse;
 import io.vertx.core.http.RequestOptions;
 import io.vertx.ext.web.Router;
 import io.vertx.ext.web.RoutingContext;
@@ -135,6 +138,13 @@ public class CommonHttpEdgeDispatcher extends AbstractEdgeDispatcher {
     LoadBalancer loadBalancer = getOrCreateLoadBalancer(invocation, configurationItem.getMicroserviceName(),
         configurationItem.getVersionRule());
     ServiceCombServer server = loadBalancer.chooseServer(invocation);
+    if (server == null) {
+      context.response().setStatusCode(503);
+      context.response().setStatusMessage("service not ready");
+      context.response().end();
+      return;
+    }
+
     URIEndpointObject endpointObject = new URIEndpointObject(server.getEndpoint().getEndpoint());
 
     RequestOptions requestOptions = new RequestOptions();
@@ -155,9 +165,7 @@ public class CommonHttpEdgeDispatcher extends AbstractEdgeDispatcher {
           httpClientResponse.headers().forEach((header) -> {
             context.response().headers().set(header.getKey(), header.getValue());
           });
-          httpClientResponse.handler(data -> {
-            context.response().write(data);
-          });
+          httpClientResponse.handler(this.responseHandler(context, httpClientResponse));
           httpClientResponse.endHandler((v) -> context.response().end());
         });
     context.request().headers().forEach((header) -> {
@@ -167,6 +175,10 @@ public class CommonHttpEdgeDispatcher extends AbstractEdgeDispatcher {
     context.request().endHandler((v) -> httpClientRequest.end());
   }
 
+  protected Handler<Buffer> responseHandler(RoutingContext routingContext, HttpClientResponse httpClientResponse) {
+    return data -> routingContext.response().write(data);
+  }
+
   protected LoadBalancer getOrCreateLoadBalancer(Invocation invocation, String microserviceName, String versionRule) {
     DiscoveryContext context = new DiscoveryContext();
     context.setInputParameters(invocation);
diff --git a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/swagger/SwaggerLoader.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/swagger/SwaggerLoader.java
index f0f757d..17077a0 100644
--- a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/swagger/SwaggerLoader.java
+++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/swagger/SwaggerLoader.java
@@ -94,21 +94,6 @@ public class SwaggerLoader {
     }
   }
 
-  public void registerSwagger(String schemaId, Swagger swagger) {
-    registerSwagger(RegistrationManager.INSTANCE.getMicroservice().getServiceName(), schemaId, swagger);
-  }
-
-  public void registerSwagger(String microserviceName, String schemaId, String swaggerContent) {
-    try {
-      Swagger swagger = SwaggerUtils.parseAndValidateSwagger(swaggerContent);
-      registerSwagger(microserviceName, schemaId, swagger);
-    } catch (Throwable e) {
-      throw new IllegalStateException(
-          String.format("Parse the swagger for %s:%s failed", microserviceName, schemaId),
-          e);
-    }
-  }
-
   public void registerSwagger(String microserviceName, String schemaId, Swagger swagger) {
     MicroserviceNameParser parser = new MicroserviceNameParser(
         RegistrationManager.INSTANCE.getMicroservice().getAppId(), microserviceName);
@@ -200,13 +185,14 @@ public class SwaggerLoader {
       return SwaggerUtils.parseAndValidateSwagger(schemaContent);
     }
 
-    throw new IllegalStateException(
-        String.format("no schema in local, and can not get schema from service center, "
-                + "appId=%s, microserviceName=%s, version=%s, serviceId=%s, schemaId=%s.",
-            microservice.getAppId(),
-            microservice.getServiceName(),
-            microservice.getVersion(),
-            microservice.getServiceId(),
-            schemaId));
+    LOGGER.warn("no schema in local, and can not get schema from service center, "
+            + "appId={}, microserviceName={}, version={}, serviceId={}, schemaId={}.",
+        microservice.getAppId(),
+        microservice.getServiceName(),
+        microservice.getVersion(),
+        microservice.getServiceId(),
+        schemaId);
+
+    return null;
   }
 }
diff --git a/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/swagger/TestSwaggerLoader.java b/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/swagger/TestSwaggerLoader.java
index 4eb6169..4e0bf59 100644
--- a/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/swagger/TestSwaggerLoader.java
+++ b/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/swagger/TestSwaggerLoader.java
@@ -129,10 +129,7 @@ public class TestSwaggerLoader extends TestRegistryBase {
     Microservice microservice = appManager.getOrCreateMicroserviceVersions("other", "ms3")
         .getVersions().values().iterator().next().getMicroservice();
 
-    expectedException.expect(IllegalStateException.class);
-    expectedException.expectMessage(
-        "no schema in local, and can not get schema from service center, appId=other, microserviceName=ms3, version=1.0, serviceId=003, schemaId=hello.");
-    RegistrationManager.INSTANCE.getSwaggerLoader().loadSwagger(microservice, null, schemaId);
+    Assert.assertNull(RegistrationManager.INSTANCE.getSwaggerLoader().loadSwagger(microservice, null, schemaId));
   }
 
   @Test