一、微服务概述:从单体到微服务的演进之路

1.1 单体架构:我们曾经都这么干过

说实话,我刚入行那会儿,做的全是单体应用。一个项目就是一个大包,所有代码堆在一起。前端、后端、数据库访问、业务逻辑,全在一个进程里跑。

你想想看,那时候一个典型的电商系统长什么样?一个 WAR 包丢到 Tomcat 里,完事。开发简单,部署也简单。团队小的时候,这玩意儿确实好用。

但问题来了。项目越做越大,代码越来越臃肿。我记得有一次,光是编译就要花 5 分钟。改一行代码,整个项目都得重新部署。更别提团队扩张后,十几个人同时改同一个代码库,合并冲突能让你崩溃。

单体架构的典型痛点:

  • 代码耦合严重,牵一发而动全身
  • 扩展性差,只能整体水平扩展
  • 技术栈锁定,想换语言或框架?重写吧
  • 部署效率低,小改动也要全量发布
  • 团队协作困难,代码冲突家常便饭

嗯,这里要注意。不是说单体架构一无是处。对于初创项目、小团队、业务逻辑简单的场景,单体反而是最优解。我见过太多人一上来就搞微服务,结果把自己搞死了。

1.2 微服务核心概念:说白了就是拆

微服务的核心思想,说白了就一个字:。把一个大系统拆成多个小服务,每个服务独立部署、独立运行、独立演进。

每个微服务通常具备以下特征:

  • 单一职责:一个服务只做一件事,并且做好
  • 独立部署:服务之间互不影响,各自有独立的 CI/CD 流水线
  • 自治性:每个服务可以有自己的数据库、技术栈
  • 轻量通信:服务间通过 HTTP/REST 或消息队列通信
  • 去中心化:没有统一的中心节点,每个服务都是平等的

我的个人习惯:拆服务的时候,先按业务边界画上下文。比如订单服务、用户服务、支付服务。别一开始就拆得太细,否则你会被服务间调用的复杂度搞疯。

1.3 微服务的优势:为什么大家都在搞?

我在项目中遇到过最典型的场景:某个功能需要紧急修复。单体架构下,你得等整个项目编译、测试、部署。微服务呢?改一个服务,单独部署,几分钟搞定。

微服务带来的核心优势:

优势 说明 实际案例
独立部署 每个服务可独立发布 支付服务升级不影响订单服务
技术多样性 不同服务可用不同技术栈 搜索服务用 Elasticsearch,用户服务用 MySQL
弹性扩展 只扩展瓶颈服务 大促时只扩容订单服务
故障隔离 一个服务挂了不影响全局 推荐服务宕机,用户还能下单
团队自治 小团队独立负责一个服务 前端团队也能维护自己的 BFF 层

为什么会这样?因为微服务本质上是一种组织架构的映射。康威定律说得很清楚:系统架构会复制组织的沟通结构。你团队拆成几个小分队,系统自然就拆成几个微服务。

1.4 微服务面临的挑战:别被忽悠了

我曾经踩过一个坑。公司决定全面转向微服务,结果半年过去了,项目进度比单体还慢。为什么?因为微服务带来的复杂度,远超大多数人的想象。

避坑指南:我曾经接手过一个项目,服务拆了 30 多个,但每个服务之间直接 HTTP 调用,没有服务发现、没有熔断、没有限流。结果线上一个服务挂了,连锁反应导致整个系统瘫痪。这就是典型的「拆了但没完全拆」。

微服务的主要挑战:

  1. 分布式复杂性:网络延迟、数据一致性、分布式事务,这些都是单体时代不需要考虑的问题
  2. 运维成本飙升:以前维护一个应用,现在要维护几十个。监控、日志、链路追踪,缺一不可
  3. 数据管理难题:每个服务有自己的数据库,跨服务查询怎么办?数据一致性怎么保证?
  4. 测试复杂度:端到端测试需要启动所有服务,光环境搭建就够你喝一壶的
  5. 团队协作成本:服务多了,接口文档、版本管理、契约测试,这些都得跟上

我的建议:别为了微服务而微服务。如果你的团队不到 10 个人,业务复杂度也不高,老老实实用单体。等业务发展到一定规模,再考虑逐步拆分。记住,好的架构不是设计出来的,而是演进出来的

1.5 什么时候该上微服务?

我一般会问自己三个问题:

  • 业务是否足够复杂,多个模块之间有清晰的边界?
  • 团队是否足够大,需要多个小分队并行开发?
  • 是否有足够的 DevOps 能力支撑微服务的运维?

如果三个答案都是「是」,那可以考虑。否则,我建议你再等等。

嗯,这一章就到这里。下一章我们会深入聊聊微服务的通信机制,包括 REST、gRPC、消息队列这些实战中必须掌握的东西。

课后思考:你现在做的项目,适合拆成微服务吗?如果拆,你会怎么划分服务边界?