第3章:单体架构 vs 微服务架构
这一章,我们来聊聊ERP架构里最核心的一个选择题——单体还是微服务?
说实话,这个问题我这些年被问过不下百次。每次技术选型评审会上,总有人拍桌子说「必须上微服务」,也有人坚持「单体够用就别折腾」。两边都有道理,但关键得看场景。
3.1 单体架构:老牌选手的底气
单体架构,说白了就是把所有功能都塞进一个进程里。ERP系统最传统的做法就是这样——财务、采购、库存、生产,全在一个应用里跑。
优点很明显:
- 开发简单:一个项目,一套代码,IDE里直接跑。我早期做ERP时,一个团队5个人,三个月就能出一个可用版本。
- 部署省心:打一个WAR包,丢到Tomcat里完事。运维同学最喜欢这种,不用操心服务间调用。
- 调试方便:出问题了?本地起一个实例,断点一打,从头跟到尾。我在项目中遇到过好几次,微服务出问题要查三个服务才能定位,而单体半小时就搞定了。
- 事务好管:数据库本地事务,ACID稳稳的。财务模块的记账操作,你想想看,跨服务搞分布式事务有多头疼。
但缺点也扎心:
- 牵一发动全身:改一行代码,整个应用要重新部署。我记得有一次,只是改了个报表的字体颜色,结果触发了全量回归测试,折腾了两天。
- 扩展性差:某个模块负载高了?对不起,你得把整个应用都扩容。采购模块流量大,但财务模块根本不需要那么多实例,白白浪费资源。
- 技术栈锁定:选了Java就是Java,想混用Python做数据分析?没门。
适用场景:
- 团队规模小于20人
- 业务逻辑高度耦合,比如传统制造ERP
- 并发量不大,日均PV低于100万
- 快速验证期,MVP阶段
3.2 微服务架构:拆分的艺术
微服务,就是把一个大系统拆成一堆小服务。每个服务独立部署、独立扩展、独立技术栈。
优势在哪?
- 独立部署:采购团队改采购的,财务团队改财务的,互不干扰。我在一个电商ERP项目里,库存服务一天能发布5次,而财务服务一个月才发一次。
- 弹性伸缩:双十一大促,订单服务扩到100个实例,用户服务保持10个就行。你想想看,单体能做到吗?
- 技术多样性:订单服务用Go,报表服务用Python,数据服务用Java。各取所长,不纠结。
- 故障隔离:库存服务挂了,不影响财务和采购。我曾经见过一个单体ERP,一个报表查询把数据库连接池打满了,结果所有用户都登不进去了。
但坑也不少:
- 分布式复杂性:服务间通信、数据一致性、链路追踪,每个都是大坑。我刚开始搞微服务时,光搭一个服务网关就折腾了一周。
- 运维成本高:需要容器编排、服务发现、配置中心、监控告警。小团队根本玩不转。
- 数据管理难:每个服务有自己的数据库,跨服务查询怎么办?报表怎么办?我曾经在一个项目里,为了做一个跨三个服务的报表,写了整整两天的数据聚合代码。
避坑指南:我曾经见过一个团队,把只有10个功能的ERP硬拆成20个微服务。结果呢?开发效率下降了50%,线上故障率翻了三倍。微服务不是拆得越细越好,合适的粒度才是关键。
3.3 两者对比:一张表说清楚
| 维度 | 单体架构 | 微服务架构 |
|---|---|---|
| 开发效率 | 初期高,后期低 | 初期低,后期高 |
| 部署复杂度 | 低,一个包搞定 | 高,需要CI/CD流水线 |
| 扩展性 | 垂直扩展为主 | 水平扩展,按需伸缩 |
| 故障影响 | 全局影响 | 局部隔离 |
| 技术栈 | 单一 | 多样化 |
| 团队要求 | 全栈工程师 | 领域专家+DevOps |
| 适合阶段 | 初创期、稳定期 | 成长期、爆发期 |
3.4 迁移策略:从单体到微服务
如果你已经在用单体,想往微服务迁移,我建议你按这个步骤来:
- 先别急着拆:先把单体代码整理好,模块边界划清楚。我见过太多人,代码一团糟就开始拆,结果拆完更乱。
- 从边缘模块开始:选一个耦合度低、业务独立的模块先拆。比如报表模块、通知模块。别一上来就动核心交易流程。
- 做好防腐层:拆出来的服务,要和老系统做好接口适配。我习惯用API网关做统一入口,新旧系统都能接。
- 数据先分离:服务拆了,数据库也得拆。但别一次性拆完,可以先做逻辑分离,再物理分离。
- 逐步替换:拆一个,稳定一个,再拆下一个。别想着三个月全拆完,那是不可能的。
我的经验:迁移过程中,一定要保留回滚能力。我曾经在一个项目里,拆完采购模块后发现性能反而下降了,赶紧回滚到单体版本。等优化好了再重新拆,前后花了半年才稳定下来。
3.5 我的建议
嗯,说了这么多,最后给个实在的建议:
- 别盲目追微服务:如果你的ERP用户不到1000人,团队不到10个人,单体完全够用。别为了技术而技术。
- 也别死守单体:当你的业务模块之间需要独立迭代、独立扩展时,微服务是必然选择。
- 折中方案:其实还有一种「模块化单体」的玩法——代码层面拆成模块,部署层面还是一个包。这样既保留了单体的简单,又有了微服务的模块化思维。我个人比较推荐这种过渡方案。
记住一句话:架构没有银弹,只有适合不适合。你想想看,一个卖煎饼的摊子,需要搞中央厨房吗?不需要。但如果你要开100家连锁店,那就必须标准化、模块化了。ERP架构也是这个道理。