4.2 架构风格与取舍
架构是一组以后很难改变的重要决策。它包括模块边界、数据所有权、通信模式、部署形态、失败处理和团队所有权。
架构风格只有在服务质量属性时才有价值。
正在加载交互实验...
正在加载概念检查...
常见风格
| 风格 | 优势 | 成本 |
|---|---|---|
| 分层架构 | 表现层、领域层、数据层分离,容易理解 | 可能僵化或贫血 |
| Client-server | 客户端和服务端边界清晰 | 网络、版本、离线行为 |
| MVC | 分离视图、控制器、模型关注点 | 复杂应用中边界容易模糊 |
| 模块化单体 | 部署简单,同时保持内部边界 | 需要纪律,否则会变成大泥球 |
| 微服务 | 独立部署和扩展 | 分布式系统、可观测性、数据一致性 |
| 事件驱动 | 生产者和消费者解耦 | 调试、顺序、最终一致性 |
| 管道-过滤器 | 适合转换和流水线 | 不适合共享可变状态 |
风格不是架构本身。真正的架构,是系统在变化和失败下的行为。
质量属性驱动选择
选择架构时问:
- 哪里需要独立变化?
- 哪里需要强一致?
- 什么必须独立扩展?
- 哪些失败必须隔离?
- 哪些团队拥有哪些部分?
- 我们实际拥有怎样的运维能力?
正在加载交互实验...
正在加载概念检查...
一个脚踏实地的建议
对很多产品团队来说,模块化单体是很强的起点:一个可部署单元、明确内部边界、清晰领域模块、模块之间的契约测试,并且在未来有测量到的压力时可以抽取服务。
当领域边界和运维成熟度存在时,微服务很强。当它被用来弥补不清晰设计时,就会很贵。
正在加载本节练习...