diff --git a/src/main/java/org/springframework/cloud/gateway/actuate/GatewayEndpoint.java b/src/main/java/org/springframework/cloud/gateway/actuate/GatewayEndpoint.java index 92ecfd33..2d32065f 100644 --- a/src/main/java/org/springframework/cloud/gateway/actuate/GatewayEndpoint.java +++ b/src/main/java/org/springframework/cloud/gateway/actuate/GatewayEndpoint.java @@ -5,9 +5,9 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import org.springframework.cloud.gateway.api.CachingRouteReader; -import org.springframework.cloud.gateway.api.RouteReader; -import org.springframework.cloud.gateway.config.Route; +import org.springframework.cloud.gateway.api.CachingRouteLocator; +import org.springframework.cloud.gateway.api.RouteLocator; +import org.springframework.cloud.gateway.api.Route; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.filter.route.RouteFilter; import org.springframework.cloud.gateway.handler.FilteringWebHandler; @@ -30,15 +30,15 @@ import reactor.core.publisher.Mono; @RequestMapping("/admin/gateway") public class GatewayEndpoint {/*extends AbstractEndpoint> {*/ - private RouteReader routeReader; + private RouteLocator routeLocator; private List globalFilters; private List routeFilters; private FilteringWebHandler filteringWebHandler; - public GatewayEndpoint(RouteReader routeReader, List globalFilters, + public GatewayEndpoint(RouteLocator routeLocator, List globalFilters, List routeFilters, FilteringWebHandler filteringWebHandler) { //super("gateway"); - this.routeReader = routeReader; + this.routeLocator = routeLocator; this.globalFilters = globalFilters; this.routeFilters = routeFilters; this.filteringWebHandler = filteringWebHandler; @@ -51,8 +51,8 @@ public class GatewayEndpoint {/*extends AbstractEndpoint> {* //TODO: this should really be a listener that responds to a RefreshEvent @PostMapping("/refresh") public Flux refresh() { - if (this.routeReader instanceof CachingRouteReader) { - return ((CachingRouteReader)this.routeReader).refresh(); + if (this.routeLocator instanceof CachingRouteLocator) { + return ((CachingRouteLocator)this.routeLocator).refresh(); } return Flux.empty(); } @@ -84,19 +84,19 @@ public class GatewayEndpoint {/*extends AbstractEndpoint> {* @GetMapping("/routes") public Mono> routes() { - return this.routeReader.getRoutes().collectList(); + return this.routeLocator.getRoutes().collectList(); } @GetMapping("/routes/{id}") public Mono route(@PathVariable String id) { - return this.routeReader.getRoutes() + return this.routeLocator.getRoutes() .filter(route -> route.getId().equals(id)) .singleOrEmpty(); } @GetMapping("/routes/{id}/combinedfilters") public Map combinedfilters(@PathVariable String id) { - Mono route = this.routeReader.getRoutes() + Mono route = this.routeLocator.getRoutes() .filter(r -> r.getId().equals(id)) .singleOrEmpty(); Optional optional = Optional.ofNullable(route.block()); //TODO: remove block(); diff --git a/src/main/java/org/springframework/cloud/gateway/api/CachingRouteReader.java b/src/main/java/org/springframework/cloud/gateway/api/CachingRouteLocator.java similarity index 73% rename from src/main/java/org/springframework/cloud/gateway/api/CachingRouteReader.java rename to src/main/java/org/springframework/cloud/gateway/api/CachingRouteLocator.java index 1e737358..6a4cda55 100644 --- a/src/main/java/org/springframework/cloud/gateway/api/CachingRouteReader.java +++ b/src/main/java/org/springframework/cloud/gateway/api/CachingRouteLocator.java @@ -3,19 +3,17 @@ package org.springframework.cloud.gateway.api; import java.util.List; import java.util.concurrent.atomic.AtomicReference; -import org.springframework.cloud.gateway.config.Route; - import reactor.core.publisher.Flux; /** * @author Spencer Gibb */ -public class CachingRouteReader implements RouteReader { +public class CachingRouteLocator implements RouteLocator { - private final RouteReader delegate; + private final RouteLocator delegate; private final AtomicReference> cachedRoutes = new AtomicReference<>(); - public CachingRouteReader(RouteReader delegate) { + public CachingRouteLocator(RouteLocator delegate) { this.delegate = delegate; this.cachedRoutes.compareAndSet(null, collectRoutes()); } @@ -31,7 +29,7 @@ public class CachingRouteReader implements RouteReader { */ public Flux refresh() { return Flux.fromIterable(this.cachedRoutes.getAndUpdate( - routes -> CachingRouteReader.this.collectRoutes())); + routes -> CachingRouteLocator.this.collectRoutes())); } private List collectRoutes() { diff --git a/src/main/java/org/springframework/cloud/gateway/api/CompositeRouteLocator.java b/src/main/java/org/springframework/cloud/gateway/api/CompositeRouteLocator.java new file mode 100644 index 00000000..3bb2bc76 --- /dev/null +++ b/src/main/java/org/springframework/cloud/gateway/api/CompositeRouteLocator.java @@ -0,0 +1,20 @@ +package org.springframework.cloud.gateway.api; + +import reactor.core.publisher.Flux; + +/** + * @author Spencer Gibb + */ +public class CompositeRouteLocator implements RouteLocator { + + private final Flux delegates; + + public CompositeRouteLocator(Flux delegates) { + this.delegates = delegates; + } + + @Override + public Flux getRoutes() { + return this.delegates.flatMap(RouteLocator::getRoutes); + } +} diff --git a/src/main/java/org/springframework/cloud/gateway/api/CompositeRouteReader.java b/src/main/java/org/springframework/cloud/gateway/api/CompositeRouteReader.java deleted file mode 100644 index c2b4d76b..00000000 --- a/src/main/java/org/springframework/cloud/gateway/api/CompositeRouteReader.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.springframework.cloud.gateway.api; - -import org.springframework.cloud.gateway.config.Route; - -import reactor.core.publisher.Flux; - -/** - * @author Spencer Gibb - */ -public class CompositeRouteReader implements RouteReader { - - private final Flux delegates; - - public CompositeRouteReader(Flux delegates) { - this.delegates = delegates; - } - - @Override - public Flux getRoutes() { - return this.delegates.flatMap(RouteReader::getRoutes); - } -} diff --git a/src/main/java/org/springframework/cloud/gateway/config/FilterDefinition.java b/src/main/java/org/springframework/cloud/gateway/api/FilterDefinition.java similarity index 96% rename from src/main/java/org/springframework/cloud/gateway/config/FilterDefinition.java rename to src/main/java/org/springframework/cloud/gateway/api/FilterDefinition.java index 6d525810..32ecb9a6 100644 --- a/src/main/java/org/springframework/cloud/gateway/config/FilterDefinition.java +++ b/src/main/java/org/springframework/cloud/gateway/api/FilterDefinition.java @@ -1,4 +1,4 @@ -package org.springframework.cloud.gateway.config; +package org.springframework.cloud.gateway.api; import java.util.Arrays; import java.util.Objects; diff --git a/src/main/java/org/springframework/cloud/gateway/config/PredicateDefinition.java b/src/main/java/org/springframework/cloud/gateway/api/PredicateDefinition.java similarity index 96% rename from src/main/java/org/springframework/cloud/gateway/config/PredicateDefinition.java rename to src/main/java/org/springframework/cloud/gateway/api/PredicateDefinition.java index 4f96ef92..8f5f1d5c 100644 --- a/src/main/java/org/springframework/cloud/gateway/config/PredicateDefinition.java +++ b/src/main/java/org/springframework/cloud/gateway/api/PredicateDefinition.java @@ -1,4 +1,4 @@ -package org.springframework.cloud.gateway.config; +package org.springframework.cloud.gateway.api; import java.util.Arrays; import java.util.Objects; diff --git a/src/main/java/org/springframework/cloud/gateway/config/Route.java b/src/main/java/org/springframework/cloud/gateway/api/Route.java similarity index 97% rename from src/main/java/org/springframework/cloud/gateway/config/Route.java rename to src/main/java/org/springframework/cloud/gateway/api/Route.java index 42749335..3ad8717d 100644 --- a/src/main/java/org/springframework/cloud/gateway/config/Route.java +++ b/src/main/java/org/springframework/cloud/gateway/api/Route.java @@ -1,4 +1,4 @@ -package org.springframework.cloud.gateway.config; +package org.springframework.cloud.gateway.api; import org.hibernate.validator.constraints.NotEmpty; diff --git a/src/main/java/org/springframework/cloud/gateway/api/RouteReader.java b/src/main/java/org/springframework/cloud/gateway/api/RouteLocator.java similarity index 62% rename from src/main/java/org/springframework/cloud/gateway/api/RouteReader.java rename to src/main/java/org/springframework/cloud/gateway/api/RouteLocator.java index de3dd1cd..a352d77b 100644 --- a/src/main/java/org/springframework/cloud/gateway/api/RouteReader.java +++ b/src/main/java/org/springframework/cloud/gateway/api/RouteLocator.java @@ -1,13 +1,11 @@ package org.springframework.cloud.gateway.api; -import org.springframework.cloud.gateway.config.Route; - import reactor.core.publisher.Flux; /** * @author Spencer Gibb */ -public interface RouteReader { +public interface RouteLocator { Flux getRoutes(); } diff --git a/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java b/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java index f5d012f4..3c84969f 100644 --- a/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java +++ b/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java @@ -10,8 +10,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.gateway.actuate.GatewayEndpoint; -import org.springframework.cloud.gateway.api.CachingRouteReader; -import org.springframework.cloud.gateway.api.RouteReader; +import org.springframework.cloud.gateway.api.CachingRouteLocator; +import org.springframework.cloud.gateway.api.RouteLocator; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.filter.LoadBalancerClientFilter; import org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter; @@ -68,10 +68,10 @@ public class GatewayAutoConfiguration { } @Bean - @ConditionalOnMissingBean(RouteReader.class) - public RouteReader propertiesRouteReader(GatewayProperties properties) { - //TODO: how to automatically apply CachingRouteReader - return new CachingRouteReader(new PropertiesRouteReader(properties)); + @ConditionalOnMissingBean(RouteLocator.class) + public RouteLocator routeLocator(GatewayProperties properties) { + //TODO: how to automatically apply CachingRouteLocator + return new CachingRouteLocator(new PropertiesRouteLocator(properties)); } @Bean @@ -94,8 +94,8 @@ public class GatewayAutoConfiguration { @Bean public RoutePredicateHandlerMapping routePredicateHandlerMapping(FilteringWebHandler webHandler, Map predicates, - RouteReader routeReader) { - return new RoutePredicateHandlerMapping(webHandler, predicates, routeReader); + RouteLocator routeLocator) { + return new RoutePredicateHandlerMapping(webHandler, predicates, routeLocator); } // GlobalFilter beans @@ -238,9 +238,9 @@ public class GatewayAutoConfiguration { protected static class GatewayActuatorConfiguration { @Bean - public GatewayEndpoint gatewayEndpoint(RouteReader routeReader, List globalFilters, + public GatewayEndpoint gatewayEndpoint(RouteLocator routeLocator, List globalFilters, List routeFilters, FilteringWebHandler filteringWebHandler) { - return new GatewayEndpoint(routeReader, globalFilters, routeFilters, filteringWebHandler); + return new GatewayEndpoint(routeLocator, globalFilters, routeFilters, filteringWebHandler); } } diff --git a/src/main/java/org/springframework/cloud/gateway/config/GatewayProperties.java b/src/main/java/org/springframework/cloud/gateway/config/GatewayProperties.java index 1321c440..b61abb06 100644 --- a/src/main/java/org/springframework/cloud/gateway/config/GatewayProperties.java +++ b/src/main/java/org/springframework/cloud/gateway/config/GatewayProperties.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.gateway.api.Route; import javax.validation.Valid; import javax.validation.constraints.NotNull; diff --git a/src/main/java/org/springframework/cloud/gateway/config/PropertiesRouteReader.java b/src/main/java/org/springframework/cloud/gateway/config/PropertiesRouteLocator.java similarity index 56% rename from src/main/java/org/springframework/cloud/gateway/config/PropertiesRouteReader.java rename to src/main/java/org/springframework/cloud/gateway/config/PropertiesRouteLocator.java index 5be5c23b..fb5a88f2 100644 --- a/src/main/java/org/springframework/cloud/gateway/config/PropertiesRouteReader.java +++ b/src/main/java/org/springframework/cloud/gateway/config/PropertiesRouteLocator.java @@ -1,17 +1,18 @@ package org.springframework.cloud.gateway.config; -import org.springframework.cloud.gateway.api.RouteReader; +import org.springframework.cloud.gateway.api.Route; +import org.springframework.cloud.gateway.api.RouteLocator; import reactor.core.publisher.Flux; /** * @author Spencer Gibb */ -public class PropertiesRouteReader implements RouteReader { +public class PropertiesRouteLocator implements RouteLocator { private final GatewayProperties properties; - public PropertiesRouteReader(GatewayProperties properties) { + public PropertiesRouteLocator(GatewayProperties properties) { this.properties = properties; } diff --git a/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteReader.java b/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteLocator.java similarity index 79% rename from src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteReader.java rename to src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteLocator.java index 031b9f53..fbaa9e44 100644 --- a/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteReader.java +++ b/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteLocator.java @@ -1,10 +1,10 @@ package org.springframework.cloud.gateway.discovery; import org.springframework.cloud.client.discovery.DiscoveryClient; -import org.springframework.cloud.gateway.api.RouteReader; -import org.springframework.cloud.gateway.config.FilterDefinition; -import org.springframework.cloud.gateway.config.PredicateDefinition; -import org.springframework.cloud.gateway.config.Route; +import org.springframework.cloud.gateway.api.RouteLocator; +import org.springframework.cloud.gateway.api.FilterDefinition; +import org.springframework.cloud.gateway.api.PredicateDefinition; +import org.springframework.cloud.gateway.api.Route; import reactor.core.publisher.Flux; @@ -14,12 +14,12 @@ import java.net.URI; * TODO: developer configuration, in zuul, this was opt out, should be opt in * @author Spencer Gibb */ -public class DiscoveryClientRouteReader implements RouteReader { +public class DiscoveryClientRouteLocator implements RouteLocator { private final DiscoveryClient discoveryClient; private final String routeIdPrefix; - public DiscoveryClientRouteReader(DiscoveryClient discoveryClient) { + public DiscoveryClientRouteLocator(DiscoveryClient discoveryClient) { this.discoveryClient = discoveryClient; this.routeIdPrefix = this.discoveryClient.getClass().getSimpleName() + "_"; } diff --git a/src/main/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilter.java index 268666ac..fb7f4916 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilter.java @@ -4,7 +4,7 @@ import java.net.URI; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.cloud.gateway.config.Route; +import org.springframework.cloud.gateway.api.Route; import org.springframework.core.Ordered; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilterChain; diff --git a/src/main/java/org/springframework/cloud/gateway/handler/FilteringWebHandler.java b/src/main/java/org/springframework/cloud/gateway/handler/FilteringWebHandler.java index 11e9c0c3..bf388935 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/FilteringWebHandler.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/FilteringWebHandler.java @@ -28,7 +28,7 @@ import java.util.stream.Collectors; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.cloud.gateway.config.Route; +import org.springframework.cloud.gateway.api.Route; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.filter.route.RouteFilter; import org.springframework.core.Ordered; diff --git a/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java b/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java index 7d11d1bb..0bfd015e 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java @@ -7,16 +7,14 @@ import java.util.List; import java.util.Map; import java.util.function.Predicate; -import org.springframework.beans.BeansException; -import org.springframework.cloud.gateway.api.RouteReader; -import org.springframework.cloud.gateway.config.Route; -import org.springframework.cloud.gateway.config.PredicateDefinition; +import org.springframework.cloud.gateway.api.RouteLocator; +import org.springframework.cloud.gateway.api.Route; +import org.springframework.cloud.gateway.api.PredicateDefinition; import org.springframework.cloud.gateway.handler.predicate.RoutePredicate; import org.springframework.web.reactive.handler.AbstractHandlerMapping; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebHandler; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_HANDLER_MAPPER_ATTR; @@ -28,13 +26,13 @@ import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.G public class RoutePredicateHandlerMapping extends AbstractHandlerMapping { private Map predicates = new LinkedHashMap<>(); - private RouteReader routeReader; + private RouteLocator routeLocator; private WebHandler webHandler; public RoutePredicateHandlerMapping(WebHandler webHandler, Map predicates, - RouteReader routeReader) { + RouteLocator routeLocator) { this.webHandler = webHandler; - this.routeReader = routeReader; + this.routeLocator = routeLocator; predicates.forEach((name, factory) -> { String key = normalizeName(name); @@ -95,7 +93,7 @@ public class RoutePredicateHandlerMapping extends AbstractHandlerMapping { protected Route lookupRoute(ServerWebExchange exchange) throws Exception { - List routes = this.routeReader.getRoutes().collectList().block(); //TODO: convert rest of class to Reactive + List routes = this.routeLocator.getRoutes().collectList().block(); //TODO: convert rest of class to Reactive for (Route route : routes) { if (!route.getPredicates().isEmpty()) { diff --git a/src/test/java/org/springframework/cloud/gateway/test/GatewayIntegrationTests.java b/src/test/java/org/springframework/cloud/gateway/test/GatewayIntegrationTests.java index 089c067e..07c0b9de 100644 --- a/src/test/java/org/springframework/cloud/gateway/test/GatewayIntegrationTests.java +++ b/src/test/java/org/springframework/cloud/gateway/test/GatewayIntegrationTests.java @@ -12,7 +12,7 @@ import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.gateway.config.Route; +import org.springframework.cloud.gateway.api.Route; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping; import org.springframework.context.annotation.Bean; diff --git a/src/test/java/org/springframework/cloud/gateway/test/GatewayTestApplication.java b/src/test/java/org/springframework/cloud/gateway/test/GatewayTestApplication.java index 88997176..46eace07 100644 --- a/src/test/java/org/springframework/cloud/gateway/test/GatewayTestApplication.java +++ b/src/test/java/org/springframework/cloud/gateway/test/GatewayTestApplication.java @@ -5,12 +5,12 @@ import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.cloud.gateway.api.CachingRouteReader; -import org.springframework.cloud.gateway.api.CompositeRouteReader; -import org.springframework.cloud.gateway.api.RouteReader; +import org.springframework.cloud.gateway.api.CachingRouteLocator; +import org.springframework.cloud.gateway.api.CompositeRouteLocator; +import org.springframework.cloud.gateway.api.RouteLocator; import org.springframework.cloud.gateway.config.GatewayProperties; -import org.springframework.cloud.gateway.config.PropertiesRouteReader; -import org.springframework.cloud.gateway.discovery.DiscoveryClientRouteReader; +import org.springframework.cloud.gateway.config.PropertiesRouteLocator; +import org.springframework.cloud.gateway.discovery.DiscoveryClientRouteLocator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; @@ -33,22 +33,22 @@ public class GatewayTestApplication { protected static class GatewayDiscoveryConfiguration { @Bean - public DiscoveryClientRouteReader discoveryClientRouteReader(DiscoveryClient discoveryClient) { - return new DiscoveryClientRouteReader(discoveryClient); + public DiscoveryClientRouteLocator discoveryClientRouteLocator(DiscoveryClient discoveryClient) { + return new DiscoveryClientRouteLocator(discoveryClient); } @Bean - public PropertiesRouteReader propertiesRouteReader(GatewayProperties properties) { - return new PropertiesRouteReader(properties); + public PropertiesRouteLocator propertiesRouteLocator(GatewayProperties properties) { + return new PropertiesRouteLocator(properties); } @Bean @Primary - public RouteReader compositeRouteReader(DiscoveryClientRouteReader discoveryClientRouteReader, - PropertiesRouteReader propertiesRouteReader) { - final Flux flux = Flux.just(discoveryClientRouteReader, propertiesRouteReader); - final CompositeRouteReader composite = new CompositeRouteReader(flux); - return new CachingRouteReader(composite); + public RouteLocator compositeRouteLocator(DiscoveryClientRouteLocator discoveryClientRouteLocator, + PropertiesRouteLocator propertiesRouteLocator) { + final Flux flux = Flux.just(discoveryClientRouteLocator, propertiesRouteLocator); + final CompositeRouteLocator composite = new CompositeRouteLocator(flux); + return new CachingRouteLocator(composite); } }