From 18e116c1c6e856f6c71b4aba41a41aa2c6dc13bb Mon Sep 17 00:00:00 2001 From: liruihao Date: Tue, 7 Mar 2023 13:19:04 +0800 Subject: [PATCH] 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 e6e8f502..ac540872 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 e9772fc3..32ea2ce8 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; + } + } + } + +}