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 2022/09/22 08:56:05 UTC

[servicecomb-java-chassis] branch master updated: [SCB-2690]support configure url prefix for vert.x rest dispatcher (#3355)

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 0d51f5a53 [SCB-2690]support configure url prefix for vert.x rest dispatcher (#3355)
0d51f5a53 is described below

commit 0d51f5a53c969f6dad3755552e576854564b008d
Author: liubao68 <bi...@qq.com>
AuthorDate: Thu Sep 22 16:55:59 2022 +0800

    [SCB-2690]support configure url prefix for vert.x rest dispatcher (#3355)
---
 .../src/main/resources/application.yml             |  2 +-
 .../{application.yml => microservice.yaml}         | 12 ++++-------
 .../springmvc/client/TestMaxHttpUrlLength.java     |  4 ++--
 .../client/TestThirdPartyRegistration.java         |  9 +++++++-
 .../src/main/resources/microservice.yaml           |  2 +-
 .../servicecomb/demo/springmvc/third/Register.java |  9 +++++++-
 .../src/main/resources/microservice.yaml           |  4 ++++
 .../governance/marker/TrafficMarker.java           | 12 -----------
 .../transport/rest/vertx/VertxRestDispatcher.java  |  2 +-
 .../transport/rest/vertx/VertxRestTransport.java   | 24 ++++++++++++++++++++--
 10 files changed, 51 insertions(+), 29 deletions(-)

diff --git a/demo/demo-spring-boot-transport/demo-spring-boot-springmvc-client/src/main/resources/application.yml b/demo/demo-spring-boot-transport/demo-spring-boot-springmvc-client/src/main/resources/application.yml
index a036aacdf..b4e5bfbb6 100644
--- a/demo/demo-spring-boot-transport/demo-spring-boot-springmvc-client/src/main/resources/application.yml
+++ b/demo/demo-spring-boot-transport/demo-spring-boot-springmvc-client/src/main/resources/application.yml
@@ -22,4 +22,4 @@ server:
 servicecomb:
   test:
     vert:
-      transport: false
\ No newline at end of file
+      transport: false
diff --git a/demo/demo-spring-boot-transport/demo-spring-boot-springmvc-client/src/main/resources/application.yml b/demo/demo-spring-boot-transport/demo-spring-boot-springmvc-client/src/main/resources/microservice.yaml
similarity index 89%
copy from demo/demo-spring-boot-transport/demo-spring-boot-springmvc-client/src/main/resources/application.yml
copy to demo/demo-spring-boot-transport/demo-spring-boot-springmvc-client/src/main/resources/microservice.yaml
index a036aacdf..587c6bbf5 100644
--- a/demo/demo-spring-boot-transport/demo-spring-boot-springmvc-client/src/main/resources/application.yml
+++ b/demo/demo-spring-boot-transport/demo-spring-boot-springmvc-client/src/main/resources/microservice.yaml
@@ -14,12 +14,8 @@
 ## See the License for the specific language governing permissions and
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
+servicecomb-config-order: 100
 
-APPLICATION_ID: springmvcboottest
-
-server:
-  port: 8999
-servicecomb:
-  test:
-    vert:
-      transport: false
\ No newline at end of file
+3rd-svc:
+  urls:
+    - rest://localhost:8080?sslEnabled=false
diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestMaxHttpUrlLength.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestMaxHttpUrlLength.java
index d696b40f6..56b64c734 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestMaxHttpUrlLength.java
+++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestMaxHttpUrlLength.java
@@ -39,12 +39,12 @@ public class TestMaxHttpUrlLength implements CategorizedTestCase {
   private void testUrlNotLongerThan4096() {
     RestTemplate restTemplate = RestTemplateBuilder.create();
 
-    String q = Strings.repeat("q", 4096 - "GET /springmvc/controller/sayhi?name=".length() - " HTTP/1.1\r".length());
+    String q = Strings.repeat("q", 4096 - "GET /api/springmvc/controller/sayhi?name=".length() - " HTTP/1.1\r".length());
     TestMgr.check("hi " + q + " [" + q + "]",
         restTemplate.getForObject("cse://springmvc/springmvc/controller/sayhi?name=" + q,
             String.class));
 
-    q = Strings.repeat("q", 4096 + 1 - "GET /springmvc/controller/sayhi?name=".length() - " HTTP/1.1\r".length());
+    q = Strings.repeat("q", 4096 + 1 - "GET /api/springmvc/controller/sayhi?name=".length() - " HTTP/1.1\r".length());
     try {
       restTemplate.getForObject("cse://springmvc/springmvc/controller/sayhi?name=" + q,
           String.class);
diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestThirdPartyRegistration.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestThirdPartyRegistration.java
index 0ad719966..6c375ca29 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestThirdPartyRegistration.java
+++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestThirdPartyRegistration.java
@@ -29,6 +29,8 @@ import org.apache.servicecomb.registry.RegistrationManager;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
 
+import com.netflix.config.DynamicPropertyFactory;
+
 @Component
 public class TestThirdPartyRegistration implements BootListener, CategorizedTestCase {
   private ThirdPartyService thirdPartyService;
@@ -36,7 +38,12 @@ public class TestThirdPartyRegistration implements BootListener, CategorizedTest
   @Override
   public void onAfterRegistry(BootEvent event) {
     List<String> endpoints = new ArrayList<>();
-    endpoints.add("rest://localhost:8080");
+    if (DynamicPropertyFactory.getInstance()
+        .getBooleanProperty("servicecomb.test.vert.transport", true).get()) {
+      endpoints.add("rest://localhost:8080?sslEnabled=false&urlPrefix=%2Fapi");
+    } else {
+      endpoints.add("rest://localhost:8080?sslEnabled=false");
+    }
     RegistrationManager.INSTANCE.registerMicroserviceMappingByEndpoints("testServiceName",
         "1.0.1", endpoints, ThirdPartyService.class);
     thirdPartyService = Invoker.createProxy("testServiceName",
diff --git a/demo/demo-springmvc/springmvc-client/src/main/resources/microservice.yaml b/demo/demo-springmvc/springmvc-client/src/main/resources/microservice.yaml
index a76dafd7d..7c18a5aa3 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/resources/microservice.yaml
+++ b/demo/demo-springmvc/springmvc-client/src/main/resources/microservice.yaml
@@ -142,7 +142,7 @@ cse:
 
 3rd-svc:
   urls:
-    - http://localhost:8080
+    - rest://localhost:8080?sslEnabled=false&urlPrefix=%2Fapi
 
 #########SSL options
 ssl.protocols: TLSv1.2
diff --git a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/third/Register.java b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/third/Register.java
index 687ade9e3..aa2fab084 100644
--- a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/third/Register.java
+++ b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/third/Register.java
@@ -22,6 +22,8 @@ import java.util.Arrays;
 import org.apache.servicecomb.provider.pojo.registry.ThirdServiceWithInvokerRegister;
 import org.springframework.stereotype.Component;
 
+import com.netflix.config.DynamicPropertyFactory;
+
 /**
  * see: https://github.com/apache/servicecomb-java-chassis/issues/2534
  */
@@ -30,6 +32,11 @@ public class Register extends ThirdServiceWithInvokerRegister {
   public Register() {
     super("third");
     addSchema("heartbeat", HealthSchema.class);
-    setUrls("", Arrays.asList("rest://localhost:8080?sslEnabled=false"));
+    if (DynamicPropertyFactory.getInstance()
+        .getBooleanProperty("servicecomb.test.vert.transport", true).get()) {
+      setUrls("", Arrays.asList("rest://localhost:8080?sslEnabled=false&urlPrefix=%2Fapi"));
+    } else {
+      setUrls("", Arrays.asList("rest://localhost:8080?sslEnabled=false"));
+    }
   }
 }
diff --git a/demo/demo-springmvc/springmvc-server/src/main/resources/microservice.yaml b/demo/demo-springmvc/springmvc-server/src/main/resources/microservice.yaml
index 11df20587..bf81a5490 100644
--- a/demo/demo-springmvc/springmvc-server/src/main/resources/microservice.yaml
+++ b/demo/demo-springmvc/springmvc-server/src/main/resources/microservice.yaml
@@ -46,6 +46,10 @@ servicecomb:
       autodiscovery: true
   uploads:
     directory: target
+  http:
+    dispatcher:
+      rest:
+        pattern: "/api/(.*)"
   rest:
     address: 0.0.0.0:8080?sslEnabled=false
     server:
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/marker/TrafficMarker.java b/governance/src/main/java/org/apache/servicecomb/governance/marker/TrafficMarker.java
index a578d3f9a..330e8605f 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/marker/TrafficMarker.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/marker/TrafficMarker.java
@@ -21,8 +21,6 @@ import java.util.List;
 import org.apache.servicecomb.governance.entity.Configurable;
 
 public class TrafficMarker extends Configurable {
-  private String name;
-
   private List<Matcher> matches;
 
   @Override
@@ -41,16 +39,6 @@ public class TrafficMarker extends Configurable {
     this.matches = matches;
   }
 
-  @Override
-  public String getName() {
-    return name;
-  }
-
-  @Override
-  public void setName(String name) {
-    this.name = name;
-  }
-
   public boolean checkMatch(GovernanceRequest governanceRequest, RequestProcessor requestProcessor) {
     return this.matches.stream().anyMatch(match -> requestProcessor.match(governanceRequest, match));
   }
diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/VertxRestDispatcher.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/VertxRestDispatcher.java
index acb4b323a..d24202507 100644
--- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/VertxRestDispatcher.java
+++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/VertxRestDispatcher.java
@@ -54,7 +54,7 @@ public class VertxRestDispatcher extends AbstractVertxHttpDispatcher {
 
   private static final String KEY_ENABLED = "servicecomb.http.dispatcher.rest.enabled";
 
-  private static final String KEY_PATTERN = "servicecomb.http.dispatcher.rest.pattern";
+  public static final String KEY_PATTERN = "servicecomb.http.dispatcher.rest.pattern";
 
   private Transport transport;
 
diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/VertxRestTransport.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/VertxRestTransport.java
index e4cb23629..3267bf28a 100644
--- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/VertxRestTransport.java
+++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/VertxRestTransport.java
@@ -17,6 +17,7 @@
 
 package org.apache.servicecomb.transport.rest.vertx;
 
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.servicecomb.core.Const;
@@ -25,15 +26,19 @@ import org.apache.servicecomb.core.transport.AbstractTransport;
 import org.apache.servicecomb.foundation.common.net.NetUtils;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.foundation.vertx.SimpleJsonObject;
 import org.apache.servicecomb.foundation.vertx.VertxUtils;
+import org.apache.servicecomb.registry.definition.DefinitionConst;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.apache.servicecomb.transport.rest.client.RestTransportClient;
 import org.apache.servicecomb.transport.rest.client.RestTransportClientManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.netflix.config.DynamicPropertyFactory;
+
 import io.vertx.core.DeploymentOptions;
 import io.vertx.core.VertxOptions;
 
@@ -54,7 +59,17 @@ public class VertxRestTransport extends AbstractTransport {
 
   @Override
   public boolean canInit() {
-    setListenAddressWithoutSchema(TransportConfig.getAddress());
+    String pattern = DynamicPropertyFactory.getInstance()
+        .getStringProperty(VertxRestDispatcher.KEY_PATTERN, null).get();
+    String urlPrefix = null;
+    if (pattern == null || pattern.length() <= 5) {
+      setListenAddressWithoutSchema(TransportConfig.getAddress());
+    } else {
+      // e.g.  "/api/(.*)" -> "/api"
+      urlPrefix = pattern.substring(0, pattern.length() - 5);
+      setListenAddressWithoutSchema(TransportConfig.getAddress(),
+          Collections.singletonMap(DefinitionConst.URL_PREFIX, urlPrefix));
+    }
 
     URIEndpointObject ep = (URIEndpointObject) getEndpoint().getAddress();
     if (ep == null) {
@@ -63,11 +78,16 @@ public class VertxRestTransport extends AbstractTransport {
 
     if (!NetUtils.canTcpListen(ep.getSocketAddress().getAddress(), ep.getPort())) {
       LOGGER.warn(
-          "Can not start VertxRestTransport, the port:{} may have been occupied. You can ignore this message if you are using a web container like tomcat.",
+          "Can not start VertxRestTransport, the port:{} may have been occupied. "
+              + "You can ignore this message if you are using a web container like tomcat.",
           ep.getPort());
       return false;
     }
 
+    if (urlPrefix != null) {
+      ClassLoaderScopeContext.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, urlPrefix);
+    }
+
     return true;
   }