我把一个五年老项目从单体硬生生搬上了云原生
接了个外包,帮深圳一家跨境电商做架构升级。系统是个WAR包,Tomcat 8,塞了订单、商品、库存、会员、营销五个模块,MySQL单库八十多张表,order_detail已破两千万行。部署靠运维手动传包重启,每晚促销卡成PPT。
拆库是最痛的一步
按业务域拆成四个库:订单、商品、用户、营销。光理清外键依赖就画了三天图。
拆库后踩了坑:定时任务跨订单表和商品表JOIN,跨库没法做。改成应用层两次查询,用Java Stream内存join,拆库后索引瘦身,性能反快三成。
分布式事务也是坑。原下单在单库事务搞定,拆库后变成两库写入。Seata AT模式压测全局锁竞争严重,QPS掉一半。最终改用RocketMQ最终一致性:库存扣减失败发消息回滚订单状态,多出“库存扣减中”中间态,性能保住。
Docker化差点搞挂生产
公司环境混沌:开发Windows、测试CentOS 7、生产Ubuntu 18.04,JDK版本还不一样。
一开始把MySQL塞进容器,有次容器重启数据卷没挂上,直接初始化空库。还好是测试环境。后来学乖了:MySQL、Redis等有状态服务留在ECS,只容器化无状态应用。
Dockerfile反复调了七八版,从1.2GB压缩到380MB。关键:用eclipse-temurin:17-jre-alpine基础镜像、多阶段构建、依赖与源码分层。启动时间从45秒降到8秒,对K8s滚动更新至关重要。
两个改观我的工具
Qoder在写CI/CD流水线时用上。让它review Dockerfile和部署清单,揪出两个问题:没配健康检查探针、资源限制没设CPU上限。后者上了生产,容器无限吃CPU能把节点搞挂。
Antigravity是环境管理工具,可快速创建隔离开发环境。多人协作时直接共享一套环境配置,前端再也不会因本地环境问题反复问“为什么接口调不通”。
上K8s那几天住公司了
K8s学习曲线陡。第一次部署Pod一直CrashLoopBackOff,查半天是应用启动时连不上配置中心,Service还没就绪。加initContainer等配置中心起来后解决。
生产用腾讯云TKE,省去维护master的麻烦。设了PodDisruptionBudget保证滚动更新至少两实例在线,HorizontalPodAutoscaler按CPU阈值70%自动扩缩容。
上线那晚盯着Grafana,流量切过去瞬间CPU从85%降到31%,响应时间从1.8秒降到400毫秒。
跑了三个月,出过一次worker节点宕机,K8s自动调度Pod到其他节点,业务无感知。运维说以前至少半小时起。
从单体到云原生不是一蹴而就:拆库、容器化、编排,每步都有细节要抠。但做完后系统终于像个现代系统了,挺爽。

评论 0