别一上来就拆微服务——从 Monolith 到 Microservices 的正确迁移姿势
——从 Monolith 到 Microservices 的正确迁移姿势
这几年我在运维圈子里,见过太多“悲壮”的场面:
- 项目一稳定三年,领导一句:“我们要微服务化”
- 架构图一画,系统瞬间从 1 个服务变成 30 个
三个月后:
- 链路追踪看不懂
- 发布像走钢丝
- 线上问题定位全靠“玄学”
最后大家私下里只敢说一句:
以前是一个系统难维护,现在是 30 个系统一起难维护。
所以今天这篇文章,我不想吹微服务有多香,我想聊点更现实的:
Monolith 到 Microservices,怎么走,才不会把自己送走。
一、先泼一盆冷水:不是所有系统都“配得上”微服务
很多人默认一个前提:
Monolith = 落后
Microservices = 先进
但在我眼里,这个等式本身就有问题。
我见过不少 活得很滋润的 Monolith:
- 业务清晰
- 团队小而稳定
- 发布节奏可控
- 性能问题靠纵向扩展就能解决
反而是一些微服务系统:
- 服务多到记不住名字
- 每次发布都要拜一拜
- 出问题先查 Nginx、再查网关、再查 RPC、最后发现是自己代码写错了
所以我的第一个态度非常明确:
微服务不是目标,是手段。
迁移不是时髦,是成本决策。
二、迁移之前,先回答一个要命的问题
在你拆系统之前,请你认真回答一句话(别糊弄):
“我现在最痛的到底是什么?”
常见答案我帮你总结下:
- 发布一次全站抖三抖
- 一个小需求要改一堆代码
- 团队并行开发互相踩脚
- 某个模块拖慢整个系统
- 系统太大,新人三个月都不敢动
你会发现,这些问题并不一定非微服务不可解决。
很多时候,你真正需要的是:
- 模块解耦
- 边界清晰
- 发布隔离
而不是“拆成 100 个服务”。
三、第一阶段:先把 Monolith 拆“清楚”,别急着拆“分布式”
这是我见过最容易被跳过、但最关键的一步。
1️⃣ 模块边界比服务边界重要 10 倍
在 Monolith 里,先做到一件事:
代码层面像微服务,部署层面还是单体。
比如:
order/
application/
domain/
infra/
user/
application/
domain/
infra/
此时你要做到的是:
- 模块之间 只通过接口交互
- 严禁跨模块直接调用内部实现
- 严禁“顺手 import 一下”
这是在为未来拆服务做心理建设 + 技术准备。
我见过最惨的拆服务案例,问题只有一个:
单体里本来就是一锅粥,拆只是把粥装进不同碗里。
2️⃣ 数据先逻辑隔离,再物理隔离
不要一上来就搞“一个服务一个库”。
先在 Monolith 里做到:
- 每个模块只访问自己的表
- 禁止跨模块 SQL Join
- 用代码层保证数据边界
哪怕数据库还是一个:
-- 逻辑上已经隔离
order_db.order_table
user_db.user_table
这一步做不好,后面拆库拆服务全是灾难。
四、第二阶段:先“挖一块”出去,别“炸整个楼”
很多人迁移微服务失败,是因为 一刀切。
我的建议是:
从“变化最频繁 + 依赖最少”的模块下手。
典型候选包括:
- 用户画像
- 推荐特征
- 统计报表
- 通知 / 消息服务
- 文件 / 图片处理
示例:先拆一个用户服务
[ Monolith ]
|
| HTTP / RPC
v
[ User Service ]
这个阶段有几个关键词:
- 接口优先
- 网络不可靠是常态
- 失败要可预期
代码层面你会第一次体会到这件事:
try:
user = user_service.get_user(uid)
except TimeoutError:
user = default_user()
这不是“写得啰嗦”,这是分布式系统的成人礼。
五、第三阶段:运维复杂度开始反噬你
当服务开始多起来,你会明显感觉到:
- 发布流程变长
- 配置开始混乱
- 问题定位越来越慢
这时候,运维能力如果没跟上,微服务会变成放大器。
你至少要补齐这几样东西:
- 统一日志规范
- 基础链路追踪
- 服务健康检查
- 灰度 / 回滚能力
否则你会发现一个现实:
单体出问题是“定位难”,
微服务出问题是“不知道是谁的问题”。
六、一个很现实的阶段认知:
微服务不是“完成态”,而是“长期状态”
我现在看微服务的态度非常平和:
- 它不会让你一劳永逸
- 它只会把问题从“代码复杂”
转移到“系统复杂”
但如果你已经:
- 团队规模上来了
- 业务节奏快了
- 发布频率高了
- 系统边界清楚了
那微服务确实能帮你 把复杂度“摊开”,而不是“压死”。
七、写在最后:别被架构名词带节奏
我想用一句非常“土”的话结尾:
系统不是越高级越好,
是越“扛得住变化”越好。
Monolith 不丢人,乱拆才丢人。
Microservices 不神圣,驾驭不了才要命。