spring-boot - 无法连接到 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]
我试过以下:
- 使用 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" ]
- 注释掉 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
所以当我从邮递员那里打到它时,我得到了错误
请问如何解决这个问题,谢谢大家帮忙
解决方案
我改变了以下使其工作
spring.redis.host=localhost
至
spring.redis.host=redis
在 application.properties 和
hostname: localhost
至
hostname: redis
在 docker-compose 中用于 redis
推荐阅读
- javascript - 弹跳球javascript
- libvirt - 使用 libvirt-go 绑定定义域
- javascript - 用 Jest 进行测试 (JavaScript)
- c++ - C++ 使用 mixins 和多重继承覆盖分辨率
- jquery - 数据表不滚动
- git - 如何在相关的 git 存储库之间干净轻松地合并?
- spring-boot - 如何使 RepositoryEventHandler 在 Spring Boot 中工作
- javascript - Chrome 扩展程序未检测到输入字段
- python - Python - 浏览器自动化 - MechanicalSoup/BeautifulSoup
- javascript - 为什么这是 IE11 和 Pale Moon 中的错误?