【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
问题描述
Java Spring Boot的代码在IDE里面跑可以连上 Azure 的 Redis服务,打包成Image放在容器里面跑,就连不上azure的redis服务,错误消息为:
Unable to connect to Redis; nested exception is org.springframework.data.redis.connection.PoolException:
Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to xxxxxxxxxxxxx.redis.cache.chinacloudapi.cn:6380
问题分析
第一步: 因为容器是Linux的机器上运行,所以第一步是确认客户端与Azure Redis服务之间的网络连通性。可以通过PsPing或者PaPing 测试。
#PsPing psping xxxxxxxxxxxxx.redis.cache.chinacloudapi.cn:6380 #PaPing ./paping -p 6380 -c 500 xxxxxxxxxxxxx.redis.cache.chinacloudapi.cn
PsPing:https://docs.microsoft.com/zh-cn/sysinternals/downloads/psping
PaPing:https://code.google.com/archive/p/paping/downloads
PS:在windows的机器上,可以使用 tcping xxxxxxxxxxxxx.redis.cache.chinacloudapi.cn:6380
第二步: 抓取网络包
sudo tcpdump -i en0 -w xxxx.pcap
从网络包中验证是否是与TLS协议,版本错误相关。如果能够查看TCP及TLSv1.2的Application Data传递,则表明网络连通性,TLS协议都没有问题。
经过以上分析后,就可以定位问题一定发生在应用代码中,然后就是通过Demo来复现及定位问题。比如:排除项目中各种组件间的相互干扰,使用Azure官网中的简单Demo来测试联通问题。如上Jedis连接Redis的代码片段:
App.java
package example.demo; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisShardInfo; /** * Redis test * */ public class App { public static void main( String[] args ) { boolean useSsl = true; String cacheHostname = "redis host"; String cachekey = "key"; // Connect to the Azure Cache for Redis over the TLS/SSL port using the key. JedisShardInfo shardInfo = new JedisShardInfo(cacheHostname, 6380, useSsl); shardInfo.setPassword(cachekey); /* Use your access key. */ Jedis jedis = new Jedis(shardInfo); // Perform cache operations using the cache connection object... // Simple PING command System.out.println( "\nCache Command : Ping" ); System.out.println( "Cache Response : " + jedis.ping()); // Simple get and put of integral data types into the cache System.out.println( "\nCache Command : GET Message" ); System.out.println( "Cache Response : " + jedis.get("Message")); System.out.println( "\nCache Command : SET Message" ); System.out.println( "Cache Response : " + jedis.set("Message", "Hello! The cache is working from Java!")); // Demonstrate "SET Message" executed as expected... System.out.println( "\nCache Command : GET Message" ); System.out.println( "Cache Response : " + jedis.get("Message")); // Get the client list, useful to see if connection list is growing... System.out.println( "\nCache Command : CLIENT LIST" ); System.out.println( "Cache Response : " + jedis.clientList()); jedis.close(); } }
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>example.demo</groupId> <artifactId>redistest</artifactId> <version>1.0</version> <name>redistest</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version> <type>jar</type> <scope>compile</scope> </dependency> </dependencies> <build> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.0.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
参考资料
使用 PsPing & PaPing 进行 TCP 端口连通性测试: https://docs.azure.cn/zh-cn/articles/azure-operations-guide/virtual-network/aog-virtual-network-tcp-psping-paping-connectivity#paping
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-10-09 【应用服务 App Service】在Azure App Service中使用WebSocket - PHP的问题 - 如何使用和调用