Skip to content

Commit 9557d12

Browse files
FantasticDreamspencergibb
authored andcommitted
Adds sorted filter cache switch.
Fixes gh-2760 Fixes gh-2756
1 parent 276b1cc commit 9557d12

File tree

2 files changed

+44
-8
lines changed

2 files changed

+44
-8
lines changed

spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayProperties.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,21 @@ public class GatewayProperties {
6868
*/
6969
private boolean failOnRouteDefinitionError = true;
7070

71+
/**
72+
* org.springframework.cloud.gateway.handler.FilteringWebHandler#handle add filter cache
73+
* if true then enable filter cache
74+
*/
75+
private boolean filterCache = false;
76+
77+
public boolean isFilterCache() {
78+
return filterCache;
79+
}
80+
81+
public void setFilterCache(boolean filterCache) {
82+
this.filterCache = filterCache;
83+
}
84+
85+
7186
public List<RouteDefinition> getRoutes() {
7287
return routes;
7388
}
@@ -109,7 +124,7 @@ public String toString() {
109124
.append("defaultFilters", defaultFilters)
110125
.append("streamingMediaTypes", streamingMediaTypes)
111126
.append("failOnRouteDefinitionError", failOnRouteDefinitionError)
112-
.toString();
127+
.append("filterCache", filterCache).toString();
113128

114129
}
115130

spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/FilteringWebHandler.java

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818

1919
import java.util.ArrayList;
2020
import java.util.List;
21+
import java.util.concurrent.ConcurrentHashMap;
2122
import java.util.stream.Collectors;
2223

2324
import org.apache.commons.logging.Log;
2425
import org.apache.commons.logging.LogFactory;
26+
import org.springframework.cloud.gateway.config.GatewayProperties;
2527
import reactor.core.publisher.Mono;
2628

2729
import org.springframework.cloud.gateway.filter.GatewayFilter;
@@ -55,8 +57,13 @@ public class FilteringWebHandler implements WebHandler {
5557

5658
private final List<GatewayFilter> globalFilters;
5759

58-
public FilteringWebHandler(List<GlobalFilter> globalFilters) {
60+
private ConcurrentHashMap<Route,List<GatewayFilter>> RouteFilterMap = new ConcurrentHashMap();
61+
62+
private GatewayProperties properties;
63+
64+
public FilteringWebHandler(List<GlobalFilter> globalFilters, GatewayProperties properties) {
5965
this.globalFilters = loadFilters(globalFilters);
66+
this.properties = properties;
6067
}
6168

6269
private static List<GatewayFilter> loadFilters(List<GlobalFilter> filters) {
@@ -84,12 +91,7 @@ private static List<GatewayFilter> loadFilters(List<GlobalFilter> filters) {
8491
@Override
8592
public Mono<Void> handle(ServerWebExchange exchange) {
8693
Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
87-
List<GatewayFilter> gatewayFilters = route.getFilters();
88-
89-
List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
90-
combined.addAll(gatewayFilters);
91-
// TODO: needed or cached?
92-
AnnotationAwareOrderComparator.sort(combined);
94+
List<GatewayFilter> combined = getCombinedFilters(route);
9395

9496
if (logger.isDebugEnabled()) {
9597
logger.debug("Sorted gatewayFilterFactories: " + combined);
@@ -98,6 +100,25 @@ public Mono<Void> handle(ServerWebExchange exchange) {
98100
return new DefaultGatewayFilterChain(combined).filter(exchange);
99101
}
100102

103+
public List<GatewayFilter> getCombinedFilters(Route route){
104+
if (this.properties.isFilterCache()) {
105+
if (!this.RouteFilterMap.contains(route)) {
106+
RouteFilterMap.put(route,getAllFilters(route));
107+
}
108+
return RouteFilterMap.get(route);
109+
}else {
110+
return getAllFilters(route);
111+
}
112+
113+
}
114+
public List<GatewayFilter> getAllFilters(Route route){
115+
List<GatewayFilter> gatewayFilters = route.getFilters();
116+
List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
117+
combined.addAll(gatewayFilters);
118+
AnnotationAwareOrderComparator.sort(combined);
119+
return combined;
120+
}
121+
101122
private static class DefaultGatewayFilterChain implements GatewayFilterChain {
102123

103124
private final int index;

0 commit comments

Comments
 (0)