我正在EC2实例上将Spring Boot应用程序作为Docker容器运行。 我已经创建了redis集群(AWS上的弹性缓存)并在运行中和静止时启用了加密。
就VPC和安全组配置而言,一切都是正确的。 问题是,当我看到Spring Boot应用日志时,它会抛出
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:202)
at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)
at redis.clients.jedis.Protocol.process(Protocol.java:147)
at redis.clients.jedis.Protocol.read(Protocol.java:211)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:297)
at redis.clients.jedis.Connection.getRawObjectMultiBulkReply(Connection.java:242)
at redis.clients.jedis.Connection.getObjectMultiBulkReply(Connection.java:248)
at redis.clients.jedis.BinaryJedis.scan(BinaryJedis.java:3284)
at org.eclipse.leshan.server.cluster.RedisRegistrationStore$RedisIterator.scanNext(RedisRegistrationStore.java:287)
at org.eclipse.leshan.server.cluster.RedisRegistrationStore$RedisIterator.<init>(RedisRegistrationStore.java:281)
at org.eclipse.leshan.server.cluster.RedisRegistrationStore.getAllRegistrations(RedisRegistrationStore.java:266)
at org.eclipse.leshan.server.impl.RegistrationServiceImpl.getAllRegistrations(RegistrationServiceImpl.java:57)
at dishac.server.management.RequestProcessorEngine$Scanner.run(RequestProcessorEngine.java:117)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.net.SocketInputStream.read(SocketInputStream.java:127)
at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:196)
... 19 more
我敢肯定,redis集群是可以访问的,因为我有另一个具有相同配置的redis集群,除了传输中加密和禁用了静态休息对我来说都很好。
这是我的docker文件快照(我使用的是ENV变量而不是application.yml):
ENV SPRING_REDIS_HOST m.d-r-s.us.usblahe2.cblhaahe.amazonaws.com ENV SPRING_REDIS_SSL是 ENV SPRING_REDIS_PASSWORD blahblahblahblah ENV SPRING_REDIS_JEDIS_POOL_MAX_ACTIVE 8 ENV SPRING_REDIS_JEDIS_POOL_MAX_IDLE 8 ENV SPRING_REDIS_JEDIS_POOL_MAX_WAIT -1ms ENV SPRING_REDIS_JEDIS_POOL_MIN_IDLE 0
更新:我尝试从同一ec2实例(运行java spring boot应用程序的地方)使用stunnel,并且能够访问redis集群。