从单体到云原生:我在后端架构演进中的踩坑与成长
引言:从“能跑就行”到“可扩展的系统”
记得我刚入行时,做后端开发最简单的项目就是搭个 Spring Boot + MySQL,把业务逻辑写通了就能上线。当时的项目是公司内部的一个审批系统,用户量小、并发不高,部署在一台 ECS 上,代码也不分层,一个类里几十个方法混着数据库操作和业务逻辑。那会儿觉得,“只要能跑起来,管它结构清不清楚呢”。
但随着经验的增长,尤其是加入一家快速发展的创业公司后,我亲身经历了从小作坊式开发到拥抱云原生技术的全过程。整个过程中有过迷茫、踩过很多坑,也有过几次架构上的顿悟。
今天我想通过我们团队这几年经历的实际项目,聊一聊后端架构是如何一步步从单体走向微服务、走向容器化、走向真正意义上的云原生体系的。
项目背景:从电商后台起步的成长之路
2019年我们开始搭建一个新的电商平台,目标是构建一个集商品管理、订单处理、支付结算于一体的综合型电商系统。最初采用的是典型的单体架构:Spring Boot + MyBatis + MySQL 主从 + Redis,所有模块都跑在一个应用中,前后端分离,前端用 Vue.js。
早期这种结构简单易维护,但随着用户增长和功能越来越多,问题逐渐浮现出来。
遇到的挑战:单体架构的瓶颈越来越明显
1. 发布风险极高
每次新版本上线,都需要将整个应用打包部署。哪怕只是改了一行日志输出的格式,也要重启整个服务,这对一个正在运行的订单系统来说风险巨大。
有一次上线改动了一个订单导出功能的 SQL,结果忘了加 limit 分页,上线后查询一张千万级数据的表直接卡爆了数据库连接池,导致整个网站瘫痪两个小时,损失了不少交易金额。
2. 无法横向扩展
不同模块(比如库存、支付)负载不均,但没办法独立扩容。高峰期支付系统压力大,但你必须把整个服务扩容一遍,资源利用率低不说,成本也高。
3. 团队协作困难
多人并行开发同一个工程,merge 冲突频发。特别是接口文档不统一,大家写的 Controller 层风格五花八门,甚至有些字段命名都没有统一标准。
4. 监控和运维手段落后
只有一个监控报警(监控的是 JVM 内存),没有 API 调用链追踪,没有慢查询分析工具,排查问题基本靠打印日志 + 手工查 SQL。
这些问题让我意识到:如果再继续这么搞下去,项目很快就会陷入“不可维护”的死循环。

抉择:我们要不要重构?要不要拆服务?
经过一段时间的调研和对比,我们决定走一条折中的路线:先做模块化改造,再逐步拆微服务。因为我们担心一次性大换血会导致项目彻底失控。
于是,我们在原有工程内做了几个关键改动:
- 使用 DDD(领域驱动设计)对系统进行模块划分
- 各个模块之间使用 Interface 进行解耦
- 基于 Maven 多模块结构隔离各个子系统
- 将部分通用能力抽象为 SDK(如鉴权、日志、异步消息)
这一步虽然不是真正的微服务,但却为后续服务拆分奠定了基础。
后来到了2021年,我们才正式迈入微服务时代,采用了 Spring Cloud Alibaba 的技术栈(Nacos + Sentinel + Gateway + Seata 等)。
微服务化的尝试与踩坑
服务拆分策略
我们根据业务域划分成如下几个核心服务:
- 用户服务(user-service)
- 商品服务(product-service)
- 订单服务(order-service)
- 支付服务(payment-service)
- 库存服务(stock-service)
每个服务都基于 Spring Cloud 构建,使用 Feign 实现服务间通信,Nacos 作为注册中心和服务配置中心,Seata 管理分布式事务。
当时我们信心满满地完成了第一轮拆分测试,结果上线第一天就遇到了大麻烦:
Feign 超时风暴!
多个服务间频繁调用,超时重试机制没有控制好,导致请求雪崩,系统几乎崩溃。最终通过以下几种方式解决:
- 设置合理的超时时间(Feign + Ribbon)
- 加入 Hystrix 熔断降级机制
- 对接口进行分级限流(Sentinel)
- 引入异步处理降低依赖
另外一次故障也很值得反思:
配置中心没生效,服务集体“失忆”
上线前我们为了图省事,在本地调试时用了 application.yml,没有强制使用 Nacos 配置中心。结果测试环境没问题,上线之后才发现有些节点并没有从 Nacos 拉取配置,数据库连接池参数还是默认值,造成多个服务连接失败。
教训:一定要在启动脚本中强制启用远程配置,并在 Jenkins 流水线里增加配置检测环节。
数据库设计:由集中走向分片
拆微服务之后,紧接着的问题就是:如何处理原来集中式的数据库?
初期我们依然共用一个 MySQL,但随着时间推移,这张“万能表”变得异常臃肿,性能也开始下滑。后来我们做了两件事:
按照服务边界拆库
- 每个服务有自己的数据库实例
- 数据表只暴露给自己的服务访问
引入 ShardingSphere 做分库分表
- 对于数据量大的表(比如订单表)按 user_id 做水平分片
- 查询时配合 Elixir 或者 ElasticSearch 提升检索效率
但这里有个坑需要特别提醒新手朋友们:
不要盲目追求分库分表,除非你真的遇到了性能瓶颈!
我们曾经因为“预防性设计”提前做了几张表的分表,结果发现根本没有查询频率那么高,反而让维护更复杂。后来把这些表又合回去,得不偿失。
接口设计:从随意返回到标准化封装
初期接口返回格式极其混乱,有的返回 {"code": 0, "msg": "", "data": null},有的返回 String,还有的直接抛异常返回 HTML 错误码。
后来我们统一接口规范,采用以下格式:
{
"code": 200,
"message": "成功",
"data": {}
}
同时制定了 RESTful 规范:
- GET /users 获取列表
- POST /users 创建资源
- PUT /users/1 更新资源
- DELETE /users/1 删除资源
并通过 Swagger 统一生成 API 文档,供前后端协同使用。
容器化与 CI/CD:迈向 DevOps 第一步
2022年我们开始尝试容器化部署,使用 Docker + Kubernetes 替代原来的手动部署流程。
这个阶段最开始遇到几个典型问题:
- 镜像构建不一致:本地 Build 出来的镜像和生产不一样?
- 日志收集不全:Pod 重启后日志丢失怎么办?
- 服务健康检查不完善:K8s Readiness Probe 怎么设?
解决方案:
- 使用 Jenkins Pipeline + GitHub Action 自动打包构建镜像
- 所有容器挂载统一的日志目录,并通过 Filebeat 收集到 ELK
- 健康检查接入 /actuator/health,并加上自定义 DB 健康探测
- 使用 Helm 管理服务配置文件,避免 ConfigMap 污染
其中一个让我印象深刻的案例是关于内存泄漏的排查:
有一个订单服务跑了几天以后不断 OOM,K8s 不断重启 Pod。
一开始以为是 GC 问题,后面通过 dump 堆栈发现是一个缓存未清理的定时任务。修改后问题消失。
所以我也养成了一个习惯:每一个新服务上线之前都要做一轮压测 + 内存分析 + 死锁检测。
云原生生态整合:真正走向自动化与弹性伸缩
2023年初,我们迁移到阿里云 ACK 集群,开始全面拥抱云原生生态,包括:
- Prometheus + Grafana 监控服务指标
- SkyWalking 全链路追踪
- Logtail + SLS 实现日志聚合
- 使用 OpenTelemetry 做指标采集
- 通过 ArgoCD 实现 GitOps 化部署
这一步最大的感受是:工具链完整以后,研发效率大幅提升,我们可以很清晰地看到:
- 每个服务的 QPS 是多少
- 调用链中最耗时的方法在哪一层
- 某个时间段内的错误分布情况
- 某个接口的延迟趋势
这些信息帮助我们更快速定位线上问题,也促使我们更加关注性能优化。
效果总结:从手动运维到平台自治
重构后的整体效果如下:
| 指标 | 改造前 | 改造后 |
|---|---|---|
| 平均部署耗时 | 30分钟(需停机) | <5分钟(滚动更新) |
| 单点故障影响范围 | 整个系统 | 单个服务 |
| 新人上手周期 | 1个月以上 | 2周以内 |
| 日志可视化率 | <20% | >95% |
| 接口平均响应时间 | ~800ms | ~200ms(优化后) |
不仅提升了系统的稳定性和可观测性,也让我们的部署和迭代效率翻倍提升。
经验总结:几点建议送给还在路上的你
不要为了架构而架构
- 架构服务于业务,别被新技术诱惑
- 在合适的时间做合适的决策
尽早落地监控、日志、链路追踪
- 这些看似辅助的东西,其实是诊断问题的关键武器
重视接口设计与文档同步
- 一个清晰的 API 可以节省数不清的沟通成本
容器化要循序渐进,别贪多嚼不烂
- 先跑通一个服务再说,逐步过渡
微服务不是银弹,而是双刃剑
- 你得到的是解耦,失去的可能是复杂度和一致性保证
定期做 Code Review 和架构评审
- 架构演化不是一个人的事情,要形成共识
最后一句真心话
回想起这几年的架构演变之路,其实就是一个字:“痛”,但也正是这一路“痛”过来的经验,让我们在面对未来的变化时更加从容。
我相信,无论你现在处在哪一阶段的后端开发岗位,只要你愿意去思考、去实践,总能找到属于你的那个“完美平衡点”。
如果你也在经历类似的架构升级,请一定坚持下来 —— 未来的你会感谢现在努力进阶的自己。
作者:老王,某头部电商平台后端负责人,热爱折腾架构和技术分享。公众号【后端成长笔记】主理人。

评论 0