首页 > 学院 > 开发设计 > 正文

一般Spring MVC项目问题排查经验

2019-11-11 01:50:28
字体:
来源:转载
供稿:网友
开发中总会遇上的这样那样的情况 : 这参数怎么没有传过来/传的值不对复制过来的代码怎么效果不一样在本地是好的啊怎么上线就挂了,这不科学好吧, 这里就分享一些开发中遇到问题快速定位的小经验,主要针对基于 SPRing MVC 和 Mybatis的一般Web项目,旨在找出问题所在而非问题的解决方案。

一、 浏览器端错误,表现为浏览器提示错误或点击页面元素无效

客户端不能联网 , 服务器没有接收到请求浏览器解析JS脚本错误400 : POST非数组参数同名了 , data -> data[] √ 404 : url错误 、 应用挂了解决方案 :浏览器F12 -> console || network 搞定

二、中间层错误 , 多出现在负载均衡(LBS)错误的情况

返回http状态码为 502 bad gateway检查LBS的心跳检测判断规则 , 是根据 HTTP 状态码判断机器存活还是其他的。如果是根据HTTP 状态码判断的话就看错误的URL返回的 HTTP 状态码是否符合判断规则。比如心跳检测需要的是200的才通过而服务器返回的是302导致出错。

三、服务器错误 , 表现形式多为 HTTP 500 错误,服务器抛异常了

3.1 网络问题——HTTP / TCP 问题

需要确定流量可到达服务器,大致需要确定三个地方 :ip可达 : ping应用可达 :curl 、 telnet localhost 8080应用启动成功 : jps 、ps -aux 、 netstat -anpt 、 top可能影响的地方 : nginx反向代理 、 LBS负载均衡 、 应用启动失败 、 防火墙配置一次HTTP请求和服务器的交互过程 ,基本分为三部分 :浏览器发送HTTP请求 -> 中间层 -> 服务器处理请求并返回结果 , 中间每个环节都可能出错导致流程无法往下走 。分析代码中 socket的处理是否用完后进行close了是否设置了各种超时 :connectionTimeout 、socketTimeout 、timeout是否保持了长连接 :socket.setKeepAlive(); 、header中的 connection:close

3.2 代码问题

一般排查链路为 : DEBUG走起 -> 浏览器F12查看请求参数 -> 在Controller断点看请求参数是否正确 -> 断点分析代码逻辑 -> done前提 : 确认本地代码和线上代码一致根据流程图初步定位是上面的哪一个阶段的出错 , 根据流量的终点(在哪里不走下去了)判断即可

分析过程

看日志 : tail -10000 catalina.out | grep 'Xxx'没有打出异常日志 , 说明代码没有走到这里 , 多为多线程程序线程死锁、阻塞 : 大量线程处理WAITING状态 : 线程池配置不正确,导致有线程一直占有锁 , 比较暴力的解决方案就是加大线程池大小系统参数问题 : 内存、磁盘容量不足对文件的处理变量占用内存过大、多为 list、map太大、静态变量过多、局部变量list的数据量太大打出了异常日志 、比较好排查 , 定位问题代码逐层往上找

人为误操作

如果经过上述链路还没找到问题所在则考虑不是自己导致的问题tomcat莫名其妙被干掉了 , 加大内存也不管用 , 也没留下任何日志解决思路 :history , 查看挂掉之前调用了啥命令 , 特别是 shell 脚本的调用可能误杀进程 。询问和自己使用相同服务器环境的同事

常用排查工具:

浏览器端 : F12 、 FIRE DEBUG 、 Fiddler 、 HTTP Analyzer 、 Wireshark ,主要看 console 和 network , 基本为 js 和 http request/response开发工具 : 本地/远程 DEBUGjava : jstack 、 jmap + jhat 、jconsole 、jps 、 jprofiler系统 : top 、 ps -aux 、 df 、 free -m 、 cat 、 tail 、 sed 、 history网络 : telnet localhost 8080 、ping localhost 、curl 、 netstat
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表