05 · 服务架构:分层 / 模块化 / 微服务
代码少的时候随便写都能跑,一长大就乱。本篇讲服务端怎么组织代码:分层、模块化、微服务的演进与代价。
速览卡
| 项 | 内容 |
|---|---|
| 一句话定位 | 从"一个文件"到"多个服务"的组织演进,以及每一步的真实代价 |
| 核心内容 | 分层架构、模块化单体、微服务、网关与服务发现、熔断限流、演进判断 |
| 读完能回答 | 代码该分几层?什么时候该拆微服务?网关和限流是干嘛的? |
| 相关板块 | C04 · 一致性事务 | C06 · 异步与消息 | C08 · 可观测性 |
一、分层架构:后端的第一原则
| 层 | 职责 | 类比前端 |
|---|---|---|
| 路由/接口层 | 收请求、校验、返回 | 组件/路由 |
| 业务层 | 业务规则、编排 | 业务逻辑层 |
| 数据访问层 | 读写数据库 | Repository |
text
API 层 → 业务层 → 数据访问层 → DB核心规则:依赖只向下。业务层不该知道 HTTP,数据层不该知道业务。这样每一层都能单独测试、替换。
二、模块化单体:90% 项目的最优解
在"一个大服务"里按业务切模块:
text
my-api/
├── users/ # 用户模块:路由+业务+数据访问
├── orders/ # 订单模块
├── payments/ # 支付模块
└── common/ # 共享基础设施| 方案 | 优点 | 缺点 |
|---|---|---|
| 模块化单体 | 简单、一致性好、易部署 | 规模极大时耦合 |
| 微服务 | 独立扩展、独立团队 | 复杂度爆炸 |
判断:除非有"独立伸缩、独立发布、独立团队"的真实诉求,否则先模块化单体。微服务是架构债务的产物,不是起点。
三、微服务:什么时候才值得
拆微服务是为了解决这几个真实痛点,缺一不可:
| 痛点 | 微服务解决 |
|---|---|
| 单服务太大,团队互相踩脚 | 拆开独立开发 |
| 部分模块要独立扩缩容 | 独立部署 |
| 不同模块要不同技术栈 | 独立实现 |
| 故障隔离 | 一个挂了别的还活着 |
而它的代价是:
| 代价 | 说明 |
|---|---|
| 分布式事务 | 一致性变难(见 C04) |
| 服务发现/网关 | 谁在哪、流量怎么进 |
| 可观测性 | 跨服务排障(见 C08) |
| 运维 | 部署、监控成倍 |
一句话:微服务把"代码复杂度"换成"运维复杂度"。小项目换不起。
四、网关与服务发现
| 组件 | 干什么 | 类比 |
|---|---|---|
| API 网关 | 统一入口:鉴权、限流、路由、日志 | 前端 BFF 的服务端版 |
| 服务发现 | 服务实例在哪、健康与否 | 注册中心 + 心跳 |
text
客户端 → 网关 → 订单服务
└→ 支付服务(经服务发现找到实例)网关把"横切关注点"(鉴权/限流/日志)从业务服务里抽走,业务代码更干净。
五、熔断与限流
| 机制 | 解决 | 做法 |
|---|---|---|
| 限流 | 流量超过处理能力 | 按 IP/用户/接口限 QPS |
| 熔断 | 下游挂了别把我也拖挂 | 连续失败即快速失败,不再调用 |
| 降级 | 保核心功能 | 非核心功能给兜底结果 |
类比前端:熔断像"接口 5xx 就停掉轮询",降级像"图片加载失败给占位图"。
六、演进判断:一个决策框架
text
项目多大? ── 小/中 → 模块化单体(默认)
│
大且团队多 → 有没有独立伸缩/发布诉求?
有 → 微服务
无 → 模块化单体进阶路径:模块化单体 → 按模块独立部署 → 需要时再拆服务。别一上来就微服务。
自检清单
- [ ] 能把一个服务按"API/业务/数据"三层组织
- [ ] 能说出模块化单体 vs 微服务的适用边界
- [ ] 知道微服务的四项代价(事务/服务发现/可观测/运维)
- [ ] 能说清网关、限流、熔断、降级各解决什么
- [ ] 用决策框架判断"我的项目要不要拆微服务"
常见误区
- 误区:微服务更先进,直接上。 它把代码复杂度换成运维复杂度,小项目是负收益。
- 误区:分层就是多建几个目录。 分层的价值在"依赖单向、边界清晰",不是目录好看。
- 误区:网关只有大厂才用。 一个聚合入口在中小项目也能简化鉴权/限流。
- 误区:熔断和限流一回事。 限流防自己过载,熔断防下游把自拖挂。
动手练习
练习 A:重构分层
把你现有的 Todo API 重构成 API/业务/数据三层,验证每层能独立测试。
练习 B:模块化
把一个功能(如支付)拆成独立模块,定义它与其他模块的边界。
练习 C:架构评审
给一个你见过的项目做架构评审:它现在是哪种形态、该不该演进、为什么。
相关文档
本区
- 04 · 一致性与事务 —— 拆服务后的一致性
- 06 · 异步与消息 —— 服务间通信
- 08 · 可观测性 —— 多服务排障
- 16 · 服务端安全纵深 —— 网关与安全
其他域
- 17 · 前端架构分层与模块边界 —— 前端分层思维对照
- 24 · 微前端架构落地 —— 微服务的"前端孪生"