后端架构演进:从单体到云原生——一个成都奶爸的深夜爬坑实录
上周五晚上11点23分,终于把两岁半的小宝哄睡。娃睡得香,我却睡意全无。老婆在隔壁房间刷抖音,我蹑手蹑脚摸出电脑,泡了杯速溶咖啡(别笑,是真的没时间煮手冲),打开VS Code,继续啃《Cloud Native Patterns》。屏幕右下角弹出一条微信消息,是前同事老张发来的:“兄弟,最近在看云原生不?我们新项目要上K8s,缺个后端,你来不来聊聊?”
我盯着那条消息,心里五味杂陈。就在半年前,我还因为不懂“服务网格”和“Istio”被一家大厂面试官当场挂掉。那天回家路上,看着成都三环晚高峰的车流,我在想:月薪15k干了三年,房租3500、奶粉2800、幼儿园学费4000,再这么下去,连给娃报编程班的钱都省不出来。
一切始于那个该死的“爬虫项目”
时间倒回去年十月。我在一家本地SaaS公司做后端,负责一个客户数据采集平台。说白了,就是写爬虫+API接口。系统是典型的单体架构:Spring Boot + MySQL + Redis,跑在阿里云一台4核8G的ECS上。
起初一切顺利。直到某天老板兴冲冲地告诉我:“有个大客户要接入,预估日请求量翻十倍!”我嘴上应着“OK”,心里已经开始冒冷汗。果然,上线第三天凌晨三点,手机疯狂震动——服务崩了。
我一边轻手轻脚爬起来(生怕吵醒刚睡着的老大),一边SSH连服务器。top一看,CPU 100%,数据库连接池爆满。原来那个“大客户”不仅请求多,还频繁调用我们的爬虫触发接口,每个请求都会拉起一个Headless Chrome实例。单体应用里,爬虫逻辑、用户鉴权、数据存储全挤在一个进程里,一堵全堵。
那天早上六点,我顶着黑眼圈给老板汇报:“要么加机器,要么重构。”老板犹豫了一下,说:“先加机器吧,预算有限。”于是我们从1台扩容到4台,搞了个Nginx轮询。短期是稳了,但运维成本翻倍,而且每次部署都要停机——客户开始抱怨“你们系统怎么老维护”。
更糟的是,我在技术群里看到同行聊“Serverless爬虫”、“K8s弹性伸缩”,而我还在手动改Nginx配置。那一刻,我意识到:我的技术栈,已经跟不上这个时代了。
面试题里的“照妖镜”
今年年初,我决定跳槽。投了几份简历,很快收到面试邀约。第一家是成都某跨境电商,HR开价18k。我心想:不错,比现在高3k。
面试官是个戴眼镜的年轻小伙,上来就问:“你们现在的架构是怎么做的容错和限流?”
我说:“用了Sentinel,配置了QPS阈值。”
他点点头,又问:“如果某个爬虫任务卡死了,怎么隔离故障,避免影响其他服务?”
我愣了一下:“呃……我们目前是重启整个应用。”
空气突然安静。
他推了推眼镜:“你有没有考虑过把爬虫模块拆出来?比如用消息队列解耦,或者做成独立的微服务?”
我支支吾吾答不上来。后面的问题更扎心:“了解Service Mesh吗?”“用过Operator模式吗?”“怎么设计云原生下的可观测性体系?”
走出写字楼,我站在春熙路地铁口,看着来来往往的年轻人,突然觉得特别无力。那些曾经熟悉的“单体应用优化技巧”,在云原生时代,就像用算盘对抗云计算——不是不努力,而是方向错了。
回家路上,老婆打电话问我面得咋样。我说:“可能不太行。”她沉默了几秒,说:“要不……先别急着跳?家里这个月信用卡账单还没还。”我心里一酸,差点想放弃。
转折:深夜的“自救式学习”
但我不甘心。每天晚上娃睡了,我就打开B站、极客时间、甚至GitHub Trending,一点点啃。我给自己定了个计划:三个月内,用云原生方式重写那个爬虫项目。
第一步,拆!
我把原来的单体拆成三个服务:
auth-service:处理用户登录和权限task-service:接收爬虫任务请求,写入Kafkacrawler-worker:消费Kafka消息,执行实际爬取
第二步,容器化!
用Docker把每个服务打包。以前部署要手动传jar包、改配置,现在一行docker-compose up搞定。虽然只是本地,但那种“一次构建,到处运行”的感觉,真香。
第三步,上云原生!
我申请了阿里云免费试用额度,在ACK(阿里云Kubernetes服务)上搭了个集群。把三个服务部署上去,配上Ingress做路由,Prometheus+Grafana监控指标。最爽的是HPA(Horizontal Pod Autoscaler)——当Kafka积压消息超过100条,自动扩容crawler-worker的Pod数量!
为了模拟真实场景,我写了个脚本疯狂调用task-service。结果?系统稳如老狗。CPU飙高?自动扩!内存不够?自动扩!爬虫挂了?K8s自动重启!那一刻,我仿佛看到了光。
当然,过程远没那么顺利。有次半夜调试Istio的VirtualService规则,把整个测试环境搞瘫了。小宝突然哭醒,老婆迷迷糊糊问:“你又在搞啥子哦?”我只能苦笑:“在给未来的奶粉钱铺路。”
从“会做”到“讲清”:面试题背后的逻辑
有了实战经验,我重新投简历。这次,我特意在简历里写了:“主导XX系统从单体架构向云原生微服务演进,实现爬虫任务弹性伸缩与故障隔离”。
面试时,当面试官再问“怎么隔离爬虫故障”,我不再慌张。我拿出手机,展示自己画的架构图(其实是Draw.io画的草图),说:
“首先,通过Kafka解耦任务提交和执行;其次,crawler-worker作为无状态服务部署在K8s,配置资源限制和健康检查;最后,用Istio做熔断——如果某个worker连续失败,就把它从负载均衡池里踢出去。这样,就算爬虫炸了,auth和task服务照样跑。”
面试官眼睛亮了。他接着问:“那成本呢?云原生不是更贵?”
我笑了:“恰恰相反。以前4台固定ECS,每月2400块;现在用K8s+HPA,平均只用1.5个Pod,加上Spot实例,成本不到1000。而且故障自愈,运维人力省了一半。”
两周后,我拿到了offer:22k,涨幅近50%。谈薪时,HR问我期望多少。我深吸一口气,想起上个月交完房租只剩800块的银行卡余额,说:“20k起吧。”
她笑了笑:“我们给22k,欢迎加入。”
回家告诉老婆,她第一反应是:“真的假的?不会是骗子吧?”
我说:“是真的。以后老大兴趣班,可以报两个了。”
一点掏心窝子的思考
回头看这段路,我最大的感悟是:架构演进不是为了炫技,而是为了解决真实世界的约束。
在成都这样的二线城市,很多公司还在用单体架构,不是因为技术落后,而是因为“够用”。但如果你像我一样,工资卡在15k瓶颈,想突破,就必须主动制造“不够用”的场景——比如那个崩溃的爬虫系统。
云原生也不是银弹。它带来弹性、可观测性、自动化,但也增加了复杂度。我见过太多人盲目上K8s,结果连Pod日志都查不明白。关键是要理解“为什么”要拆,而不是“怎么”拆。
另外,别小看“爬虫”这种看似低端的需求。它往往是系统压力的第一导火索,也是练习解耦、异步、容错的最佳试验田。下次再有人问“爬虫怎么做高并发”,你可以笑着回答:“先把它从你的主应用里扔出去。”
写在最后:给同样在深夜敲代码的你
此刻是凌晨1点17分,小宝翻了个身,嘟囔了一句“爸爸”。我赶紧合上电脑,轻轻给他盖好被子。
我知道,明天早上六点半又要起床做早餐,送老大去幼儿园,然后挤地铁上班。生活不会因为我会了Istio就变得轻松。但至少,当我面对下一次系统崩溃,不再手足无措;当HR问起架构设计,我能挺直腰杆说出自己的思考。
如果你也和我一样:
- 在二线城市拿着不高不低的工资
- 白天应付需求,晚上偷偷学习
- 既想给孩子更好的生活,又怕技术被淘汰
那么,请相信:每一个深夜的坚持,都在悄悄改变你和家人的未来。
云原生的路还很长,Service Mesh、GitOps、eBPF……新名词层出不穷。但没关系,我们慢慢来。毕竟,娃睡了,夜还长。
(完)

评论 0