增量上线java代码引发的生产事故

事情起因

在一个月黑风高的晚上,运维说由于业务流程问题,智能运维告警太多,需要处理,同事就改了一点与业务无关的代码,直接把class文件扔上去。到了早上9点,上游通知整个上午都下单失败,吓得我们赶紧登上系统看,一看确实有问题。。。运维立马回滚到上一个稳定版本,然后我和同事去排查问题原因。

问题排查

因为本地和测试环境的流程是正常的,看样子是没啥问题的,后面模拟昨晚的操作把本地的文件增量上到测试环境上,就报错了,报的是下图的代码和错误。

NoSuchMethodError,找不到这个save方法??我看本地和服务器都有的......

后面再仔细对比,发现里面内有乾坤。本地和测试环境的工具类居然是不一样的。

本地save方法是有返回值的

测试环境反编译后的save方法是没有返回值的

也就是说本地service调用save是调有返回值的save方法,增量上上去之后就找不到有返回值的save方法。

看了增量上线的class文件,结果得到了实锤。

那么为什么两个文件会不一样呢??这就关系了打包工具jenkins。由于里面的工具包项目是放上去没有更新过了,可能是很旧的版本,后面我们本地的是新版本......

可以理解成jenkins save方法(测试、生产环境)是A版本,本地save方法是B版本,本地编译出来需要读取B版本的save,但是服务器只有A版本的save,就有问题了

如果一开始就是本地打包上生产,就是一直都是B版本,就算增量上线也是不会发生问题。

如果把jenkins的工具类更新到和本地一样的版本,增量上线也是没有问题。

总的来说就是由于增量上线,踩了jenkins和本地代码不一致的坑。

总结

主要是因为之前是很久以前的项目,没有用maven管理,导致版本不一致的问题发生。而且对于重要的业务修改还是要走正式流程,不踩坑也不知道改了一个无关紧要的代码会影响到关键业务。另外还是不推荐增量上线代码,因为是直接跳过了编译操作,这样会造成上面说的奇怪问题,如果是正常打包就会自动检查方法是否存在。一个问题的发生总是有多个小问题造成的,如果是某个环节做好了也不会发生这个事情,面对生产环境还是要小心谨慎。

相关推荐
Hello-Brand10 分钟前
Java核心知识体系10-线程管理
java·高并发·多线程·并发·多线程模型·线程管理
乐悠小码16 分钟前
数据结构------队列(Java语言描述)
java·开发语言·数据结构·链表·队列
史努比.18 分钟前
Pod控制器
java·开发语言
2的n次方_20 分钟前
二维费用背包问题
java·算法·动态规划
皮皮林55121 分钟前
警惕!List.of() vs Arrays.asList():这些隐藏差异可能让你的代码崩溃!
java
莳光.21 分钟前
122、java的LambdaQueryWapper的条件拼接实现数据sql中and (column1 =1 or column1 is null)
java·mybatis
程序猿麦小七26 分钟前
基于springboot的景区网页设计与实现
java·spring boot·后端·旅游·景区
weisian15132 分钟前
认证鉴权框架SpringSecurity-2--重点组件和过滤器链篇
java·安全
蓝田~34 分钟前
SpringBoot-自定义注解,拦截器
java·spring boot·后端
theLuckyLong35 分钟前
SpringBoot后端解决跨域问题
spring boot·后端·python