2020年1月22日总结
1.app跑业务,某个节点失败,造成某种现象,大概猜测是x接口失败(其实是死皮赖脸问同事问来的)。
2.日志,找x接口。发现请求B服务,但没有返回,日志断了(后面再没有该线程的记录,异常也没有)(什么鬼-_-|)。
脑袋出现各种可能:B服务问题?A机器到B机器的网络问题?域名问题?elb问题?代码应该没有问题吧?(毕竟测试环境都没出现问题)
3.先看B服务日志,有没有被请求到。>>没有
4.A机器上curl请求B服务,看B日志有没有被请求。>>有>>B服务没有问题,网络没问题,域名没问题,elb没问题。
5.代码有问题?这是我最不愿意面对的问题。
因为是成熟项目,而且在测试环境通过了。为了确认代码没有问题:
5.1 tcpdump抓包>>确定代码没有发出请求>>代码有问题(我...)
6.排查代码:
6.1先确定url和param没问题,随便用台电脑,postman请求B服务,返回成功。说明url没问题,param没问题。
6.2到A机器上用curl使用上面的url和param请求,返回成功,说明A机器上用该请求方法没有问题。说明业务代码没有问题。
6.3最后排查到utils上。
因为需要跨4台堡垒机,改代码的成本巨大。在这种情况下能碰到apache包的bug,也算是牛批了。
1.多开ssh窗口tcpdump抓包。
A服务请求B服务,B服务日志没有被请求记录:若要确定A服务确实没有发出去请求,则多开ssh窗口连接A服务,请求和抓包同步进行。
如果没有抓到包>>请求没有走到网卡>>请求没有发出>>请求在自己的代码层就死掉了>>代码有问题。
代码层:通过日志排查,找到请求的url,param,在A服务的机器上用curl发送请求(请求有多种:form表单请求,json请求),如果请求可以到达B服务,则说明网络没有问题,B服务没有问题,url没有问题。如果可以拿到返回值,说明参数没有问题,请求方式没有问题。
经过排查,HttpClientUtils里的apache的HttpClient有问题,既不执行下去也不抛异常。
。。。。。。。。。。。