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

相关推荐
牛奔3 小时前
Go 如何打印调试深层或嵌套的结构体
开发语言·后端·golang
红烧大青虫3 小时前
HarmonyOS应用开发实战:小事记 - 数据迁移策略:RDB 表结构变更的版本号管理与 onUpgrade 回调
后端·华为·harmonyos·鸿蒙系统
geovindu4 小时前
go: Iterative Algorithms
开发语言·后端·算法·golang·迭代算法
阳光是sunny5 小时前
LangGraph实战教程:defer延迟节点——让收尾工作自动排到最后
前端·人工智能·后端
前端工作日常5 小时前
我学习到的Java中domain和dto区别
java·后端
kite01215 小时前
Go语言Map深度解析与最佳实践
开发语言·后端·golang
阳光是sunny6 小时前
LangGraph实战教程:控制流详解
前端·人工智能·后端
码农学院6 小时前
基于Spring Boot的跨境电商多语言订单管理系统架构设计
java·大数据·spring boot
技术小结-李爽7 小时前
【工具】pom文件的<packaging>
java·maven
hold?fish:palm7 小时前
kv存储主从复制的设计与实现
c++·redis·后端