1Building Microservices(第2版)

微服务

什么是微服务

微服务定义单体对比服务边界演进式架构

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第1章:微服务(Microservices)

一、导读

1.1 本章学习目标

第1章是《Building Microservices》的开篇,Sam Newman 全面讲解了微服务架构的定义、优势和适用场景。本章帮助你理解微服务到底是什么,什么时候应该使用微服务,什么时候不应该。

本章的核心学习目标包括:

  • 理解微服务的定义:什么是微服务?与单体架构有什么区别?
  • 认识微服务的优势:独立部署、技术多样性、团队自治。
  • 理解微服务的代价:分布式系统的复杂性。
  • 学会判断是否应该使用微服务:微服务不是银弹。
  • 理解演进式架构:从单体到微服务的渐进式迁移。

1.2 为什么第一章如此重要

微服务是当前最热门的架构风格之一,但也是被误解最多的。很多人认为微服务就是"把系统拆成小服务",但实际情况远比这复杂。

Newman 在本章就明确指出:微服务不是银弹。它解决了一些问题,但也引入了新的问题。理解微服务的本质,才能做出正确的架构决策。

1.3 核心问题引导

微服务的核心特征是什么?

微服务与单体架构有什么本质区别?

微服务解决了什么问题?引入了什么问题?

什么时候不应该使用微服务?

如何从单体架构演进到微服务?


二、核心概念详解

2.1 微服务的定义

微服务是一种将应用程序构建为一组小型、自治服务的架构风格。每个服务:

围绕业务能力组织:每个服务负责一个特定的业务功能。

独立部署:每个服务可以独立部署,不影响其他服务。

去中心化治理:每个服务可以选择自己的技术栈。

通过轻量级机制通信:通常使用 HTTP/REST 或消息队列。

分布式数据管理:每个服务管理自己的数据存储。

单体架构:
┌─────────────────────────────┐
│         单体应用              │
│  ┌─────┐ ┌─────┐ ┌─────┐   │
│  │用户  │ │订单  │ │支付  │   │
│  │模块  │ │模块  │ │模块  │   │
│  └─────┘ └─────┘ └─────┘   │
│         共享数据库            │
└─────────────────────────────┘

微服务架构:
┌──────┐  ┌──────┐  ┌──────┐
│用户   │  │订单   │  │支付   │
│服务   │  │服务   │  │服务   │
└──┬───┘  └──┬───┘  └──┬───┘
   │         │         │
┌──┴──┐  ┌──┴──┐  ┌──┴──┐
│用户  │  │订单  │  │支付  │
│数据库│  │数据库│  │数据库│
└─────┘  └─────┘  └─────┘

2.2 微服务的优势

2.2.1 独立部署

每个服务可以独立部署,不需要与其他服务协调。这意味着:

  • 部署频率更高
  • 部署风险更低
  • 回滚更容易

2.2.2 技术多样性

每个服务可以选择最适合的技术栈:

  • 用户服务可以用 Java
  • 推荐服务可以用 Python
  • 实时服务可以用 Go

2.2.3 团队自治

每个服务由一个小团队负责:

  • 团队可以独立决策
  • 团队可以选择自己的开发节奏
  • 团队对自己的服务有完全的ownership

2.2.4 故障隔离

一个服务的故障不会导致整个系统崩溃:

  • 断路器可以防止级联故障
  • 降级策略可以保持核心功能可用
  • 故障范围被限制在单个服务内

2.3 微服务的代价

2.3.1 分布式系统的复杂性

微服务引入了分布式系统的所有复杂性:

  • 网络不可靠
  • 延迟不确定
  • 数据一致性难以保证
  • 调试和排错困难

2.3.2 运维成本

微服务需要更多的运维工作:

  • 需要管理更多的服务实例
  • 需要服务发现和负载均衡
  • 需要分布式追踪
  • 需要集中式日志

2.3.3 测试复杂性

微服务的测试更加复杂:

  • 集成测试需要启动多个服务
  • 端到端测试需要完整的环境
  • 契约测试需要维护接口契约

2.3.4 数据一致性

微服务的数据一致性是一个挑战:

  • 每个服务有自己的数据库
  • 跨服务的事务需要分布式事务
  • 最终一致性需要额外的设计

2.4 何时使用微服务

适合使用微服务的场景:

大型团队:多个团队需要独立开发和部署。

高扩展需求:不同功能需要不同的扩展策略。

技术多样性需求:不同功能需要不同的技术栈。

快速迭代需求:需要频繁部署不同的功能。

不适合使用微服务的场景:

小团队:团队太小,维护微服务的成本太高。

简单应用:应用逻辑简单,单体架构就足够了。

强一致性需求:需要跨模块的事务一致性。

缺乏基础设施:没有容器化、CI/CD、监控等基础设施。

2.5 演进式架构

Newman 强调,微服务不是一步到位的,而应该是渐进式演进的:

阶段1:单体架构
    ↓ 发现问题(部署困难、扩展困难)
阶段2:模块化单体
    ↓ 识别边界,解耦模块
阶段3:提取关键服务
    ↓ 将最频繁变化的模块提取为服务
阶段4:逐步微服务化
    ↓ 逐步将更多模块提取为服务
阶段5:完全微服务化(如果需要)

三、实战案例

3.1 单体 vs 微服务对比

电商平台架构演进:

阶段1:单体架构
- 一个 WAR 包包含所有功能
- 一个 MySQL 数据库
- 每次修改都要重新部署整个应用
- 部署时间:30分钟
- 部署频率:每月一次

阶段2:模块化单体
- 按业务领域划分模块(用户、商品、订单、支付)
- 模块间通过接口通信
- 仍然是一个部署单元
- 部署时间:30分钟
- 部署频率:每周一次

阶段3:提取关键服务
- 将支付模块提取为独立服务
- 支付服务有自己的数据库
- 通过 REST API 通信
- 支付服务可以独立部署
- 部署时间:5分钟(支付服务)
- 部署频率:每天(支付服务)

阶段4:逐步微服务化
- 提取用户服务、商品服务、订单服务
- 每个服务有自己的数据库
- 使用消息队列进行异步通信
- 引入 API 网关
- 部署频率:每天多次

3.2 服务拆分决策

决策框架:

1. 变更频率:这个模块多久变一次?
   - 频繁变化 → 考虑提取为服务

2. 扩展需求:这个模块需要独立扩展吗?
   - 需要独立扩展 → 考虑提取为服务

3. 团队边界:有独立的团队负责这个模块吗?
   - 有独立团队 → 考虑提取为服务

4. 技术需求:这个模块需要不同的技术栈吗?
   - 需要不同技术 → 考虑提取为服务

5. 故障影响:这个模块的故障会影响其他模块吗?
   - 故障隔离很重要 → 考虑提取为服务

四、本章小结

第1章全面讲解了微服务架构:

微服务定义:小型、自治、独立部署的服务。

优势:独立部署、技术多样性、团队自治、故障隔离。

代价:分布式复杂性、运维成本、测试复杂性、数据一致性。

适用场景:大型团队、高扩展需求、技术多样性需求。

演进式架构:从单体到微服务的渐进式迁移。

微服务不是银弹。在决定使用微服务之前,要仔细权衡收益和代价。记住:从单体开始,在需要时演进到微服务。


五、思考与练习

思考题

你的系统适合微服务吗?为什么?

微服务的最大优势是什么?最大代价是什么?

如何判断一个服务应该被拆分还是合并?

微服务和 SOA 有什么区别?

如何从单体架构渐进式迁移到微服务?

编程练习

分析一个单体应用:识别其中的业务边界,设计微服务拆分方案。

设计 API 网关:为微服务架构设计一个 API 网关。

设计服务通信:选择合适的通信方式(同步 vs 异步)。


1/8微服务
0%