Move Route and deps to api.
Rename RouteReader to RouteLocator
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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() {
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.springframework.cloud.gateway.config;
|
||||
package org.springframework.cloud.gateway.api;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.springframework.cloud.gateway.config;
|
||||
package org.springframework.cloud.gateway.api;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.springframework.cloud.gateway.config;
|
||||
package org.springframework.cloud.gateway.api;
|
||||
|
||||
import org.hibernate.validator.constraints.NotEmpty;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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() + "_";
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user