Skip to content

Commit 8f8a46c

Browse files
committed
Added option to change redis key prefix
Fixes gh-3876 Signed-off-by: Lukáš Vasek <[email protected]>
1 parent f33e027 commit 8f8a46c

File tree

3 files changed

+75
-18
lines changed

3 files changed

+75
-18
lines changed

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

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2626
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2727
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
28+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2829
import org.springframework.boot.data.redis.autoconfigure.RedisReactiveAutoConfiguration;
2930
import org.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter;
3031
import org.springframework.cloud.gateway.route.RedisRouteDefinitionRepository;
@@ -50,15 +51,17 @@
5051
@AutoConfigureBefore(GatewayAutoConfiguration.class)
5152
@ConditionalOnBean(ReactiveRedisTemplate.class)
5253
@ConditionalOnClass({ RedisTemplate.class, DispatcherHandler.class })
53-
@ConditionalOnProperty(name = GatewayProperties.PREFIX + ".redis.enabled", matchIfMissing = true)
54+
@ConditionalOnProperty(name = GatewayProperties.PREFIX
55+
+ ".redis.enabled", matchIfMissing = true)
56+
@EnableConfigurationProperties(RedisRouteDefinitionRepositoryProperties.class)
5457
class GatewayRedisAutoConfiguration {
5558

5659
@Bean
5760
@SuppressWarnings("unchecked")
5861
public RedisScript redisRequestRateLimiterScript() {
5962
DefaultRedisScript redisScript = new DefaultRedisScript<>();
60-
redisScript.setScriptSource(
61-
new ResourceScriptSource(new ClassPathResource("META-INF/scripts/request_rate_limiter.lua")));
63+
redisScript.setScriptSource(new ResourceScriptSource(
64+
new ClassPathResource("META-INF/scripts/request_rate_limiter.lua")));
6265
redisScript.setResultType(List.class);
6366
return redisScript;
6467
}
@@ -72,12 +75,15 @@ public RedisRateLimiter redisRateLimiter(ReactiveStringRedisTemplate redisTempla
7275
}
7376

7477
@Bean
75-
@ConditionalOnProperty(value = GatewayProperties.PREFIX + ".redis-route-definition-repository.enabled",
76-
havingValue = "true")
78+
@ConditionalOnProperty(value = GatewayProperties.PREFIX
79+
+ ".redis-route-definition-repository.enabled", havingValue = "true")
80+
@ConditionalOnMissingBean
7781
@ConditionalOnClass(ReactiveRedisTemplate.class)
7882
public RedisRouteDefinitionRepository redisRouteDefinitionRepository(
79-
ReactiveRedisTemplate<String, RouteDefinition> reactiveRedisTemplate) {
80-
return new RedisRouteDefinitionRepository(reactiveRedisTemplate);
83+
ReactiveRedisTemplate<String, RouteDefinition> reactiveRedisTemplate,
84+
RedisRouteDefinitionRepositoryProperties properties) {
85+
return new RedisRouteDefinitionRepository(reactiveRedisTemplate,
86+
properties.getRedisKeyPrefix());
8187
}
8288

8389
@Bean
@@ -87,8 +93,9 @@ public ReactiveRedisTemplate<String, RouteDefinition> reactiveRedisRouteDefiniti
8793
Jackson2JsonRedisSerializer<RouteDefinition> valueSerializer = new Jackson2JsonRedisSerializer<>(
8894
RouteDefinition.class);
8995
RedisSerializationContext.RedisSerializationContextBuilder<String, RouteDefinition> builder = RedisSerializationContext
90-
.newSerializationContext(keySerializer);
91-
RedisSerializationContext<String, RouteDefinition> context = builder.value(valueSerializer).build();
96+
.newSerializationContext(keySerializer);
97+
RedisSerializationContext<String, RouteDefinition> context = builder
98+
.value(valueSerializer).build();
9299

93100
return new ReactiveRedisTemplate<>(factory, context);
94101
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright 2013-2020 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.cloud.gateway.config;
18+
19+
import org.springframework.boot.context.properties.ConfigurationProperties;
20+
21+
/**
22+
* @author Lukas Vasek
23+
*/
24+
@ConfigurationProperties(GatewayProperties.PREFIX + ".redis.route-definition-repository")
25+
public class RedisRouteDefinitionRepositoryProperties {
26+
27+
/**
28+
* Whether to enable the Redis route definition repository, defaults to true.
29+
*/
30+
private boolean enabled = true;
31+
32+
/**
33+
* The key prefix for route definitions in Redis.
34+
*/
35+
private String redisKeyPrefix = "routedefinition_";
36+
37+
public boolean isEnabled() {
38+
return enabled;
39+
}
40+
41+
public void setEnabled(boolean enabled) {
42+
this.enabled = enabled;
43+
}
44+
45+
public String getRedisKeyPrefix() {
46+
return redisKeyPrefix;
47+
}
48+
49+
public void setRedisKeyPrefix(String redisKeyPrefix) {
50+
this.redisKeyPrefix = redisKeyPrefix;
51+
}
52+
}

spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepository.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,16 @@ public class RedisRouteDefinitionRepository implements RouteDefinitionRepository
3636

3737
private static final Logger log = LoggerFactory.getLogger(RedisRouteDefinitionRepository.class);
3838

39-
/**
40-
* Key prefix for RouteDefinition queries to redis.
41-
*/
42-
private static final String ROUTEDEFINITION_REDIS_KEY_PREFIX_QUERY = "routedefinition_";
4339

44-
private ReactiveRedisTemplate<String, RouteDefinition> reactiveRedisTemplate;
40+
private final ReactiveRedisTemplate<String, RouteDefinition> reactiveRedisTemplate;
41+
private final ReactiveValueOperations<String, RouteDefinition> routeDefinitionReactiveValueOperations;
42+
private final String redisKeyPrefix;
4543

46-
private ReactiveValueOperations<String, RouteDefinition> routeDefinitionReactiveValueOperations;
47-
48-
public RedisRouteDefinitionRepository(ReactiveRedisTemplate<String, RouteDefinition> reactiveRedisTemplate) {
44+
public RedisRouteDefinitionRepository(ReactiveRedisTemplate<String, RouteDefinition> reactiveRedisTemplate,
45+
String redisKeyPrefix) {
4946
this.reactiveRedisTemplate = reactiveRedisTemplate;
5047
this.routeDefinitionReactiveValueOperations = reactiveRedisTemplate.opsForValue();
48+
this.redisKeyPrefix = redisKeyPrefix;
5149
}
5250

5351
@Override
@@ -86,7 +84,7 @@ public Mono<Void> delete(Mono<String> routeId) {
8684
}
8785

8886
private String createKey(String routeId) {
89-
return ROUTEDEFINITION_REDIS_KEY_PREFIX_QUERY + routeId;
87+
return redisKeyPrefix + routeId;
9088
}
9189

9290
}

0 commit comments

Comments
 (0)