how to override cluster nodes in lettuce with nginx proxy urls

Viewed 51

I am using lettuce driver for my elastic cache connections, my elastic cache is cluster enabled.

Due to some network restriction, my connections need to be behind a proxy so I am using an Nginx stream proxy

below is my Nginx conf

 stream {

       upstream grp1
       {
        server node1-1:8762;
        server node1-2:8762;
        server node1-3:8762;
       }

  upstream grp2
       {
        server node2-1:8762;
        server node2-2:8762;
        server node2-3:8762;
       }

   server {
        lister 8441;
        proxy_pass grp1;
    }
    
      server {
      lister 8442;
        proxy_pass grp2;
    }
} 

below is Redis template code

@Configuration
@EnableConfigurationProperties(RedisProperties.class)
public class RedisConfig {

         @value("${ngnix.ip}")
         private string  ngnixip

         @Bean
         LettuceConnectionFactory lettuceConnectionFactory() {

        RedisClusterConfiguration redisCluster = new  RedisClusterConfiguration();

        Set<RedisNode> nodes = new HashSet<>();

        nodes.add(new RedisNode(ngnixip,8441);
        nodes.add(new RedisNode(ngnixip,8442);


        redisCluster.setClusterNodes(nodes);
        redisCluster.setPassword("mypassword"); 


        final SocketOptions socketOptions = SocketOptions.builder().connectTimeout(socketTimeout).build();
        final ClientOptions clientOptions =
                ClientOptions.builder().socketOptions(socketOptions).build();

        LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
                .commandTimeout(redisCommandTimeout)
                .clientOptions(clientOptions).build();
                
         final LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisCluster,
                clientConfig);
        lettuceConnectionFactory.setValidateConnection(true);
        lettuceConnectionFactory.setShareNativeConnection(true)
        return lettuceConnectionFactory;


      }

      @Bean
    public RedisTemplate<Long, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Long, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        return template;
    }

}

initial connection to cluster happens fine but whenever I tried to perform reds read operation using redistemplate, it discovers the actual Redis nodes(node1-1, node1-2, node1-3, node2-1, node2-2, node2-3) and uses them, that leads to connection timed out since cluster nodes are not reachable so How to override such a way that it gets always overriding with Nginx IP I have configured.

0 Answers
Related