后端架构演进:从单体到云原生,一个三线城市“伪大厂”技术负责人的血泪史

写码的阿川
2025-12-12 19:08
阅读 222

上周五晚上十点半,我瘫在公司沙发上刷知乎,看到一条高赞回答:“深圳互联网圈,除了腾讯系,其他都是‘伪大厂’。” 我苦笑了一下——没错,我们公司就在南山科技园边缘某栋不起眼的写字楼里,离腾讯滨海大厦走路十五分钟,但工资条上少个零。我是这家“三线城市互联网公司”(虽然公司在深圳,但业务和体量真算不上一线)的技术负责人,带着一支不到二十人的后端团队,主打一个“既要又要还要”。

最近半年,我几乎每个周末都在参加各种技术分享会,不是在蛇口听阿里云讲Serverless,就是在福田跟字节的兄弟聊Service Mesh。为啥这么拼?因为去年双11期间,我们的老系统差点把整个机房干冒烟了。

起点:那个“能跑就行”的单体应用

时间倒回2021年,我们的核心系统还是个标准的Java单体应用:Spring Boot + MyBatis + MySQL,部署在三台物理机上,Nginx做简单负载。代码仓库里,一个order-service模块里塞了订单、支付、库存、用户积分、甚至还有个临时写的爬虫(别问,问就是运营小妹求着加的,说竞品价格变动快,得实时监控)。

那时候的日子其实挺“快乐”的——改个需求,改完测完,Jenkins一键发布。虽然每次发版都要挑凌晨三点,但至少不用半夜被PagerDuty吵醒。直到有一天,运营总监拿着Excel冲进会议室:“我们双11要搞大促!目标GMV翻五倍!”

我当时心里咯噔一下:翻五倍?现在的QPS峰值才300,数据库CPU一到80%就报警,这怎么玩?

果然,大促前一周压力测试,系统直接崩了。日志里全是:

Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 3000ms.

更搞笑的是,那个临时爬虫模块因为没加限流,疯狂调用外部API,把出口带宽打满了,导致支付回调超时。产品经理一脸无辜:“这不是你们后端的事吗?”

那一刻,我真的想砸电脑。

第一次挣扎:微服务拆分,拆出一堆新坑

痛定思痛,老板拍板:“搞微服务!学人家大厂!” 于是我们开始了“壮士断腕”式的拆分。

我们把原来的单体按业务域拆成了:user-service、order-service、payment-service、inventory-service,还有一个独立的crawler-service(这次终于把爬虫拎出去了,谢天谢地)。全部用Spring Cloud Alibaba那一套:Nacos注册中心、Sentinel做熔断、Seata搞分布式事务。

拆分过程堪称“地狱副本”。最头疼的是数据一致性问题。比如下单时要扣库存、创建订单、发优惠券,原来在一个事务里搞定,现在跨三个服务。我们试过Seata的AT模式,结果线上出现大量锁表,DBA差点提刀来砍我。

后来改成最终一致性 + 消息队列(RocketMQ),写了一堆补偿逻辑。测试同事看着我写的重试机制直摇头:“你这代码,比我的感情还脆弱。”

但至少,系统扛住了今年618。虽然期间出了个小事故:crawler-service因为没做好资源隔离,爬虫任务占满CPU,导致order-service调度延迟。运维大哥在群里@我:“你们后端能不能管管自己的服务?别总让我们背锅!”

云原生:不是赶时髦,是被逼上梁山

真正让我下定决心全面拥抱云原生的,是一次“史诗级”故障。

今年9月,我们租用的IDC机房遭遇区域性断电(别问为什么没上云,问就是历史包袱+老板抠门)。整整4小时,服务完全不可用。客户投诉电话打爆客服热线,老板在高管会上脸色铁青。

那天晚上,我和CTO在公司楼下吃烧烤,他灌了半打啤酒后说:“明年预算批了,全量上云,搞云原生。”

于是,我们开始把所有服务容器化,用Kubernetes编排。一开始觉得K8s文档像天书,kubectl get pods 都要查半天。但架不住社区生态强大,加上深圳这边云厂商的技术支持还算给力(毕竟离腾讯近,连腾讯云的SA都来给我们做过免费咨询)。

我们选型了阿里云ACK(阿里云Kubernetes服务),原因很简单:便宜 + 中文文档友好。把Java应用打包成Docker镜像,配置好HPA(Horizontal Pod Autoscaler),再配合Prometheus + Grafana做监控,效果立竿见影。

举个例子,crawler-service现在可以动态扩缩容:白天爬虫任务多,自动扩容到10个Pod;晚上闲时缩到2个。再也不用担心它拖垮其他服务了。

# crawler-service HPA配置示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: crawler-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: crawler-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60

运营驱动的技术演进?真香!

有意思的是,这次架构升级最大的推动力,居然来自运营团队。

以前他们想要个新功能,比如“实时监控竞品SKU价格变化”,就得排期、开发、测试、上线,至少两周。现在有了云原生平台,我们给他们开了个低代码接口:运营同学填个表单,指定URL规则、抓取频率、解析规则(XPath或CSS Selector),我们的crawler-operator(自研的K8s CRD控制器)自动生成爬虫Job并调度执行。

上周运营小妹还特意给我送了杯喜茶:“哥,你们这系统太牛了!我昨天下午提的需求,今天早上就有数据了!”

我一边喝喜茶一边想:这不就是DevOps的理想状态吗?开发、运维、运营无缝协作。虽然现实是,我还是得半夜起来处理K8s节点NotReady告警……

Java在云原生时代的“瘦身”之路

说到Java,很多云原生文章都在唱衰:“Java太重了,启动慢,内存占用高,不适合Serverless!” 作为一个写了十年Java的老兵,我一开始也慌了。

但我们试了GraalVM native-image,把核心服务编译成原生可执行文件,启动时间从15秒降到200毫秒,内存占用减少60%。虽然构建过程痛苦(各种反射、动态代理要手动配置),但效果是真的香。

另外,我们全面切换到Quarkus框架。它专为云原生设计,支持快速启动和低内存消耗。下面是个对比表格:

指标 Spring Boot (JVM) Quarkus (Native)
启动时间 12s 0.15s
内存占用 512MB 45MB
冷启动延迟(Serverless) 极低
开发体验 成熟,生态好 学习曲线陡

当然,不是所有服务都适合切Quarkus。像crawler-service这种I/O密集型、对启动时间不敏感的,还是用传统Spring Boot更省心。

云原生不只是技术,更是组织能力

最后说点掏心窝子的话。

从单体到微服务再到云原生,最难的从来不是技术,而是人。

我们团队刚开始搞K8s时,后端、运维、测试各执一词:

  • 后端说:“YAML谁看得懂?我要图形界面!”
  • 运维说:“你们自己管好自己的Deployment,别老找我!”
  • 测试说:“环境怎么又挂了?还能不能好好测了?”

后来我们强制推行“SRE文化”:每个后端工程师必须会写基础YAML,会看Prometheus指标,会处理Pod CrashLoopBackOff。每周五下午固定两小时“云原生工作坊”,轮流分享踩坑经验。

上个月,我们团队第一次实现了“无人值守发布”:CI/CD流水线自动构建、测试、部署到预发环境,通过自动化冒烟测试后,凌晨2点自动灰度发布到生产。我在床上收到企业微信通知:“发布成功,当前错误率<0.1%。” 那一刻,感觉所有的加班都值了。

写在最后:小公司的生存之道

作为一家非一线大厂的技术负责人,我深知资源有限、人力紧张。但我们也有优势:决策链短、试错成本低、技术栈灵活。

云原生不是大厂的专利。哪怕你只有三个后端,只要业务有弹性伸缩、高可用、快速迭代的需求,就值得投入。

下次在深圳技术分享会上,如果你看到一个穿着格子衫、顶着黑眼圈、还在滔滔不绝讲K8s Operator的男人——那可能就是我。欢迎来交流,顺便请我喝杯瑞幸(喜茶太贵了,老板只给报销瑞幸)。

对了,我们还在招Java后端,要求不高:会写代码、能扛压、愿意学云原生。至于会不会修咖啡机?那不重要,反正我们办公室的咖啡机早就坏了,全靠续命。


附:生产环境踩坑清单(血泪总结)

  • ❌ 不要在一个Pod里跑多个Java进程(JVM内存争抢,OOM噩梦)
  • ✅ 爬虫类任务务必用K8s Job/CronJob,别用Deployment
  • ❌ 数据库连接池大小不要硬编码,要用ConfigMap动态调整
  • ✅ 所有服务必须暴露/metrics端点,否则监控等于瞎子
  • ❌ 别信“一次配置终身无忧”,K8s版本升级照样炸
  • ✅ 日志一定要结构化(JSON格式),ELK查起来快十倍

共勉。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝