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