使用Redisson连接AWS加密Redis集群遇ClosedChannelException报错求助
AWS Redis集群(Cluster模式+传输加密)Redisson 3.12.0连接报错排查
环境与配置
- AWS Redis集群:启用Cluster mode、静态/传输加密,传输加密模式为Preferred
- 技术栈:Java Spring + Redisson 3.12.0,JDK 1.8.0_362
- 部署环境:AWS EC2、Jposs
- 连接代码:
redissonConfig.useClusterServers() .setKeepAlive(true) .setConnectTimeout(10000) .setRetryAttempts(2) .setDnsMonitoringInterval(10000) .addNodeAddress("Redis configuration endpoint"); client = Redisson.create(redissonConfig);
- Redis端点:
rediss://ConfigurationEndpoint
报错信息
连接时抛出java.nio.channels.ClosedChannelException,伴随Netty相关警告:
[2023-04-15 14:46:22,296] [redisson-netty-2-3] [WARN] ChannelInitializer- Failed to initialize a channel. Closing: [id: 0x77267167] io.netty.channel.ChannelPipelineException: io.netty.handler.ssl.SslHandler.handlerAdded() has thrown an exception; removed. at io.netty.channel.DefaultChannelPipeline.callHandlerAdded0(DefaultChannelPipeline.java:624) ~[netty-transport-4.1.46.Final.jar:4.1.46.Final] at io.netty.channel.DefaultChannelPipeline.addLast(DefaultChannelPipeline.java:223) ~[netty-transport-4.1.46.Final.jar:4.1.46.Final] at io.netty.channel.DefaultChannelPipeline.addLast(DefaultChannelPipeline.java:381) ~[netty-transport-4.1.46.Final.jar:4.1.46.Final] at io.netty.channel.DefaultChannelPipeline.addLast(DefaultChannelPipeline.java:370) ~[netty-transport-4.1.46.Final.jar:4.1.46.Final] at java.lang.Thread.run(Thread.java:750) [?:1.8.0_362] Caused by: java.lang.NoSuchFieldError: TCP_FASTOPEN_CONNECT at io.netty.handler.ssl.SslHandler.handlerAdded(SslHandler.java:1979) ~[netty-handler-4.1.72.Final.jar:4.1.72 [redisson-netty-2-3] [WARN] ChannelInitializer- Failed to initialize a channel. Closing: [id: 0xe1c3fece] io.netty.channel.ChannelPipelineException: io.netty.handler.ssl.SslHandler.handlerAdded() has thrown an exception; removed.
排查与解决步骤
1. 修复Netty版本冲突
报错核心NoSuchFieldError: TCP_FASTOPEN_CONNECT是因为netty-handler-4.1.72.Final与netty-transport-4.1.46.Final版本不兼容,Redisson 3.12.0默认依赖Netty 4.1.46.Final,需强制统一版本:
- Maven项目在
dependencyManagement中添加:
<dependencyManagement> <dependencies> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.46.Final</version> </dependency> </dependencies> </dependencyManagement>
- Gradle项目添加:
configurations.all { resolutionStrategy.force 'io.netty:netty-all:4.1.46.Final' }
2. 补充Redisson SSL显式配置
虽然使用rediss://前缀,仍需显式配置SSL参数适配AWS Redis加密模式:
redissonConfig.useClusterServers() .setKeepAlive(true) .setConnectTimeout(10000) .setRetryAttempts(2) .setDnsMonitoringInterval(10000) .addNodeAddress("rediss://ConfigurationEndpoint") .setSslEnableEndpointIdentification(true) .setSslProvider(SslProvider.JDK); client = Redisson.create(redissonConfig);
3. 验证JDK与网络配置
- 确认JDK信任库包含AWS Redis的公有CA证书(默认JDK已包含,自定义证书需手动导入)
- 检查EC2/Jposs安全组允许出站访问Redis集群端口(默认6379)
- 验证Redis端点解析:在EC2执行
nslookup ConfigurationEndpoint确认能正确解析节点IP - 确认EC2/Jposs与Redis集群在同一VPC,或通过VPC peering、NAT网关实现网络连通
内容的提问来源于stack exchange,提问作者Osama Jetawe
相关产品推荐
相关产品推荐

