diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/CachingRouteLocator.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/CachingRouteLocator.java index 79ea88c5..1d69cb25 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/CachingRouteLocator.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/CachingRouteLocator.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicReference; import org.springframework.context.event.EventListener; +import org.springframework.core.annotation.AnnotationAwareOrderComparator; import reactor.core.publisher.Flux; @@ -52,7 +53,9 @@ public class CachingRouteLocator implements RouteLocator { } private List collectRoutes() { - return this.delegate.getRoutes().collectList().block(); + List routes = this.delegate.getRoutes().collectList().block(); + AnnotationAwareOrderComparator.sort(routes); + return routes; } @EventListener(RefreshRoutesEvent.class) diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/Route.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/Route.java index 609abf20..e0c3fc32 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/Route.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/Route.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Objects; import java.util.function.Predicate; +import org.springframework.core.Ordered; import org.springframework.util.Assert; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; @@ -32,12 +33,14 @@ import org.springframework.web.server.WebFilter; /** * @author Spencer Gibb */ -public class Route { +public class Route implements Ordered { private final String id; private final URI uri; + private final int order; + private final Predicate predicate; private final List webFilters; @@ -49,12 +52,14 @@ public class Route { public static Builder builder(RouteDefinition routeDefinition) { return new Builder() .id(routeDefinition.getId()) - .uri(routeDefinition.getUri()); + .uri(routeDefinition.getUri()) + .order(routeDefinition.getOrder()); } - public Route(String id, URI uri, Predicate predicate, List webFilters) { + public Route(String id, URI uri, int order, Predicate predicate, List webFilters) { this.id = id; this.uri = uri; + this.order = order; this.predicate = predicate; this.webFilters = webFilters; } @@ -64,6 +69,8 @@ public class Route { private URI uri; + private int order = 0; + private Predicate predicate; private List webFilters = new ArrayList<>(); @@ -80,6 +87,11 @@ public class Route { return this; } + public Builder order(int order) { + this.order = order; + return this; + } + public Builder uri(URI uri) { this.uri = uri; return this; @@ -110,7 +122,7 @@ public class Route { Assert.notNull(this.uri, "uri can not be null"); //TODO: Assert.notNull(this.predicate, "predicate can not be null"); - return new Route(this.id, this.uri, this.predicate, this.webFilters); + return new Route(this.id, this.uri, this.order, this.predicate, this.webFilters); } } @@ -122,6 +134,10 @@ public class Route { return this.uri; } + public int getOrder() { + return order; + } + public Predicate getPredicate() { return this.predicate; } @@ -137,6 +153,7 @@ public class Route { Route route = (Route) o; return Objects.equals(id, route.id) && Objects.equals(uri, route.uri) && + Objects.equals(order, route.order) && Objects.equals(predicate, route.predicate) && Objects.equals(webFilters, route.webFilters); } @@ -151,6 +168,7 @@ public class Route { final StringBuffer sb = new StringBuffer("Route{"); sb.append("id='").append(id).append('\''); sb.append(", uri=").append(uri); + sb.append(", order=").append(order); sb.append(", predicate=").append(predicate); sb.append(", webFilters=").append(webFilters); sb.append('}'); diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/RouteDefinition.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/RouteDefinition.java index 403a654b..5c7b87de 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/RouteDefinition.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/RouteDefinition.java @@ -49,6 +49,8 @@ public class RouteDefinition { @NotNull private URI uri; + private int order = 0; + public RouteDefinition() {} public RouteDefinition(String text) { @@ -101,6 +103,14 @@ public class RouteDefinition { this.uri = uri; } + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -108,6 +118,7 @@ public class RouteDefinition { RouteDefinition routeDefinition = (RouteDefinition) o; return Objects.equals(id, routeDefinition.id) && Objects.equals(predicates, routeDefinition.predicates) && + Objects.equals(order, routeDefinition.order) && Objects.equals(uri, routeDefinition.uri); } @@ -123,6 +134,7 @@ public class RouteDefinition { ", predicates=" + predicates + ", filters=" + filters + ", uri=" + uri + + ", order=" + order + '}'; } } diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionLocator.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionLocator.java index 0e87938e..e27dacd6 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionLocator.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionLocator.java @@ -17,7 +17,6 @@ package org.springframework.cloud.gateway.route; -import org.springframework.cloud.gateway.route.RouteDefinition; import reactor.core.publisher.Flux; /** diff --git a/spring-cloud-gateway-core/src/test/resources/application.yml b/spring-cloud-gateway-core/src/test/resources/application.yml index 826790bb..88f400be 100644 --- a/spring-cloud-gateway-core/src/test/resources/application.yml +++ b/spring-cloud-gateway-core/src/test/resources/application.yml @@ -178,6 +178,7 @@ spring: # ===================================== - id: default_path_to_httpbin uri: ${test.uri} + order: 10000 predicates: - name: Path args: diff --git a/spring-cloud-gateway-sample/src/main/resources/application.yml b/spring-cloud-gateway-sample/src/main/resources/application.yml index 1714f7af..a0134647 100644 --- a/spring-cloud-gateway-sample/src/main/resources/application.yml +++ b/spring-cloud-gateway-sample/src/main/resources/application.yml @@ -13,6 +13,7 @@ spring: # ===================================== - id: default_path_to_httpbin uri: ${test.uri} + order: 10000 predicates: - Path=/**