一、微服务入门:从单体到微服务的演进史
1.1 那个“一个大项目搞定一切”的年代
我记得刚入行那会儿,做项目基本都是单体架构。说白了,就是把所有功能都塞进一个工程里。前端、后端、数据库访问、业务逻辑,全在一个代码仓库里。
那时候团队小,三五个人。一个电商系统,订单、商品、用户、支付,全在一个包里。部署也简单——打个 war 包,扔到 Tomcat 里,完事。
为什么会这样?因为业务简单,用户量小。你想想看,一天几百个订单,一台服务器绰绰有余。那时候没人觉得这有什么问题。
但后来,事情开始变了。
1.2 单体架构的“痛”
我在项目中遇到过最典型的场景:一个电商系统,订单模块改了一行代码,结果支付模块出了问题。为什么?因为大家都在同一个代码库里,依赖关系错综复杂。
单体架构的痛点,我总结了几点:
- 代码耦合严重——改一处,可能影响全局
- 部署效率低——哪怕只改了一个按钮,也要重新部署整个应用
- 扩展性差——某个模块流量大,你不能只扩那个模块,得扩整个系统
- 技术栈锁定——用了 Java,就不能在某个模块用 Python 或 Go
- 团队协作困难——几十个人改同一个代码库,合并冲突是家常便饭
1.3 微服务的诞生:从“大泥球”到“小积木”
微服务的概念,最早是 2014 年由 Martin Fowler 和 James Lewis 提出的。但说实话,这种思想在更早的时候就已经有人在实践了。
我记得 2012 年在一家创业公司,当时团队决定把支付模块单独拆出来。原因很简单——支付模块的稳定性要求最高,不能因为其他模块的 bug 导致支付失败。这就是微服务的雏形。
微服务的核心思想,说白了就是:把一个大型应用拆成一组小服务,每个服务独立部署、独立运行、独立扩展。
二、微服务的核心定义与特征
2.1 什么是微服务?
我个人的理解是:微服务是一种架构风格,它将一个应用拆分为多个小型的、自治的服务。每个服务围绕特定的业务能力构建,可以独立开发、部署和扩展。
用一句话概括:微服务 = 业务能力 + 独立部署 + 轻量通信
2.2 微服务的六大特征
根据我的实践经验,一个合格的微服务架构,应该具备以下特征:
| 特征 | 说明 | 我的经验 |
|---|---|---|
| 单一职责 | 每个服务只负责一个业务功能 | 我曾经把一个订单服务拆成订单创建、订单查询、订单状态管理三个服务,效果很好 |
| 独立部署 | 每个服务可以独立发布,不影响其他服务 | 这是微服务最大的好处,但也是最容易被忽视的 |
| 轻量通信 | 服务之间通过 HTTP/REST 或消息队列通信 | 我个人习惯用 gRPC,性能更好 |
| 去中心化 | 每个服务可以有自己的数据库、技术栈 | 嗯,这里要注意:数据库拆分要谨慎 |
| 弹性设计 | 一个服务挂了,不影响其他服务 | 我建议一定要做熔断和降级 |
| 自动化运维 | 需要 CI/CD、容器化、服务发现等基础设施 | 没有自动化,微服务就是灾难 |
2.3 微服务与单体架构的对比
你想想看,单体架构和微服务架构,就像一个大办公室和多个小办公室的区别。
| 维度 | 单体架构 | 微服务架构 |
|---|---|---|
| 开发效率 | 初期快,后期慢 | 初期慢,后期快 |
| 部署频率 | 低(周/月) | 高(天/小时) |
| 扩展性 | 垂直扩展为主 | 水平扩展,按需扩展 |
| 故障隔离 | 差,一个 bug 拖垮整个系统 | 好,故障范围可控 |
| 团队规模 | 适合小团队(<10人) | 适合中大型团队 |
| 运维复杂度 | 低 | 高 |
三、微服务的优缺点分析
3.1 优点:为什么大家都在用?
微服务能火,不是没有道理的。我总结了几个核心优势:
- 独立部署,快速迭代——每个服务可以独立发布,不影响其他服务。我曾经在一个项目里,一天发布了 5 个服务,这在单体架构里想都不敢想。
- 技术栈灵活——订单服务用 Java,推荐服务用 Python,数据分析用 Go,完全没问题。
- 按需扩展——双十一来了,只扩订单服务和支付服务,不用管其他服务。
- 故障隔离——用户服务挂了,订单服务还能正常运行。当然,前提是你做好了熔断。
- 团队自治——每个团队负责自己的服务,不用等别人。
3.2 缺点:别被“微服务”三个字骗了
说实话,微服务不是银弹。我见过太多团队,一上来就拆微服务,结果把自己拆死了。
常见的坑:
- 分布式复杂性——网络延迟、数据一致性、分布式事务,这些都是新问题。我曾经在一个项目里,为了处理分布式事务,代码量翻了一倍。
- 运维成本高——服务多了,监控、日志、部署、服务发现,每样都要搞。没有 DevOps 团队,别轻易尝试。
- 调试困难——一个请求经过 5 个服务,出了问题,你得一个一个查。我建议一定要上链路追踪。
- 数据一致性——单体架构用事务就能搞定的事,微服务里得用 Saga 模式或事件溯源。
- 团队沟通成本——服务多了,接口定义、版本管理、联调,都是事儿。
3.3 什么时候该用微服务?
我个人习惯用这个标准来判断:
- 团队规模 > 20 人
- 业务复杂度高,模块间耦合严重
- 需要频繁发布(每周至少一次)
- 有专门的 DevOps 团队
- 业务量增长快,需要弹性扩展
如果以上条件满足 3 条以上,可以考虑微服务。否则,老老实实用单体架构,别折腾。
小结
这一章我们聊了微服务的来龙去脉。从单体架构的痛点,到微服务的诞生,再到它的核心特征和优缺点。说白了,微服务是一种“拆”的艺术——拆得好,效率翻倍;拆得不好,自找麻烦。
下一章,我会带你看看微服务的核心组件:服务发现、配置中心、API 网关、负载均衡……这些都是微服务架构的“基础设施”,没有它们,微服务跑不起来。
嗯,今天就到这里。有什么问题,欢迎交流。