第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 异步)。