From f60d40bd31ea8710ecb2e1f359689b0bf429c60b Mon Sep 17 00:00:00 2001 From: yterentiev Date: Fri, 1 Mar 2019 16:50:17 +0200 Subject: [PATCH] Fix health check indicator for redis --- README.md | 22 +++++++-- .../redis/RedisPropertyConfiguration.java | 45 +++++++++---------- .../repository/redis/RedisRepositoryImpl.java | 2 +- 3 files changed, 42 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 05a2d08..a0d4754 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,17 @@ with spring.redis.host: value ``` +For configuring single redis node, please use next properties: + +```yaml + spring: + redis: + host: host + timeout: value + port: value +``` + + It is possible to override the default YAML configuration by supplying a custom configuration. See example scenario(s) below. @@ -98,9 +109,14 @@ It is possible to override the default YAML configuration by supplying a custom Redis cluster settings _application-default.yml:_ ```yaml -spring.redis.host: redis_host_1:port,redis_host_2:port,redis_host_3:port -spring.redis.is_cluster: true -spring.redis.timeout: 300 +spring: + redis: + cluster: + nodes: + - host_1:port_1 + - host_2:port_2 + - host_3:port_3 + timeout: 300 ``` Aerospike cluster settings _application-default.yml:_ diff --git a/src/main/java/org/prebid/cache/repository/redis/RedisPropertyConfiguration.java b/src/main/java/org/prebid/cache/repository/redis/RedisPropertyConfiguration.java index a15d299..e12b700 100644 --- a/src/main/java/org/prebid/cache/repository/redis/RedisPropertyConfiguration.java +++ b/src/main/java/org/prebid/cache/repository/redis/RedisPropertyConfiguration.java @@ -9,14 +9,13 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import lombok.Singular; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.time.Duration; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -26,27 +25,26 @@ @NoArgsConstructor @AllArgsConstructor @Configuration -@ConditionalOnProperty(prefix = "spring.redis", name = {"host"}) +@ConditionalOnProperty(prefix = "spring.redis", name = {"timeout"}) @ConfigurationProperties(prefix = "spring.redis") public class RedisPropertyConfiguration { private String host; private long timeout; private String password; - private Boolean isCluster; + private int port; + private Cluster cluster; - private RedisURI createRedisURI(String hosts) { - requireNonNull(hosts); - String[] hostParams = hosts.split(":"); + @Data + public static class Cluster { - if (hostParams.length < 2) { - throw new IllegalArgumentException("Illegal host URL format, host and port should be specified " - + "as host:port"); - } - String hostname = requireNonNull(hostParams[0]); - int port = Integer.parseInt(hostParams[1]); + @Singular + List nodes; + } - final RedisURI.Builder builder = RedisURI.Builder.redis(hostname, port) + private RedisURI createRedisURI(String host, int port) { + requireNonNull(host); + final RedisURI.Builder builder = RedisURI.Builder.redis(host, port) .withTimeout(Duration.ofMillis(timeout)); if (password != null) { builder.withPassword(password); @@ -56,39 +54,40 @@ private RedisURI createRedisURI(String hosts) { } private List createRedisClusterURIs() { - requireNonNull(host); - return Arrays.stream(host.split(",")) - .map(this::createRedisURI) + + return cluster.getNodes().stream() + .map(node -> node.split(":")) + .map(host -> createRedisURI(host[0], Integer.parseInt(host[1]))) .collect(Collectors.toList()); } @Bean(destroyMethod = "shutdown") - @ConditionalOnExpression("'${spring.redis.is_cluster}' == 'false'") + @ConditionalOnProperty(prefix = "spring.redis", name = "host") RedisClient client() { - return RedisClient.create(createRedisURI(getHost())); + return RedisClient.create(createRedisURI(getHost(), getPort())); } @Bean(destroyMethod = "close") - @ConditionalOnExpression("'${spring.redis.is_cluster}' == 'false'") + @ConditionalOnProperty(prefix = "spring.redis", name = "host") StatefulRedisConnection connection() { return client().connect(); } @Bean(destroyMethod = "shutdown") - @ConditionalOnExpression("'${spring.redis.is_cluster}' == 'true'") + @ConditionalOnProperty(prefix = "spring.redis", name = "host", matchIfMissing = true, havingValue = "null") RedisClusterClient clusterClient() { return RedisClusterClient.create(createRedisClusterURIs()); } @Bean(destroyMethod = "close") - @ConditionalOnExpression("'${spring.redis.is_cluster}' == 'true'") + @ConditionalOnProperty(prefix = "spring.redis", name = "host", matchIfMissing = true, havingValue = "null") StatefulRedisClusterConnection clusterConnection() { return clusterClient().connect(); } @Bean RedisStringReactiveCommands reactiveCommands() { - if (getIsCluster()) { + if (getHost() == null) { return clusterConnection().reactive(); } else { return connection().reactive(); diff --git a/src/main/java/org/prebid/cache/repository/redis/RedisRepositoryImpl.java b/src/main/java/org/prebid/cache/repository/redis/RedisRepositoryImpl.java index 466de72..b3928cc 100644 --- a/src/main/java/org/prebid/cache/repository/redis/RedisRepositoryImpl.java +++ b/src/main/java/org/prebid/cache/repository/redis/RedisRepositoryImpl.java @@ -15,7 +15,7 @@ @Repository @Slf4j -@ConditionalOnProperty(prefix = "spring.redis", name = {"host"}) +@ConditionalOnProperty(prefix = "spring.redis", name = {"timeout"}) @RequiredArgsConstructor public class RedisRepositoryImpl implements ReactiveRepository { private final RedisStringReactiveCommands reactiveCommands;