通过AWS EC2实例上的Spring Boot应用程序Runnig连接到AWS弹性缓存Redis时读取超时

时间:2019-06-21 08:04:51

标签: spring-boot docker ssl amazon-ec2 elastic-cache

我正在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集群。

0 个答案:

没有答案