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.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<Map<String, Object>> {*/
private RouteReader routeReader;
private RouteLocator routeLocator;
private List<GlobalFilter> globalFilters;
private List<RouteFilter> routeFilters;
private FilteringWebHandler filteringWebHandler;
public GatewayEndpoint(RouteReader routeReader, List<GlobalFilter> globalFilters,
public GatewayEndpoint(RouteLocator routeLocator, List<GlobalFilter> globalFilters,
List<RouteFilter> 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<Map<String, Object>> {*
//TODO: this should really be a listener that responds to a RefreshEvent
@PostMapping("/refresh")
public Flux<Route> 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<Map<String, Object>> {*
@GetMapping("/routes")
public Mono<List<Route>> routes() {
return this.routeReader.getRoutes().collectList();
return this.routeLocator.getRoutes().collectList();
}
@GetMapping("/routes/{id}")
public Mono<Route> 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<String, Object> combinedfilters(@PathVariable String id) {
Mono<Route> route = this.routeReader.getRoutes()
Mono<Route> route = this.routeLocator.getRoutes()
.filter(r -> r.getId().equals(id))
.singleOrEmpty();
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.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<List<Route>> 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<Route> refresh() {
return Flux.fromIterable(this.cachedRoutes.getAndUpdate(
routes -> CachingRouteReader.this.collectRoutes()));
routes -> CachingRouteLocator.this.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.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.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;

View File

@@ -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<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.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<String, RoutePredicate> 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<GlobalFilter> globalFilters,
public GatewayEndpoint gatewayEndpoint(RouteLocator routeLocator, List<GlobalFilter> globalFilters,
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 org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.gateway.api.Route;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;

View File

@@ -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;
}

View File

@@ -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() + "_";
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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<String, RoutePredicate> predicates = new LinkedHashMap<>();
private RouteReader routeReader;
private RouteLocator routeLocator;
private WebHandler webHandler;
public RoutePredicateHandlerMapping(WebHandler webHandler, Map<String, RoutePredicate> 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<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) {
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.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;

View File

@@ -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<RouteReader> flux = Flux.just(discoveryClientRouteReader, propertiesRouteReader);
final CompositeRouteReader composite = new CompositeRouteReader(flux);
return new CachingRouteReader(composite);
public RouteLocator compositeRouteLocator(DiscoveryClientRouteLocator discoveryClientRouteLocator,
PropertiesRouteLocator propertiesRouteLocator) {
final Flux<RouteLocator> flux = Flux.just(discoveryClientRouteLocator, propertiesRouteLocator);
final CompositeRouteLocator composite = new CompositeRouteLocator(flux);
return new CachingRouteLocator(composite);
}
}