建站老手讳谈的5个源码部署致命细节
|
去年高考那会儿,我蹲在测试环境里看日志,发现登录接口返回的 JWT 里,sub 字段居然是 null——不是空字符串,是 JSON 里的 null。李工说“肯定前端没判”,我把 token 拷给他,他对着浏览器 console 皱了三分钟眉,手机一直在震,也没接。 白板笔没水了,我用红笔头蹭着写了两行“鉴权绕过风险”,墨色发灰,底下那行“建议重签”被空调滴水溅歪了一小块。陈婷当时就坐我左手边,把 PRD 打印稿叠成三角锥立着挡风扇——她上个月刚拒掉一个埋点需求,理由是“漏斗第二步转化太低,不值得投资源”。我原以为她说的是埋点粒度太细,结果她指的居然是那个二级页面底部的“联系客服”按钮根本没人点,连取舍都谈不上,直接进了回收站。 第一个细节:config.properties 里 datasource.url 写的是 ${db.host}:${db.port},但打包脚本里压根没注入 -Ddb.host,它就在那儿,硬生生读成 localhost:3306——而线上数据库叫 db-prod-02。运维老张查了六小时,最后靠 grep -r "localhost" 在 target/classes 下搜出来的。这事没人提,因为一提,就得翻出半年前那次“紧急合并”记录,那会儿谁都没动过本地配置文件,但打包镜像却用了开发机上的 maven settings.xml——里头 profile 默认激活了 dev 环境。优胜劣汰?不,是淘汰了第一个敢问“这 config 到底谁管”的人。 投影仪对焦不准,背景虚成一片灰,我看不清自己写的 deploy checklist。桌上那摞打印的需求单没人收,最上面那张写着“支持微信小程序一键登录”,右下角手写“优先级:P0(高考期间上线)”,字是王总监签的。我撕了半张便利贴,粘在投影幕布右下角:“别信 P0,信 git tag。” 结果贴歪了,胶面朝外反光刺眼。 第二个细节:logback-spring.xml 里定义了 ,但启动命令写的是 java -jar app.jar --spring.profiles.active=product。注意,是 product,不是 prod。SpringBoot 里 profile 名严格匹配,大小写、拼写、缩写全得对上。它就安静地跑在 dev 配置里,连日志都往 /tmp/log 下写——而监控脚本只扫 /var/log/app/。我们看了三天告警延迟,直到日志轮转把 /tmp/log 清空了两次,才有人翻出那段 XML。记不清是哪个版本了,反正不是 SpringBoot 2.4 之后的——之前它居然默认 fallback 到 default profile,现在不 fallback 了,可文档里那句“推荐使用标准命名”还是斜体小字。
文章配图,仅供参考 第三个细节:static 目录下放了个 index.html,但 nginx 配置里 root 指向的是 /opt/app/current/static,而实际路径是 /opt/app/current/resources/static。你猜怎么着?它真能打开——因为 SpringBoot 的 WebMvcAutoConfiguration 里默认启用了 static-location fallback,兜底去 classpath:/static/ 读。于是你改了 HTML,删了缓存,清了 CDN,重启 nginx,刷新十次——看到的永远是 jar 包里上个版本的 index.html。这个 bug 我见过三次,每次都是客户问“为啥首页文案没变”,我才想起来去解包 jar。无所谓,真的无所谓,反正首页三个月没人改。 外卖的汤洒了一点在桌上,刚好流到我刚写的“灰度策略验证项”旁边。那行字现在泛黄,有点晕染。王总监后来推门进来问“小程序登录测完没”,我点头说测完了,其实只在预发环境跑通了 authCode 换 token——忘了 mock 微信回调的证书校验,预发走的是 HTTP 代理,线上 HTTPS 握手失败。没人骂我,因为当天所有人的注意力都在“高考生查分入口卡顿”上。后来我悄悄把那个证书检查开关加到了配置中心,灰度开到 5%,三天后关掉。没人知道它开过。 第四个细节:application.yml 里有个 spring.jackson.date-format: yyyy-MM-dd HH:mm:ss,看着规整吧?可 MySQL 的 timestamp 类型默认时区是 server zone,JVM 是 Asia/Shanghai,MySQL 驱动版本又卡在 5.1.47,它就不认这个格式,把时间字段全塞成 1970-01-01。线上订单创建时间全是 Unix 起点。修复方案?改成 ISO_OFFSET_DATE_TIME,再加 jackson.deserialization.adjust-dates-to-context-time-zone=true。但没人改,因为订单页早就下线了,用户反馈里压根没人提时间错,他们只骂“查不到订单”。 第五个细节:jar 启动时用的是 -Xms512m -Xmx1024m,而容器 cgroup memory limit 设的是 1g。JVM 堆外内存、Netty direct buffer、GC 元数据、JNI 调用——全挤在这 1g 里,OOM killer 第一个干掉的就是 java 进程。k8s event 里只显示“container killed due to OOM”,排查时所有人先盯 GC 日志、然后翻 JVM 参数、最后才想起去看 limits.yaml。老张那天说“Java 内存管理,真得活过三轮大促才知道坑在哪”。我说不是,是得等第一次被杀得猝不及防。 陈婷把三角锥PRD推倒了,纸散开,露出底下一张A4,印着“2023年Q2用户路径优化报告”,标题右边画了个手绘箭头指向“暂无排期”。她起身去接水,路过我椅子时说了句“那个二级页底部按钮,我上周看见用户点进去了,点了17次,全跳转到404”。我愣了一下,没回她。因为404是另一个团队维护的 H5 页面,域名换了,我们没同步重定向规则。这个细节没进任何评审、没挂任何 Jira、甚至没人在周会上提。它就这么死了,死得比需求还安静。 会议室的椅子少一把,老张一直站着,没坐下。他手机也震,但没看。我原以为他会说“下次部署前,咱把配置中心的值全部 export 一遍,人工核对”,结果他开口说的是:“要不…让新来的实习生,每天下午三点,手动 curl 一遍所有 health check 端点?” 我点了头。 (编辑:草根网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |






浙公网安备 33038102330471号