一次故障解决总结

在一个风和日丽的上午,虽然我还是一个临时工,但是我依然在悠然自得的摸着鱼,突然背后上级匆忙跑来对我说,系统出问题了,这时候我内心非常慌张,但是也要故作镇定

看现象

桌面应用报的错误是连接关闭,那么我就百度了一下,说是要将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
2
3
[admin@mesdevapp opt]$ tcpdump -i eth0
tcpdump: eth0: You don't have permission to capture on that device
(socket: Operation not permitted)

我搞不定了,这时候,我就想着用postman用同样的参数去请求https://www.baidu.com,但是出现同样的问题,这时候我更加相信是网络策略,我不顾同事的反对去找了网络的人,说出了相应的问题。最后网络那边说是防火墙策略问题。最后打通相关策略。问题over。

You forgot to set the qrcode for Alipay. Please set it in _config.yml.
You forgot to set the qrcode for Wechat. Please set it in _config.yml.
You forgot to set the business and currency_code for Paypal. Please set it in _config.yml.
You forgot to set the url Patreon. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×