diff --git a/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java index 888ef91568..50899dec48 100644 --- a/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java +++ b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java @@ -25,6 +25,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.data.redis.autoconfigure.RedisReactiveAutoConfiguration; import org.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter; import org.springframework.cloud.gateway.route.RedisRouteDefinitionRepository; @@ -50,15 +51,17 @@ @AutoConfigureBefore(GatewayAutoConfiguration.class) @ConditionalOnBean(ReactiveRedisTemplate.class) @ConditionalOnClass({ RedisTemplate.class, DispatcherHandler.class }) -@ConditionalOnProperty(name = GatewayProperties.PREFIX + ".redis.enabled", matchIfMissing = true) +@ConditionalOnProperty(name = GatewayProperties.PREFIX + + ".redis.enabled", matchIfMissing = true) +@EnableConfigurationProperties(RedisRouteDefinitionRepositoryProperties.class) class GatewayRedisAutoConfiguration { @Bean @SuppressWarnings("unchecked") public RedisScript redisRequestRateLimiterScript() { DefaultRedisScript redisScript = new DefaultRedisScript<>(); - redisScript.setScriptSource( - new ResourceScriptSource(new ClassPathResource("META-INF/scripts/request_rate_limiter.lua"))); + redisScript.setScriptSource(new ResourceScriptSource( + new ClassPathResource("META-INF/scripts/request_rate_limiter.lua"))); redisScript.setResultType(List.class); return redisScript; } @@ -72,12 +75,15 @@ public RedisRateLimiter redisRateLimiter(ReactiveStringRedisTemplate redisTempla } @Bean - @ConditionalOnProperty(value = GatewayProperties.PREFIX + ".redis-route-definition-repository.enabled", - havingValue = "true") + @ConditionalOnProperty(value = GatewayProperties.PREFIX + + ".redis-route-definition-repository.enabled", havingValue = "true") + @ConditionalOnMissingBean @ConditionalOnClass(ReactiveRedisTemplate.class) public RedisRouteDefinitionRepository redisRouteDefinitionRepository( - ReactiveRedisTemplate reactiveRedisTemplate) { - return new RedisRouteDefinitionRepository(reactiveRedisTemplate); + ReactiveRedisTemplate reactiveRedisTemplate, + RedisRouteDefinitionRepositoryProperties properties) { + return new RedisRouteDefinitionRepository(reactiveRedisTemplate, + properties.getRedisKeyPrefix()); } @Bean @@ -87,8 +93,9 @@ public ReactiveRedisTemplate reactiveRedisRouteDefiniti Jackson2JsonRedisSerializer valueSerializer = new Jackson2JsonRedisSerializer<>( RouteDefinition.class); RedisSerializationContext.RedisSerializationContextBuilder builder = RedisSerializationContext - .newSerializationContext(keySerializer); - RedisSerializationContext context = builder.value(valueSerializer).build(); + .newSerializationContext(keySerializer); + RedisSerializationContext context = builder + .value(valueSerializer).build(); return new ReactiveRedisTemplate<>(factory, context); } diff --git a/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/config/RedisRouteDefinitionRepositoryProperties.java b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/config/RedisRouteDefinitionRepositoryProperties.java new file mode 100644 index 0000000000..9849895ab0 --- /dev/null +++ b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/config/RedisRouteDefinitionRepositoryProperties.java @@ -0,0 +1,52 @@ +/* + * Copyright 2013-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.gateway.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author Lukas Vasek + */ +@ConfigurationProperties(GatewayProperties.PREFIX + ".redis.route-definition-repository") +public class RedisRouteDefinitionRepositoryProperties { + + /** + * Whether to enable the Redis route definition repository, defaults to true. + */ + private boolean enabled = true; + + /** + * The key prefix for route definitions in Redis. + */ + private String redisKeyPrefix = "routedefinition_"; + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public String getRedisKeyPrefix() { + return redisKeyPrefix; + } + + public void setRedisKeyPrefix(String redisKeyPrefix) { + this.redisKeyPrefix = redisKeyPrefix; + } +} diff --git a/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepository.java b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepository.java index 77aa51e62c..50b5f15a1d 100644 --- a/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepository.java +++ b/spring-cloud-gateway-server-webflux/src/main/java/org/springframework/cloud/gateway/route/RedisRouteDefinitionRepository.java @@ -36,18 +36,16 @@ public class RedisRouteDefinitionRepository implements RouteDefinitionRepository private static final Logger log = LoggerFactory.getLogger(RedisRouteDefinitionRepository.class); - /** - * Key prefix for RouteDefinition queries to redis. - */ - private static final String ROUTEDEFINITION_REDIS_KEY_PREFIX_QUERY = "routedefinition_"; - private ReactiveRedisTemplate reactiveRedisTemplate; + private final ReactiveRedisTemplate reactiveRedisTemplate; + private final ReactiveValueOperations routeDefinitionReactiveValueOperations; + private final String redisKeyPrefix; - private ReactiveValueOperations routeDefinitionReactiveValueOperations; - - public RedisRouteDefinitionRepository(ReactiveRedisTemplate reactiveRedisTemplate) { + public RedisRouteDefinitionRepository(ReactiveRedisTemplate reactiveRedisTemplate, + String redisKeyPrefix) { this.reactiveRedisTemplate = reactiveRedisTemplate; this.routeDefinitionReactiveValueOperations = reactiveRedisTemplate.opsForValue(); + this.redisKeyPrefix = redisKeyPrefix; } @Override @@ -86,7 +84,7 @@ public Mono delete(Mono routeId) { } private String createKey(String routeId) { - return ROUTEDEFINITION_REDIS_KEY_PREFIX_QUERY + routeId; + return redisKeyPrefix + routeId; } }