From 18e116c1c6e856f6c71b4aba41a41aa2c6dc13bb Mon Sep 17 00:00:00 2001 From: liruihao Date: Tue, 7 Mar 2023 13:19:04 +0800 Subject: [PATCH 1/2] Adds attribute for PathContainer to avoid repeating parsePath in PathRoutePredicateFactory Fixes gh-2884 --- spring-cloud-gateway-server/pom.xml | 11 +++ .../predicate/PathRoutePredicateFactory.java | 8 +- .../support/ServerWebExchangeUtils.java | 5 ++ ...dicatePathContainerAttrBenchMarkTests.java | 78 +++++++++++++++++++ 4 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicatePathContainerAttrBenchMarkTests.java diff --git a/spring-cloud-gateway-server/pom.xml b/spring-cloud-gateway-server/pom.xml index e6e8f5023..ac540872b 100644 --- a/spring-cloud-gateway-server/pom.xml +++ b/spring-cloud-gateway-server/pom.xml @@ -170,6 +170,17 @@ junit-jupiter test + + org.openjdk.jmh + jmh-core + 1.20 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.20 + provided + diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java index e9772fc38..32ea2ce88 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java @@ -34,6 +34,7 @@ import org.springframework.web.util.pattern.PathPatternParser; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_PREDICATE_MATCHED_PATH_ATTR; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_PREDICATE_MATCHED_PATH_ROUTE_ID_ATTR; +import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_PREDICATE_PATH_CONTAINER_ATTR; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_PREDICATE_ROUTE_ATTR; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.putUriTemplateVariables; import static org.springframework.http.server.PathContainer.parsePath; @@ -89,7 +90,12 @@ public class PathRoutePredicateFactory extends AbstractRoutePredicateFactory> predicates; + + private static String PATH_PATTERN_PREFIX; + + private final static String HOST = "http://localhost:8080"; + + private final static int ROUTES_NUM = 2000; + + static { + predicates = new LinkedList<>(); + PATH_PATTERN_PREFIX = String.format("/%s/%s/", RandomStringUtils.random(20, true, false), + RandomStringUtils.random(10, true, false)); + for (int i = 0; i < ROUTES_NUM; i++) { + PathRoutePredicateFactory.Config config = new PathRoutePredicateFactory.Config() + .setPatterns(Collections.singletonList(PATH_PATTERN_PREFIX + i)).setMatchTrailingSlash(true); + Predicate predicate = new PathRoutePredicateFactory().apply(config); + predicates.add(predicate); + } + } + + @Benchmark + @Threads(2) + @Fork(2) + @BenchmarkMode(Mode.All) + @Warmup(iterations = 1, time = 3) + @Measurement(iterations = 10, time = 1) + public void testPathContainerAttr() { + Random random = new Random(); + MockServerHttpRequest request = MockServerHttpRequest + .get(HOST + PATH_PATTERN_PREFIX + random.nextInt(ROUTES_NUM)).build(); + MockServerWebExchange exchange = MockServerWebExchange.from(request); + for (Predicate predicate : predicates) { + if (predicate.test(exchange)) { + break; + } + } + } + +} From 5d8c2cf898bc36cce44c382f4e502c67ac930200 Mon Sep 17 00:00:00 2001 From: spencergibb Date: Wed, 15 Mar 2023 16:20:45 -0400 Subject: [PATCH 2/2] Polish "Add ServerWebExchange a new attribute for PathContainer to avoid repeating parsePath in PathRoutePredicateFactory." See gh-2884 --- spring-cloud-gateway-server/pom.xml | 3 ++- .../handler/predicate/PathRoutePredicateFactory.java | 9 +++------ ...athRoutePredicatePathContainerAttrBenchMarkTests.java | 4 ++++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/spring-cloud-gateway-server/pom.xml b/spring-cloud-gateway-server/pom.xml index ac540872b..089ebed4a 100644 --- a/spring-cloud-gateway-server/pom.xml +++ b/spring-cloud-gateway-server/pom.xml @@ -174,12 +174,13 @@ org.openjdk.jmh jmh-core 1.20 + test org.openjdk.jmh jmh-generator-annprocess 1.20 - provided + test diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java index 32ea2ce88..f4a1d7c73 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java @@ -90,12 +90,9 @@ public class PathRoutePredicateFactory extends AbstractRoutePredicateFactory parsePath(exchange.getRequest().getURI().getRawPath())); PathPattern match = null; for (int i = 0; i < pathPatterns.size(); i++) { diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicatePathContainerAttrBenchMarkTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicatePathContainerAttrBenchMarkTests.java index db853f324..92032d0ea 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicatePathContainerAttrBenchMarkTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicatePathContainerAttrBenchMarkTests.java @@ -75,4 +75,8 @@ public class PathRoutePredicatePathContainerAttrBenchMarkTests { } } + public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); + } + }