Java 服务请求客户接口报错 nested exception is java.net.ConnectException 问题

问题现象

和客户对接时,我们的 Java 服务请求客户的接口时不时会出现 org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://xxx.com.cn/sms/writeBack/sysDownSendInfo": Failed to connect to xxx.com.cn/xxx.251.33.151:443 的报错。
经过和客户沟通,当我们的 Java 请求他们的接口报错时,客户的 Nginx Access Log,并没有看到相关的请求日志记录。
那就有可能我们 Java 服务的请求,在客户 Nginx 服务器的 Linux 系统 TCP 层就被丢弃或者拒绝了。

排查过程

1、我们这边 Java 服务部署在了 4 台云服务器 ECS 上,服务请求外部接口时是通过 NAT 网关的 SNAT 实现的。


2、排查发现,只有其中两台服务器 C 和 D 的 Java 服务请求客户的接口会出现异常。但是 4 台服务器 LInux 系统和 Java 服务的配置都是一样的。


3、经过排除一系列的因素(服务器 LInux 系统的 iptables 配置、Java 服务的配置、tcpdump 抓包分析等)后,怀疑是客户的 Nginx 服务器所在的 Linux 系统开启了 net.ipv4.tcp_tw_recycle = 1 参数。

4、经过和客户沟通,让他们在 Nginx 服务器所在的 Linux 系统执行这个命令 sysctl -a | egrep "net.ipv4.tcp_timestamps|net.ipv4.tcp_tw_recycle|net.ipv4.tcp_tw_reuse"看下输出结果,发现他们确实是开启了 net.ipv4.tcp_tw_recycle = 1 参数。

问题原因

1、Linux 系统相关内核网络参数说明:

  • net.ipv4.ip_local_port_range = 32768 60999:表示 TCP/UDP 协议允许使用的本地端口号范围为 32768 ~ 60999 。
  • net.ipv4.tcp_timestamps = 1:开启TCP时间戳,以一种比重发超时更精确的方法来启用对 RTT 的计算,为实现更好的性能应该启用这个选项。
  • net.ipv4.tcp_tw_recycle = 1:开启 TCP 连接中 TIME-WAIT 的 sockets 快速回收功能。需要注意的是,该机制也依赖时间戳选项,系统默认开启 tcp_timestamps 机制(net.ipv4.tcp_timestamps = 1),而当系统中的 tcp_timestamps 和 tcp_tw_recycle 机制同时开启时,会激活 TCP 的一种行为,即缓存每个连接最新的时间戳,若后续的请求中时间戳小于缓存的时间戳时,该请求会被视为无效,导致数据包会被丢弃
  • 五元组(源 IP 地址,源端口,目的 IP 地址,目的端口,传输层协议):确定一个连接,在我们这个问题场景下源 IP 地址,目的 IP 地址,目的端口,传输层协议都是固定的,只有源端口是变化的。因源端口范围为 32768 ~ 60999(net.ipv4.ip_local_port_range = 32768 60999),会存在源端口重复的可能)

2、我们这边的 Java 服务都是通过 NAT 网关的 SNAT 出去请求外部接口的,这些 Java 服务所在的不同 ECS 服务器的请求经过 NAT 网关 SNAT 的转换,源 IP 都是一样的,所以可能被对方 Nginx 服务器认为是同一个连接。若这些 ECS 的时间不完全一致,对于后端服务器来说,会发生时间戳错乱的情况,因此会导致请求对方 Nginx 服务器的数据包丢失(因为对方 Nginx 服务器开启了 net.ipv4.tcp_tw_recycle = 1 ),所以会出现请求超时的问题。

解决办法

1、客户端:修改我们的 ECS 服务器的 Linux 系统参数 net.ipv4.tcp_timestamps 参数为 0(net.ipv4.tcp_timestamps = 0)。
或者
2、服务器端:客户修改他们的 Nginx 服务器的 Linux 系统参数 net.ipv4.tcp_tw_recycle 参数为 0(net.ipv4.tcp_tw_recycle = 0)。
或者
3、4 台 ECS 服务器分别绑定不同的出口 IP(通过多个不同 IP 的 NAT 网关或者把不同的 IP 分别绑定到 ECS 服务器上)

参考:

  1. Linux实例常用内核网络参数介绍与常见问题处理:https://help.aliyun.com/knowledge_detail/41334.html
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容