后端架构演进:从单体到云原生 —— 一个35岁老码农的深夜独白

高效战士
2025-12-18 04:37
阅读 3347

上周五晚上十一点半,我还在公司对着K8s的YAML文件发呆。窗外北京下着小雨,楼下的煎饼摊早就收摊了,而我的MacBook风扇还在呼呼作响。老婆刚发来微信:“还在加班?明天不是说好陪孩子去动物园?”我叹了口气,回了个“快了”,其实心里清楚,这个“快了”可能还得两小时。

35岁,Java程序员,干了十二年一线开发。去年十月,我开始认真考虑要不要回老家洛阳发展。不是因为卷不动了——虽然确实有点累——而是看着孩子视频里喊“爸爸什么时候回家”,心里不是滋味。在北京,月薪22k,房租3500(合租次卧),通勤单程1小时15分钟。而在洛阳,朋友开的创业公司愿意给12k,但房子月供才1800,还能天天吃我妈做的胡辣汤。

但走之前,得把手头这个项目搞定。这也让我有机会完整经历了一次从单体架构到云原生的重构全过程。今天就和大家唠唠这段“血泪史”。


一开始:Spring Boot 单体应用,真香!

2020年,我们用 Spring Boot 搭了个电商后台,典型的单体架构:一个 JAR 包,MySQL + Redis,部署在阿里云 ECS 上。代码结构清晰,启动快,调试方便。那会儿我跟新来的实习生吹牛:“你看,三天搭完基础框架,一周上线 MVP,这不比那些搞微服务的强?”

确实香。业务逻辑都在一块儿,改个订单状态,Ctrl+F 全局搜就行。本地跑 ./mvnw spring-boot:run,一分钟启动,热加载也稳。那时候,我觉得“微服务”就是大厂用来招人的 buzzword,小团队根本用不上。

直到去年Q2,用户量涨到50万,系统开始频繁 OOM。一次大促,数据库连接池爆了,整个服务瘫痪三小时。老板在会议室黑着脸问:“你们这架构,撑得住明年双11吗?”

我嘴硬:“加机器就行。”
CTO冷笑:“加机器?你算过成本吗?现在一台8C16G的ECS一个月1200,再加三台,光服务器就4k/月,还不算人力维护。”

那一刻,我知道,单体时代结束了。


中间阶段:拆!拆成微服务

我们决定拆。订单、用户、商品、支付……每个模块独立成服务,Spring Cloud Alibaba 全家桶安排上。Nacos 做注册中心,Sentinel 做熔断,Gateway 做网关。

听起来很美好,现实却很骨感。

第一个坑:分布式事务。用户下单要扣库存、生成订单、发消息通知。以前一个 @Transactional 就搞定的事,现在得搞 TCC 或者 Seata。有次测试环境没配好,用户付了钱,订单没生成,库存也没扣,客服电话被打爆。

第二个坑:调试地狱。以前本地起一个服务就行,现在得同时起五个服务+ Nacos + MySQL + RabbitMQ。我电脑内存16G,开完这些,Chrome 都卡成幻灯片。有天凌晨三点,我蹲在公司厕所隔间里,一边拉肚子一边看日志,发现是服务A调服务B超时,因为B的线程池满了……那一刻,我真的想辞职回老家卖红薯。

更别提链路追踪、日志聚合、配置管理……原本一个人能维护的系统,现在需要 DevOps、SRE、中间件团队轮番上阵。人力成本翻倍,但老板只批了两个人头。

那段时间,我天天焦虑。老婆问我:“你最近怎么总叹气?”我说:“我在想,是不是技术选型错了。”其实心里在想:我是不是该认命,回老家写CRUD算了?


转机:拥抱云原生

转机出现在今年三月。公司和阿里云签了战略合作,决定全面上云原生。我本来以为又是 PPT 架构,结果这次动了真格:Spring Boot 应用容器化 + Kubernetes 编排 + Service Mesh(用了 Istio)+ Prometheus 监控。

说实话,一开始我是抗拒的。“又要学新东西?我都35了,还折腾啥?”但架不住年轻同事安利:“哥,K8s 真香!自动扩缩容、滚动更新、自愈能力,比你手动运维强多了。”

咬牙上了。第一步,把 Spring Boot 应用打成 Docker 镜像。很简单,加个 Dockerfile,一行 java -jar app.jar。第二步,写 Helm Chart 部署到 K8s。第三步,接入 Istio,实现流量管理、熔断、限流。

神奇的事情发生了:系统稳定性肉眼可见地提升。

  • 自动扩缩容:大促期间 CPU 超过70%,Pod 自动从3个扩到10个,流量一过,自动缩回去。省了至少两台服务器的钱。
  • 滚动更新:再也不用手动停服务、替换JAR、重启。kubectl apply -f deployment.yaml,无缝升级。
  • 故障自愈:某个 Pod 挂了,K8s 自动拉起新实例,用户无感知。
  • 链路追踪:用 Jaeger 一眼看出哪个服务慢,不用再 grep 日志半小时。

最让我感动的是,开发体验反而变好了。本地用 Minikube 或 Kind 起个轻量 K8s 集群,配合 Skaffold,代码一改,自动 rebuild & redeploy。调试效率甚至超过单体时代。


我的几点真实感悟

  1. 不要为了微服务而微服务。如果业务简单、团队小,单体 Spring Boot 完全够用。微服务的复杂度是指数级增长的,不是银弹。

  2. 云原生不是“高大上”,而是“降本增效”。对我们这种中小公司,K8s 最大的价值不是技术炫酷,而是节省运维成本 + 提升系统韧性。算笔账:以前5人维护3个单体服务,现在3人维护15个微服务,还更稳定。

  3. Java 依然能打。别听网上说“Java 老了”。Spring Boot + GraalVM 原生镜像,启动速度秒杀 Node.js;Quarkus、Micronaut 也在发力云原生。Java 生态的成熟度,依然是后端首选。

  4. 技术人的核心竞争力,不是会多少框架,而是解决问题的能力。我35岁了,照样能啃 K8s 源码,为啥?因为需求逼的。只要脑子没锈,年龄不是问题。


回老家?还是留下?

现在,项目稳定运行三个月,P0故障为零。老板很高兴,给我涨了薪,还问我要不要带团队。

但我还是在犹豫。

昨晚和老婆视频,她说:“洛阳空气好,孩子上学近,你爸身体也不太好……”我看着屏幕上儿子举着画的“爸爸工作照”——一个戴眼镜的人对着电脑冒烟,突然鼻子一酸。

或许,技术演进和人生选择一样:没有标准答案。单体有单体的安稳,云原有云原生的自由。关键是你清楚自己要什么。

我可能会回老家。但不是“躺平”,而是带着这几年积累的云原生经验,在二三线城市做技术顾问,或者帮本地企业做数字化转型。Java 和 Spring Boot 在哪里都能写,K8s 也能在本地机房跑。

35岁,不是终点,是另一个起点。

最后送大家一句我贴在显示器边上的话:“架构服务于业务,技术服务于生活。”

别让代码,困住了你的人生。

—— 一个还在敲键盘的老程序员,2024年6月于北京望京

评论 0

最热最新
暂无评论
高效战士Lv.1
0
影响力
0
文章
0
粉丝