Spring boot 无法连接到Redis;嵌套异常为io.莴苣.core.RedisConnectionException:
我是docker的新手,我正在尝试在容器上运行redis服务器和springboot应用程序 当我在本地启动springboot应用程序时,我可以点击redis(存在于docker容器中),但当我将这个springboot应用程序也放在docker容器中时,我无法连接到redis并获取数据Spring boot 无法连接到Redis;嵌套异常为io.莴苣.core.RedisConnectionException:,spring-boot,docker,redis,docker-compose,dockerfile,Spring Boot,Docker,Redis,Docker Compose,Dockerfile,我是docker的新手,我正在尝试在容器上运行redis服务器和springboot应用程序 当我在本地启动springboot应用程序时,我可以点击redis(存在于docker容器中),但当我将这个springboot应用程序也放在docker容器中时,我无法连接到redis并获取数据 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request proc
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]
我尝试过以下方法:
如何解决此问题,非常感谢您的帮助,谢谢我更改了以下内容,使其工作正常
spring.redis.host=localhost
到
在application.properties中
及
到
在docker compose for redis中,docker中的localhost通常表示“此容器”(0.0.0.0表示“无处不在”;将其用于出站连接没有意义)。您可以在Docker文档中查看哪些主机名可用于在容器之间建立连接。@DavidMaze我同意,我尝试过这样做,因为我们在redis.conf中绑定了0.0.0.0,我会检查这个,谢谢
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"]
FROM redis
COPY redis.conf /redis/redis.conf
CMD [ "redis-server", "/redis/redis.conf" ]
@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;
}
}
server.port=10095
redis.ttl=86400
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=redisdb
spring.redis.host=localhost
spring.redis.host=redis
hostname: localhost
hostname: redis