一次故障解决总结
在一个风和日丽的上午,虽然我还是一个临时工,但是我依然在悠然自得的摸着鱼,突然背后上级匆忙跑来对我说,系统出问题了,这时候我内心非常慌张,但是也要故作镇定
看现象
桌面应用报的错误是连接关闭,那么我就百度了一下,说是要将Keeplive
属性设置为false
,因为没遇到过这个问题,所以我宁愿选择相信,所以把底层库进行反编译,改了一下。但是还是解决不了问题。而且这个问题很奇怪,就是部分请求能成功,固定的那几个请求会失败。然后我就把本地服务启动起来,又不会报错,这时候,就可以确定应该是服务端的问题,但是这个范围也会有一些广,可能是网络、数据库、服务端接口,但是如果是接口的问题,调用的同一个接口,为什么其他的就可以,唯独这几个固定参数的调用就会出问题。
开始debug
因为我是临时工,连开发服务器都不给使用,所以跑到小姐姐身边说:我们来远程debug吧。这里需要修改catalina.sh
的配置,加入如下代码:
1 | -Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=端口号 |
然后本地IDEA即可连接。我们发现唯独
1 | {"function":"0","content":"(SELECT to_char(SYSDATE, 'yyyy-mm-dd') a, to_char(SYSDATE, 'yyyy-mm-dd') b FROM dual) UNION ALL (SELECT to_char(SYSDATE - 1, 'yyyy-mm-dd') a, to_char(SYSDATE - 1, 'yyyy-mm-dd') b FROM dual)"} |
这样的参数进不了请求。这时候,我们就随意修改了一些关键字。比如去掉ALL
在此请求就正常,然后同事用form-data
的提交方式也不会出问题,如果不去掉ALL
的话,在localhost_access_log
没有相关的日志,而且也没有任何错误日志。这时候我就问女同事公司的网络环境是什么样的,但是女同事一脸懵逼的说:不知道。没办法,我也只是猜测有可能能是网络策略。但是同事不以为然。我本来是想用Arthas
来分析一下服务的内部处理请求,但是因为某些原因放弃了。
网络抓包
这里我使用wireshark
来进行抓包,发现我的请求是出去了,但是没有ACK
回来,其他的请求没有问题。我就想着看看服务器上有没有收到请求,遂,安装了一个tcpdump
工具,但是作孽啊
1 | [admin@mesdevapp opt]$ tcpdump -i eth0 |
我搞不定了,这时候,我就想着用postman
用同样的参数去请求https://www.baidu.com
,但是出现同样的问题,这时候我更加相信是网络策略,我不顾同事的反对去找了网络的人,说出了相应的问题。最后网络那边说是防火墙策略问题。最后打通相关策略。问题over。