第一章 服务架构演进史
1. 原始分布式时代(1970s-1980s)
核心问题:如何用不可靠的硬件构建可靠的大规模系统?
关键知识点:
-
技术背景:
- 硬件限制:微型计算机性能低下(如Intel 8086处理器仅128KB内存)。
- 分布式探索:通过多台机器协作突破单机算力限制。
-
DCE(分布式运算环境):
- 贡献:首创RPC(远程过程调用)、DFS(分布式文件系统)、Kerberos认证、UUID等基础技术。
- 设计理念:追求“透明性”,让远程调用像本地调用一样简单。
- 失败原因:
- 性能鸿沟:远程调用速度比本地调用慢几个数量级。
- 复杂性爆炸:网络分区、容错、一致性等问题难以解决。
- 开发难度:需高超技巧应对分布式特有缺陷(如超时、序列化)。
-
历史教训:
- Kyle Brown的结论:“能分布式≠应分布式”,过度追求透明性得不偿失。
- 启示:分布式需权衡透明性与复杂性,硬件提升是更优路径。
2. 单体系统时代(1990s-2000s)
核心问题:如何在单机上构建大规模系统?
关键知识点:
-
架构特征:
- 单一进程:所有模块运行在同一进程内,无IPC(进程间通信)。
- 分层设计:表现层、业务层、数据层纵向解耦。
- 模块化:横向按功能拆分模块(如JAR/WAR包)。
-
优势与局限:
- 优点:
- 开发/测试/部署简单,适合中小系统。
- 进程内调用高效,无序列化/网络开销。
- 缺点:
- 错误传播:内存泄漏、线程阻塞等问题影响全局。
- 技术栈单一:难以混用多种语言/框架。
- 扩展困难:垂直扩展(Scale Up)成本高,水平扩展(Scale Out)需副本冗余。
- 优点:
-
适用场景:
- 中小型系统、团队规模小(如“2 Pizza Team”)。
- 无需频繁更新或高可用性要求的场景。
3. SOA时代(2000s-2010s)
核心问题:如何整合企业内异构系统?
关键知识点:
-
SOA(面向服务架构)核心思想:
- 服务化:将功能封装为独立服务,通过标准化接口(如WSDL)通信。
- 企业级整合:解决ERP、CRM等系统间数据孤岛问题。
-
核心组件:
- ESB(企业服务总线):集中式通信枢纽,负责路由、转换、监控。
- 服务契约:严格定义接口(如SOAP协议),强调松耦合。
-
挑战与局限:
- ESB复杂性:成为单点故障和性能瓶颈。
- 服务粒度争议:粗粒度导致灵活性差,细粒度增加管理成本。
- 厂商绑定:依赖特定中间件(如IBM WebSphere)。
4. 微服务时代(2010s-至今)
核心问题:如何实现敏捷开发和系统弹性?
关键知识点:
-
微服务特征(Martin Fowler定义):
- 独立部署:每个服务可单独开发、测试、部署。
- 去中心化治理:允许技术异构(如不同语言/数据库)。
- 轻量通信:HTTP/REST或gRPC替代ESB。
-
解决的问题:
- 敏捷性:小团队专注单一服务,快速迭代。
- 弹性伸缩:按需扩展特定服务(如电商促销时库存服务独立扩容)。
- 容错性:通过熔断、降级隔离故障。
-
挑战:
- 分布式复杂性:需处理服务发现、链路追踪、最终一致性等。
- 运维复杂度:需CI/CD、容器化(如Docker)支持。
- 数据管理:跨服务事务难(需Saga模式或事件溯源)。
5. 后微服务时代(云原生时代)
核心问题:如何降低分布式系统复杂度?
关键知识点:
-
云原生的三大基石:
- 容器化(Docker):实现环境一致性,资源隔离。
- 动态编排(Kubernetes):自动化部署、扩缩容。
- 服务网格(Istio):下沉通信、安全、监控到基础设施层。
-
服务网格核心能力:
- 透明通信:通过Sidecar代理(如Envoy)实现流量管理、熔断、重试。
- 可观测性:集成监控(Prometheus)、日志(ELK)、追踪(Jaeger)。
-
意义:
- 开发者聚焦业务逻辑,无需处理分布式底层细节。
- 基础设施的“不可变性”提升系统可靠性。
6. 无服务时代(Serverless)
核心问题:如何极致简化运维和成本?
关键知识点:
-
核心特征:
- 事件驱动:由HTTP请求、消息队列等事件触发执行。
- 按需计费:仅按实际执行时间/资源付费(如AWS Lambda)。
- 无状态:依赖外部存储(如DB、对象存储)管理状态。
-
适用场景:
- 突发流量处理(如秒杀活动)。
- 异步任务(如图片处理、数据分析)。
-
局限性:
- 冷启动延迟:首次调用需初始化运行时环境。
- 状态管理难:不适合长时间运行或有状态任务。
- 厂商锁定:深度依赖云平台特定服务(如Azure Functions)。
总结:架构演进的核心驱动力
- 硬件发展:从单机性能提升到云计算资源池化。
- 业务需求:从企业内部整合到快速响应市场变化。
- 技术成熟:容器、服务网格等技术解决分布式复杂度。
- 成本优化:从购买物理机到按需使用云资源。
思考:架构无绝对优劣,需根据团队规模、业务场景、技术储备选择合适方案。微服务并非终点,未来可能向“函数即服务”“边缘计算”等方向持续演进。
多选题目
-
关于原始分布式时代(20世纪70-80年代)的主要挑战,以下哪些正确?
A. 网络通信的高延迟和高错误率
B. 缺乏统一的技术标准和协议
C. 硬件算力不足导致分布式系统无法实用化
D. 分布式透明性带来的复杂性问题 -
DCE(分布式运算环境)对计算机科学的主要贡献包括?
A. 发明了RESTful架构风格
B. 提出了远程过程调用(RPC)的参考实现
C. 开发了首个分布式文件系统(DFS)
D. 制定了微服务架构的核心规范 -
单体系统架构的常见误解是?
A. 单体系统完全不可拆分
B. 单体系统天然支持分层架构
C. 单体系统无法横向扩展
D. 单体系统必须使用单一编程语言 -
单体系统的核心缺陷包括?
A. 模块间隔离能力不足
B. 技术异构困难
C. 本地调用性能低下
D. 动态更新需停机部署 -
原始分布式时代的重要教训是?
A. 透明分布式操作是终极目标
B. 分布式系统的复杂性可能超过其收益
C. 微服务是解决分布式问题的唯一方案
D. 硬件性能提升能完全消除分布式挑战 -
关于分层架构在单体系统中的表现,正确的描述是?
A. 仅支持纵向拆分,无法横向扩展
B. 请求在各层间通过进程间通信传递
C. 分层设计是单体架构的典型特征
D. 分层导致性能显著下降 -
单体系统技术异构困难的主要原因是?
A. 不同模块必须共享同一进程
B. 缺乏标准化接口
C. 硬件资源无法隔离
D. 需统一编程语言和框架 -
导致单体系统逐渐被取代的核心原因是?
A. 无法支持分层架构
B. 隔离能力不足导致可靠性下降
C. 动态更新需停机部署
D. 硬件算力提升使单体性能过剩 -
关于原始分布式时代的透明性追求,正确的描述是?
A. 完全实现了本地与远程调用的透明性
B. 透明性导致开发复杂度大幅上升
C. 透明性是DCE设计的核心原则之一
D. 透明性通过硬件性能提升得以实现 -
单体系统扩展的局限性体现在?
A. 仅支持纵向扩展(Scale Up)
B. 横向扩展需负载均衡器辅助
C. 扩展后模块间通信成本激增
D. 无法通过增加机器提升性能
答案与解析
-
答案:C、D
- 解析:书中指出原始分布式时代硬件算力不足(C)导致系统实用性受限,而透明性追求(D)带来复杂性。网络通信问题(A/B)是衍生挑战,但非核心原因。
-
答案:B、C
- 解析:DCE贡献了RPC(B)和DFS(C)。RESTful(A)和微服务(D)是后续技术。
-
答案:A、C
- 解析:单体支持模块拆分(B正确,非误解)和横向扩展(C错误)。实际可拆分(A是误解),且允许多语言(D错误)。
-
答案:A、B、D
- 解析:单体隔离差(A)、技术异构难(B)、更新需停机(D)。本地调用高效(C错误)。
-
答案:B
- 解析:教训是复杂性超过收益(B)。透明性(A)是目标但未实现,硬件(D)无法完全解决问题。
-
答案:C
- 解析:分层是单体典型特征(C)。请求通过进程内传递(B错误),横向扩展可行(A错误)。
-
答案:A、D
- 解析:共享进程(A)需统一语言/框架(D)。技术异构困难主因在此。
-
答案:B、C
- 解析:隔离差(B)和更新难(C)是核心缺陷。单体支持分层(A错误),硬件提升非主因(D错误)。
-
答案:B、C
- 解析:透明性是DCE目标(C),但导致复杂度上升(B)。未完全实现(A错误)。
-
答案:B
- 解析:单体横向扩展需负载均衡(B)。可横向扩展(D错误),但进程内通信成本不变(C错误)。