Move Route and deps to api.

Rename RouteReader to RouteLocator
This commit is contained in:
Spencer Gibb
2017-01-27 21:30:43 -07:00
parent d2ed8cc7c0
commit 9d32fec00e
17 changed files with 84 additions and 90 deletions

View File

@@ -5,9 +5,9 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import org.springframework.cloud.gateway.api.CachingRouteReader; import org.springframework.cloud.gateway.api.CachingRouteLocator;
import org.springframework.cloud.gateway.api.RouteReader; import org.springframework.cloud.gateway.api.RouteLocator;
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.GlobalFilter;
import org.springframework.cloud.gateway.filter.route.RouteFilter; import org.springframework.cloud.gateway.filter.route.RouteFilter;
import org.springframework.cloud.gateway.handler.FilteringWebHandler; import org.springframework.cloud.gateway.handler.FilteringWebHandler;
@@ -30,15 +30,15 @@ import reactor.core.publisher.Mono;
@RequestMapping("/admin/gateway") @RequestMapping("/admin/gateway")
public class GatewayEndpoint {/*extends AbstractEndpoint<Map<String, Object>> {*/ public class GatewayEndpoint {/*extends AbstractEndpoint<Map<String, Object>> {*/
private RouteReader routeReader; private RouteLocator routeLocator;
private List<GlobalFilter> globalFilters; private List<GlobalFilter> globalFilters;
private List<RouteFilter> routeFilters; private List<RouteFilter> routeFilters;
private FilteringWebHandler filteringWebHandler; private FilteringWebHandler filteringWebHandler;
public GatewayEndpoint(RouteReader routeReader, List<GlobalFilter> globalFilters, public GatewayEndpoint(RouteLocator routeLocator, List<GlobalFilter> globalFilters,
List<RouteFilter> routeFilters, FilteringWebHandler filteringWebHandler) { List<RouteFilter> routeFilters, FilteringWebHandler filteringWebHandler) {
//super("gateway"); //super("gateway");
this.routeReader = routeReader; this.routeLocator = routeLocator;
this.globalFilters = globalFilters; this.globalFilters = globalFilters;
this.routeFilters = routeFilters; this.routeFilters = routeFilters;
this.filteringWebHandler = filteringWebHandler; this.filteringWebHandler = filteringWebHandler;
@@ -51,8 +51,8 @@ public class GatewayEndpoint {/*extends AbstractEndpoint<Map<String, Object>> {*
//TODO: this should really be a listener that responds to a RefreshEvent //TODO: this should really be a listener that responds to a RefreshEvent
@PostMapping("/refresh") @PostMapping("/refresh")
public Flux<Route> refresh() { public Flux<Route> refresh() {
if (this.routeReader instanceof CachingRouteReader) { if (this.routeLocator instanceof CachingRouteLocator) {
return ((CachingRouteReader)this.routeReader).refresh(); return ((CachingRouteLocator)this.routeLocator).refresh();
} }
return Flux.empty(); return Flux.empty();
} }
@@ -84,19 +84,19 @@ public class GatewayEndpoint {/*extends AbstractEndpoint<Map<String, Object>> {*
@GetMapping("/routes") @GetMapping("/routes")
public Mono<List<Route>> routes() { public Mono<List<Route>> routes() {
return this.routeReader.getRoutes().collectList(); return this.routeLocator.getRoutes().collectList();
} }
@GetMapping("/routes/{id}") @GetMapping("/routes/{id}")
public Mono<Route> route(@PathVariable String id) { public Mono<Route> route(@PathVariable String id) {
return this.routeReader.getRoutes() return this.routeLocator.getRoutes()
.filter(route -> route.getId().equals(id)) .filter(route -> route.getId().equals(id))
.singleOrEmpty(); .singleOrEmpty();
} }
@GetMapping("/routes/{id}/combinedfilters") @GetMapping("/routes/{id}/combinedfilters")
public Map<String, Object> combinedfilters(@PathVariable String id) { public Map<String, Object> combinedfilters(@PathVariable String id) {
Mono<Route> route = this.routeReader.getRoutes() Mono<Route> route = this.routeLocator.getRoutes()
.filter(r -> r.getId().equals(id)) .filter(r -> r.getId().equals(id))
.singleOrEmpty(); .singleOrEmpty();
Optional<Route> optional = Optional.ofNullable(route.block()); //TODO: remove block(); Optional<Route> optional = Optional.ofNullable(route.block()); //TODO: remove block();

View File

@@ -3,19 +3,17 @@ package org.springframework.cloud.gateway.api;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import org.springframework.cloud.gateway.config.Route;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public class CachingRouteReader implements RouteReader { public class CachingRouteLocator implements RouteLocator {
private final RouteReader delegate; private final RouteLocator delegate;
private final AtomicReference<List<Route>> cachedRoutes = new AtomicReference<>(); private final AtomicReference<List<Route>> cachedRoutes = new AtomicReference<>();
public CachingRouteReader(RouteReader delegate) { public CachingRouteLocator(RouteLocator delegate) {
this.delegate = delegate; this.delegate = delegate;
this.cachedRoutes.compareAndSet(null, collectRoutes()); this.cachedRoutes.compareAndSet(null, collectRoutes());
} }
@@ -31,7 +29,7 @@ public class CachingRouteReader implements RouteReader {
*/ */
public Flux<Route> refresh() { public Flux<Route> refresh() {
return Flux.fromIterable(this.cachedRoutes.getAndUpdate( return Flux.fromIterable(this.cachedRoutes.getAndUpdate(
routes -> CachingRouteReader.this.collectRoutes())); routes -> CachingRouteLocator.this.collectRoutes()));
} }
private List<Route> collectRoutes() { private List<Route> collectRoutes() {

View File

@@ -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<RouteLocator> delegates;
public CompositeRouteLocator(Flux<RouteLocator> delegates) {
this.delegates = delegates;
}
@Override
public Flux<Route> getRoutes() {
return this.delegates.flatMap(RouteLocator::getRoutes);
}
}

View File

@@ -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<RouteReader> delegates;
public CompositeRouteReader(Flux<RouteReader> delegates) {
this.delegates = delegates;
}
@Override
public Flux<Route> getRoutes() {
return this.delegates.flatMap(RouteReader::getRoutes);
}
}

View File

@@ -1,4 +1,4 @@
package org.springframework.cloud.gateway.config; package org.springframework.cloud.gateway.api;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects; import java.util.Objects;

View File

@@ -1,4 +1,4 @@
package org.springframework.cloud.gateway.config; package org.springframework.cloud.gateway.api;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects; import java.util.Objects;

View File

@@ -1,4 +1,4 @@
package org.springframework.cloud.gateway.config; package org.springframework.cloud.gateway.api;
import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.validator.constraints.NotEmpty;

View File

@@ -1,13 +1,11 @@
package org.springframework.cloud.gateway.api; package org.springframework.cloud.gateway.api;
import org.springframework.cloud.gateway.config.Route;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public interface RouteReader { public interface RouteLocator {
Flux<Route> getRoutes(); Flux<Route> getRoutes();
} }

View File

@@ -10,8 +10,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.cloud.gateway.actuate.GatewayEndpoint; import org.springframework.cloud.gateway.actuate.GatewayEndpoint;
import org.springframework.cloud.gateway.api.CachingRouteReader; import org.springframework.cloud.gateway.api.CachingRouteLocator;
import org.springframework.cloud.gateway.api.RouteReader; import org.springframework.cloud.gateway.api.RouteLocator;
import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.LoadBalancerClientFilter; import org.springframework.cloud.gateway.filter.LoadBalancerClientFilter;
import org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter; import org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter;
@@ -68,10 +68,10 @@ public class GatewayAutoConfiguration {
} }
@Bean @Bean
@ConditionalOnMissingBean(RouteReader.class) @ConditionalOnMissingBean(RouteLocator.class)
public RouteReader propertiesRouteReader(GatewayProperties properties) { public RouteLocator routeLocator(GatewayProperties properties) {
//TODO: how to automatically apply CachingRouteReader //TODO: how to automatically apply CachingRouteLocator
return new CachingRouteReader(new PropertiesRouteReader(properties)); return new CachingRouteLocator(new PropertiesRouteLocator(properties));
} }
@Bean @Bean
@@ -94,8 +94,8 @@ public class GatewayAutoConfiguration {
@Bean @Bean
public RoutePredicateHandlerMapping routePredicateHandlerMapping(FilteringWebHandler webHandler, public RoutePredicateHandlerMapping routePredicateHandlerMapping(FilteringWebHandler webHandler,
Map<String, RoutePredicate> predicates, Map<String, RoutePredicate> predicates,
RouteReader routeReader) { RouteLocator routeLocator) {
return new RoutePredicateHandlerMapping(webHandler, predicates, routeReader); return new RoutePredicateHandlerMapping(webHandler, predicates, routeLocator);
} }
// GlobalFilter beans // GlobalFilter beans
@@ -238,9 +238,9 @@ public class GatewayAutoConfiguration {
protected static class GatewayActuatorConfiguration { protected static class GatewayActuatorConfiguration {
@Bean @Bean
public GatewayEndpoint gatewayEndpoint(RouteReader routeReader, List<GlobalFilter> globalFilters, public GatewayEndpoint gatewayEndpoint(RouteLocator routeLocator, List<GlobalFilter> globalFilters,
List<RouteFilter> routeFilters, FilteringWebHandler filteringWebHandler) { List<RouteFilter> routeFilters, FilteringWebHandler filteringWebHandler) {
return new GatewayEndpoint(routeReader, globalFilters, routeFilters, filteringWebHandler); return new GatewayEndpoint(routeLocator, globalFilters, routeFilters, filteringWebHandler);
} }
} }

View File

@@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.gateway.api.Route;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;

View File

@@ -1,17 +1,18 @@
package org.springframework.cloud.gateway.config; 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; import reactor.core.publisher.Flux;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public class PropertiesRouteReader implements RouteReader { public class PropertiesRouteLocator implements RouteLocator {
private final GatewayProperties properties; private final GatewayProperties properties;
public PropertiesRouteReader(GatewayProperties properties) { public PropertiesRouteLocator(GatewayProperties properties) {
this.properties = properties; this.properties = properties;
} }

View File

@@ -1,10 +1,10 @@
package org.springframework.cloud.gateway.discovery; package org.springframework.cloud.gateway.discovery;
import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.gateway.api.RouteReader; import org.springframework.cloud.gateway.api.RouteLocator;
import org.springframework.cloud.gateway.config.FilterDefinition; import org.springframework.cloud.gateway.api.FilterDefinition;
import org.springframework.cloud.gateway.config.PredicateDefinition; import org.springframework.cloud.gateway.api.PredicateDefinition;
import org.springframework.cloud.gateway.config.Route; import org.springframework.cloud.gateway.api.Route;
import reactor.core.publisher.Flux; 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 * TODO: developer configuration, in zuul, this was opt out, should be opt in
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public class DiscoveryClientRouteReader implements RouteReader { public class DiscoveryClientRouteLocator implements RouteLocator {
private final DiscoveryClient discoveryClient; private final DiscoveryClient discoveryClient;
private final String routeIdPrefix; private final String routeIdPrefix;
public DiscoveryClientRouteReader(DiscoveryClient discoveryClient) { public DiscoveryClientRouteLocator(DiscoveryClient discoveryClient) {
this.discoveryClient = discoveryClient; this.discoveryClient = discoveryClient;
this.routeIdPrefix = this.discoveryClient.getClass().getSimpleName() + "_"; this.routeIdPrefix = this.discoveryClient.getClass().getSimpleName() + "_";
} }

View File

@@ -4,7 +4,7 @@ import java.net.URI;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; 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.core.Ordered;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilterChain; import org.springframework.web.server.WebFilterChain;

View File

@@ -28,7 +28,7 @@ import java.util.stream.Collectors;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; 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.GlobalFilter;
import org.springframework.cloud.gateway.filter.route.RouteFilter; import org.springframework.cloud.gateway.filter.route.RouteFilter;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;

View File

@@ -7,16 +7,14 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Predicate; import java.util.function.Predicate;
import org.springframework.beans.BeansException; import org.springframework.cloud.gateway.api.RouteLocator;
import org.springframework.cloud.gateway.api.RouteReader; import org.springframework.cloud.gateway.api.Route;
import org.springframework.cloud.gateway.config.Route; import org.springframework.cloud.gateway.api.PredicateDefinition;
import org.springframework.cloud.gateway.config.PredicateDefinition;
import org.springframework.cloud.gateway.handler.predicate.RoutePredicate; import org.springframework.cloud.gateway.handler.predicate.RoutePredicate;
import org.springframework.web.reactive.handler.AbstractHandlerMapping; import org.springframework.web.reactive.handler.AbstractHandlerMapping;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebHandler; import org.springframework.web.server.WebHandler;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_HANDLER_MAPPER_ATTR; 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 { public class RoutePredicateHandlerMapping extends AbstractHandlerMapping {
private Map<String, RoutePredicate> predicates = new LinkedHashMap<>(); private Map<String, RoutePredicate> predicates = new LinkedHashMap<>();
private RouteReader routeReader; private RouteLocator routeLocator;
private WebHandler webHandler; private WebHandler webHandler;
public RoutePredicateHandlerMapping(WebHandler webHandler, Map<String, RoutePredicate> predicates, public RoutePredicateHandlerMapping(WebHandler webHandler, Map<String, RoutePredicate> predicates,
RouteReader routeReader) { RouteLocator routeLocator) {
this.webHandler = webHandler; this.webHandler = webHandler;
this.routeReader = routeReader; this.routeLocator = routeLocator;
predicates.forEach((name, factory) -> { predicates.forEach((name, factory) -> {
String key = normalizeName(name); String key = normalizeName(name);
@@ -95,7 +93,7 @@ public class RoutePredicateHandlerMapping extends AbstractHandlerMapping {
protected Route lookupRoute(ServerWebExchange exchange) throws Exception { protected Route lookupRoute(ServerWebExchange exchange) throws Exception {
List<Route> routes = this.routeReader.getRoutes().collectList().block(); //TODO: convert rest of class to Reactive List<Route> routes = this.routeLocator.getRoutes().collectList().block(); //TODO: convert rest of class to Reactive
for (Route route : routes) { for (Route route : routes) {
if (!route.getPredicates().isEmpty()) { if (!route.getPredicates().isEmpty()) {

View File

@@ -12,7 +12,7 @@ import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.context.embedded.LocalServerPort;
import org.springframework.boot.test.context.SpringBootTest; 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.filter.GlobalFilter;
import org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping; import org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;

View File

@@ -5,12 +5,12 @@ import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.gateway.api.CachingRouteReader; import org.springframework.cloud.gateway.api.CachingRouteLocator;
import org.springframework.cloud.gateway.api.CompositeRouteReader; import org.springframework.cloud.gateway.api.CompositeRouteLocator;
import org.springframework.cloud.gateway.api.RouteReader; import org.springframework.cloud.gateway.api.RouteLocator;
import org.springframework.cloud.gateway.config.GatewayProperties; import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.config.PropertiesRouteReader; import org.springframework.cloud.gateway.config.PropertiesRouteLocator;
import org.springframework.cloud.gateway.discovery.DiscoveryClientRouteReader; import org.springframework.cloud.gateway.discovery.DiscoveryClientRouteLocator;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
@@ -33,22 +33,22 @@ public class GatewayTestApplication {
protected static class GatewayDiscoveryConfiguration { protected static class GatewayDiscoveryConfiguration {
@Bean @Bean
public DiscoveryClientRouteReader discoveryClientRouteReader(DiscoveryClient discoveryClient) { public DiscoveryClientRouteLocator discoveryClientRouteLocator(DiscoveryClient discoveryClient) {
return new DiscoveryClientRouteReader(discoveryClient); return new DiscoveryClientRouteLocator(discoveryClient);
} }
@Bean @Bean
public PropertiesRouteReader propertiesRouteReader(GatewayProperties properties) { public PropertiesRouteLocator propertiesRouteLocator(GatewayProperties properties) {
return new PropertiesRouteReader(properties); return new PropertiesRouteLocator(properties);
} }
@Bean @Bean
@Primary @Primary
public RouteReader compositeRouteReader(DiscoveryClientRouteReader discoveryClientRouteReader, public RouteLocator compositeRouteLocator(DiscoveryClientRouteLocator discoveryClientRouteLocator,
PropertiesRouteReader propertiesRouteReader) { PropertiesRouteLocator propertiesRouteLocator) {
final Flux<RouteReader> flux = Flux.just(discoveryClientRouteReader, propertiesRouteReader); final Flux<RouteLocator> flux = Flux.just(discoveryClientRouteLocator, propertiesRouteLocator);
final CompositeRouteReader composite = new CompositeRouteReader(flux); final CompositeRouteLocator composite = new CompositeRouteLocator(flux);
return new CachingRouteReader(composite); return new CachingRouteLocator(composite);
} }
} }