五年java开发生涯中一次吐血的项目救火(程序员何苦难为程序员)

我现在就职于一家中型的互联网企业,去年年底入职的薪资和待遇都很不错,但是总结起来说的好听就是全村人的希望,说的不好听就是一个人几乎干了一个项目组的事。下面是我的一次项目救火经历(背锅经历)。就是年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统。我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登录,对方技术人员一头雾水不知道什么原因,后台日志没有任何错误信息。我临危受命,赶往该项目进行扑火工作,其实本来2天都可以解决的问题,让我花了5天解决。具体原因待我一一解释。

1,未掌握log日志的精髓

  log日志的debug,info,error信息乱打,该用debug的用info,该用info的用debug......,导致的结果就是一个登陆成功请求,后台日志打了300行代码,严重影响了排查追踪问题的效率,项目线上日志级别仍为debug级别,换成info级别呢,结果好多关键信息又没有打印。

  日志输出格式的关键信息不完善,该日志是在哪类目名、发生的线程,以及在代码中的行数都没有清楚的显示出来,这个日志是哪里打印的都无从知晓。

  关于这里,我想说的是,会的框架再多,spark,flink,hadoop,消息中间件等各种上层框架配置的在溜只是花拳绣腿,log日志是内功,它是日后面对各种线上问题能够快速排查的一种手段。

  下面这个是他的日志输出:

2,核心参数不做判断

  方法返回的数据不做null或""字符串判断,导致各种情况的空指针异常。项目的功能都是理想化,预想我就是需要这些数据才能给你正确的结果,否则哪里出错我不知道。这个问题导致我在还原案件现场时给我造成极大的困惑,一不留神一个空指针错误,我必须对这个错误进行加强的判断处理,好方便我模拟出登录多次后无法登录的情况。

  另外项目中sql语句的in的使用不规范,结合前面的null判断没有,出现一种:"咦,我用这个账号登录就成功了,sql是正确的,用这个人的账号登录,怎么就报sql语法不正确啊,明明调用的是同一块的代码啊"

很明显的roleid为"‘字符串的话,这条sql语句的语法是由问题的。

3,局部变量提升为静态变量

  这个是文章开头提的问题的原因,因为登录要向单点系统验证用户的身份,所以它采用httpclient框架来发送http请求,它在这里把httpclient的变量作为一个静态变量,然后在方法里面复用该对象,然后方法里面调用完该对象又没有释放资源合理的close,这个框架默认会维护一个连接池,如果你申请一个资源使用后不释放,那么该资源将不被下一个请求使用,新的请求必须在等待队列中等待,然后当用户登录20次后,把资源池中的请求都耗尽了,新的请求拿不到资源位于等待队列中不断等待,导致服务器超时,登录失败504错误。
如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java进阶群:582505643,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

当时我看到这个类的静态变量时httpclient的时候,我心中就飘起不好的预感,此处是一个容易出错的地方,如果是我,对这个框架,这个类没有十足的把握,我会它把整成局部变量,这样在低并发下,就让GC去帮我回收吧。

改造后:

4,拦截器的路径规划混乱

  这个问题也为我排查问题造成了阻碍,排查登录问题,我首先要把它一次登录成功后后端走的方法轨迹追踪出来,看到底是哪一个环节的代码问题,因为没有任务错误信息。他的拦截器呢,一个登录请求成功拦截器反复执行了三次,中间至少有一次拦截器是没有做任何有效出来,出现这的问题是他前端业务发送无关的请求,被拦截导致的,这个逼得我通过日志插桩计数来还原勾勒出它的完整路径,为我审查代码找到调用httpclient这一块的代码问题提供的机会。

5,乱用try catch

  这个也很恶心,它的代码突然try catch包装一下,咦,这个家伙得不错,还对某些异常进行特殊打标记录,我仔细看了一下代码,这是什么鬼啊,catch中怎么把异常信息吃了,吃了就吃了,你为啥也不打印异常信息,也不throws异常,就这样凶猛的将异常吃了,明明有问题,它不报,通过它来引发一个新的异常来雪藏真正的问题。

最后我想说,程序员何苦难为程序员,代码留一线, 日后好相见啥。你也不想自己给自己挖坑后,解决不了,然后来一句"大哥,你忙吗,我这有个小问题,帮忙看下呗(嗑瓜子)"。

原文地址:http://blog.51cto.com/13552785/2113031

时间: 2024-11-05 15:49:31

五年java开发生涯中一次吐血的项目救火(程序员何苦难为程序员)的相关文章

将CKEditor集成到Java开发环境中

本文主要介绍如何将CKEditor集成到Java开发环境中,CKEditor是FCKEditor的升级版,使用很方便.下面是基本使用方法: 第一步:下载必要的库 1.到CKEditor官网http://www.fckeditor.net/download/下载Ckeditor4.0.2,这是目前最新的版本,4.1马上就出来了. 2.找到CKEditor 3.6.4 for Java,download.jar按钮,下载ckeditor-java-core-3.5.3.zip,这是java集成的ja

20145207《Java程序设计》实验五(Java开发环境的熟悉)实验报告

<Java 程序设计>实验五(网络编程与安全)实验报告 目录 改变 网络编程与安全实验要求 实验成果 课后思考 改变 修改了之前仅仅是贴了图片,连代码都没粘的状态.不过这篇博客我只能做到写好,毕竟里面的东西我说我做得出来我自己都不信.. 代码贴的·,这个真的不会做实话实说 网络编程与安全实验要求 任务一: 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上面功能中获取的表达式中实现后缀表达式求值的功能 任务二: 结对编程:一人负责客户端,另一人负责服务器 注

阿里java开发手册中命名规约之DO/BO/DTO/VO/AO

前言 在阅读<阿里巴巴Java开发手册>时,看到命名规则中有这样一条 虽然以前也知道这些是根据Java对象的角色所分配名称的后缀,但是没有弄清楚分别是什么意思,日常开发中也没有使用到. 网上查找了一些资料,但是感觉大多数都是一样的,可能大家都是互相copy,篇幅过长并且不易理解. <阿里巴巴Java开发手册>中对于上面这些在领域模型的命名使用上给出了规范,说的很清楚,分享给大家. 领域模型命名规约 1.数据对象:xxxDO,xxx即为数据表名: 2.数据传输对象:xxxDTO,xx

Java学习第五篇 -- Java开发环境

Java开发环境 Java SE 开发环境 Java的开发环境支持Windows.MacOS.Linux,故下面以操作系统作为分类去配置开发环境. Windows Java Platform, Standard Edition Installation Guide - Windows 安装并配置JDK 下载JDK Java SE Development Kit 8 Downloads Java SE Development Kit 8 选择 Windows x64 先接受协议,然后下载 jdk-

为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remove和add操作?

在阅读<阿里巴巴Java开发手册>时,发现有一条关于在 foreach 循环里进行元素的 remove/add 操作的规约,具体内容如下: 错误演示 我们首先在 IDEA 中编写一个在 foreach 循环里进行 remove 操作的代码: import java.util.ArrayList; import java.util.List; public class ForEachTest { public static void main(String[] args) { List<S

在java开发环境中,快捷键的使用及用法

(1)Ctrl+M切换窗口的大小 (2)Ctrl+Q跳到最后一次的编辑处 (3)F2当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Tooltip Description.F3跳到声明或定义的地方.F5单步调试进入函数内部.F6单步调试不进入函数内部,如果装了金山词霸200则要把“取关”的       快捷键改成其他的.F7由函数内部返回到调用处.F8一直执行到下一个断点. (4)Ctrl+Pg~对于XML文件是切换代码和图示窗口 (5)Ctrl+

阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义

分层领域模型规约: DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象. DTO( Data Transfer Object):数据传输对象,Service或Manager向外传输的对象. BO( Business Object):业务对象. 由Service层输出的封装业务逻辑的对象. AO( Application Object):应用对象. 在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高. VO( View Object

java 开发微信中回调验证一直提示 解密失败处理(Java)

微信公众号平台接入JDK6和JDK7及JDK8加解密失败处理(Java) 根据自己jdk版本编译,如jdk7或者jdk6 ,此时部署后提示报错:java.security.InvalidKeyException:illegal Key Size jdk7:微信开发者文档提供了下载JCE无限制权限策略文件UnlimitedJCEPolicyJDK7.zip(JDK7的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-7

在 java 开发接口中需要注意的问题

1 在开发过程中免不了对接上游或下游,有合作就要保证入参.出参的准确性.一个接口一般只能处理有限情况下的情况,因此在逻辑处理前要对入参进行校验. 2 在自己的逻辑处理过程中,要时刻持有怀疑的态度.假设每一步骤出问题了,在生产上如何快速的捕获问题所在.此时,就显露出日志的重要性了!!!在必要的地点一定打日志.对于异常记录,一定要记录堆栈信息,方便日后查找问题. 原文地址:https://www.cnblogs.com/zhaopengcheng/p/10593387.html