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;
}