先描述我们项目发布环境
我们用的是商业K8S,项目发布是用CICD。
1、问题描述
开发在本机测试接口没问题,发布到docker里却出现404错误。
2、排查过程
1)检查请求方式,GET还是POST请求。
结果一致。
2)检查参数,接口接收是对象,FORM请求。
结果一致。
3)检查spring扫描范围(@ComponentScan(basePackages = {"com.ni.qtjk","com.hfkj"}))
没有发现问题。
4)排查SVN与开发本地代码
结果一致。
5)查检流水线dockerfile
没有发现问题
6)进入容器curl http接口(检查网络转是否存在问题)
报404错误(说明网络不存在问题)
纠结,真想不出其它的办法。
这时想到了线上问题排查神器arthas
1)进入容器安装arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
2) 反编译代码
arthas 中sc命令可以进行代码反编译
输入 sc com.ni(我们服务包名)发现无包名,却看到一个已经被删除的包名
进入被删除的包名找到其中一个类反编译,发现代码确实是被删除的包下代码,这时问题已经确定,容器里面的jar肯定与SVN不一致,问题必定出现在流水线中。
3)核对流水线涉及到jar的地方(因为流水线是运维同事创建的)
发现流水线在制作镜像环节用的jar和pom(我们用的是maven)不一致
问题点已找到,修改成与pom一致重新执行流水线即问题解决。
3、问题复盘
流水线创建之初是不存在问题的,开发同事后来因为业务划分所以也修改了pom配置,开发同事不了解maven编译原理,所以修改pom后也未通知运维同事就出现了这一现象。花了我半天的时间啊。写此日志以警醒自己。