首页 > 解决方案 > 无法连接到 Redis;嵌套异常是 io.lettuce.core.RedisConnectionException:

问题描述

我是 docker 新手,我正在尝试在容器上运行 redis-server 和我的 springboot 应用程序。

当我在本地启动springboot应用程序时,我能够点击redis(存在于docker容器中)就好了,但是当我把这个springboot应用程序也放在docker容器中时,我无法连接到redis并获取

 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 0.0.0.0:6397] with root cause
urlshortner |
urlshortner | java.net.ConnectException: Connection refused
urlshortner |   at java.base/sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:na]
urlshortner |   at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:779) ~[na:na]
urlshortner |   at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330) ~[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334) ~[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:702) ~[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) ~[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) ~[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) ~[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

我试过以下:

  1. 使用 docker-compose 让它们进入同一个网络

我的码头工人撰写

version: '3'
services:
  app:
    container_name: urlshortner
    image: docker-urlshortner:v1
    build: .
    links:
      - redis
    ports:
      - "10095:10095"
    volumes:
      - ~/docker/redis:/urlshortner/logs
  redis:
    container_name: myredis
    image: redis:v1
    build: ./redis
    hostname: localhost
    ports:
      - "6379:6379"

dockerfile 启动 springboot 应用程序

FROM adoptopenjdk/openjdk11
VOLUME /urlshortner
ARG JAR_FILE=target/Urlshortning-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} urlshortning.jar
EXPOSE 10095
ENTRYPOINT ["java", "-jar", "/urlshortning.jar"]

用于运行 redis 的 dockerfile

FROM redis
COPY redis.conf /redis/redis.conf
CMD [ "redis-server", "/redis/redis.conf" ]
  1. 注释掉 bind 127.0.0.1 并在 redis.conf 中添加 bind 0.0.0.0

但仍然遇到同样的错误

我在 java 应用程序中的 redis 配置

@Configuration
public class RedisConfig {

    private final String url;
    private final int port;
    private final String password;

    @Autowired
    private ObjectMapper objectMapper;

    public RedisConfig(@Value("${spring.redis.host}") String url, @Value("${spring.redis.port}") int port,
            @Value("${spring.redis.password}") String password) {
        this.url = url;
        this.port = port;
        this.password = password;
    }

    /**
     * Redis configuration
     *
     * @return redisStandaloneConfiguration
     */
    @Bean
    public RedisStandaloneConfiguration redisStandaloneConfiguration() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(url, port);
        redisStandaloneConfiguration.setPassword(password);
        return redisStandaloneConfiguration;
    }

    /**
     * Client Options Reject requests when redis is in disconnected state and Redis
     * will retry to connect automatically when redis server is down
     *
     * @return client options
     */
    @Bean
    public ClientOptions clientOptions() {
        return ClientOptions.builder().disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS)
                .autoReconnect(true).build();
    }

    /**
     * Create a LettuceConnection with redis configurations and client options
     *
     * @param redisStandaloneConfiguration redisStandaloneConfiguration
     * @return RedisConnectionFactory
     */
    @Bean
    public RedisConnectionFactory connectionFactory(RedisStandaloneConfiguration redisStandaloneConfiguration) {

        LettuceClientConfiguration configuration = LettuceClientConfiguration.builder().clientOptions(clientOptions())
                .build();

        return new LettuceConnectionFactory(redisStandaloneConfiguration, configuration);
    }

    // Setting up the redis template object.
    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Bean
    @ConditionalOnMissingBean(name = "redisTemplate")
    @Primary
    public RedisTemplate<String, Url> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Url.class);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        RedisTemplate<String, Url> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        return redisTemplate;
    }
}

和我的 application.properties

server.port=10095
redis.ttl=86400

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=redisdb

我也尝试将 spring.redis.host 从 localhost 更改为 0.0.0.0 和 127.0.0.1

所以当我从邮递员那里打到它时,我得到了错误

运行 redis 和 springboot 应用程序的容器

请问如何解决这个问题,谢谢大家帮忙

标签: spring-bootdockerredisdocker-composedockerfile

解决方案


我改变了以下使其工作

spring.redis.host=localhost

spring.redis.host=redis

在 application.properties 和

hostname: localhost

hostname: redis

在 docker-compose 中用于 redis


推荐阅读