← 返回博客列表

一、引言:从单体到微服务

在软件架构演进的历史长河中,应用系统经历了从单体架构到面向服务架构(SOA),再到微服务架构和云原生架构的演变。每一次演进都是为了解决前一代架构在规模、复杂度、交付速度、可维护性上的瓶颈。理解这条演进路线,是掌握现代系统架构设计的起点,也是软考系统架构设计师考试的高频考点。

1.1 单体架构的痛点

单体架构(Monolithic Architecture)是将所有功能模块打包在一个可执行单元中部署的架构方式。在项目早期,单体架构因为开发简单、测试方便、部署轻松而广受欢迎。但随着业务规模膨胀,单体架构暴露出严重问题:

典型故障场景
某电商系统中,"评论模块"出现死循环导致 CPU 飙升,由于它是单体应用的一部分,整个订单、支付、库存服务全部受影响,最终导致全站不可用 2 小时。这就是单体架构故障无法隔离的典型表现。

1.2 架构演进路线

为解决单体架构的痛点,业界依次提出了 SOA、微服务、云原生等架构理念。演进的核心驱动力是业务复杂度增长和对快速交付的需求。

时间 1 单体架构 Monolith 单一进程 统一部署 共享数据库 2000s 耦合度高 交付慢 2 SOA 架构 Service-Oriented ESB 总线 SOAP/WSDL 中心化 2005-2010 服务重用 ESB 成瓶颈 3 微服务 Microservices 独立部署 去中心化 独立数据库 2014+ 敏捷交付 运维复杂 4 云原生 Cloud Native 容器+K8s DevOps 持续交付 2018+ 弹性伸缩 云上最优 演进核心驱动力 业务复杂度↑ · 交付速度要求↑ · 规模扩张 · 团队自治 · 弹性伸缩需求
图 1:架构演进时间线 —— 从单体到云原生
演进核心总结(软考记忆点)
· 单体:高耦合、低效率,适合小型项目
· SOA:引入 ESB 总线实现服务集成,但 ESB 易成瓶颈,中心化
· 微服务:进一步拆分,去中心化、独立部署、独立数据库
· 云原生:在微服务基础上,融合容器、DevOps、持续交付,充分发挥云的弹性

二、微服务核心概念

微服务架构(Microservices Architecture)是一种将应用划分为一组小型、自治、松耦合服务的架构风格。每个服务围绕业务能力构建,由独立团队维护,独立部署到生产环境,服务间通过轻量级协议(REST、gRPC、消息队列)通信。

2.1 微服务的定义与特征

Martin Fowler 和 James Lewis 在 2014 年的经典文章中系统化提出了微服务概念。微服务没有严格的定义,但具备以下核心特征:

2.2 单体 vs 微服务对比

单体架构 单个应用进程 用户模块 订单模块 支付模块 库存模块 商品模块 评论模块 紧耦合 · 共享内存 · 同进程调用 方法调用即可 共享数据库 一处故障全盘崩溃 微服务架构 API Gateway 用户服务 独立DB 订单服务 独立DB 支付服务 独立DB 库存 独立DB DB DB DB DB 基础设施层 服务注册发现 · 配置中心 · 熔断器 · 链路追踪 容器化(Docker) · 编排(K8s) · CI/CD 松耦合 · 独立部署 · 故障隔离 REST/gRPC/MQ 通信
图 2:单体架构 vs 微服务架构对比

2.3 微服务四大原则

1. 高内聚低耦合(High Cohesion, Low Coupling)

每个服务内部功能高度相关(高内聚),服务之间依赖尽量少(低耦合)。这是衡量拆分是否合理的根本标准。如果一个服务的修改频繁引发其他服务变更,说明耦合过紧,需要重新划分边界。

2. 独立部署(Independent Deployment)

每个服务可以独立构建、测试、部署,不依赖其他服务的发布节奏。这是微服务最核心的特性,也是敏捷交付的基础。要求服务接口向后兼容,避免破坏性变更。

3. 去中心化(Decentralization)

去中心化治理(无 ESB,技术栈可异构)和去中心化数据管理(每服务独享数据库)。去中心化带来灵活性的同时,也带来数据一致性和事务管理的挑战。

4. 技术多样性(Technology Diversity)

不同服务可选用最合适的技术栈:AI 推理用 Python,高并发网关用 Go,业务系统用 Java,实时通信用 Node.js。但要避免过度多样化增加运维负担。

2.4 微服务优缺点对比

✓ 优点
  • 独立部署,交付速度快
  • 故障隔离,系统健壮性强
  • 按需扩展,资源利用率高
  • 技术栈灵活,可异构
  • 团队自治,并行开发
  • 易于持续集成和持续交付
  • 单个服务代码量小,易维护
✗ 缺点
  • 分布式系统复杂度高
  • 服务间通信开销大(网络延迟)
  • 数据一致性难保证
  • 分布式事务复杂
  • 运维和监控难度大
  • 需要完善的自动化基础设施
  • 服务拆分边界难以确定
何时不该用微服务?
微服务不是银弹。在以下场景应谨慎使用:
1. 业务规模小、团队人数少(<10人)
2. 缺乏 DevOps 和自动化基础设施
3. 对数据强一致性要求极高(如银行核心账务)
4. 系统模块边界尚不清晰,处于快速探索期
软考建议:"先单体,后微服务",待业务边界清晰、团队规模增长后再拆分。

三、微服务拆分原则与方法

微服务拆分是微服务架构设计的第一难题。拆得太细,服务数量爆炸,运维成本飙升;拆得太粗,又退化为单体。本节介绍两种主流拆分方法和拆分粒度判断标准。

3.1 按业务能力拆分(By Business Capability)

按业务能力拆分是根据企业业务功能模块来划分服务边界。每个服务对应一个明确的业务能力。例如电商系统的业务能力包括:用户管理、商品管理、订单管理、支付、库存、物流、营销等。

这种方法直观易懂,适合业务边界清晰的系统。关键在于识别业务的自然边界,让服务的职责与业务部门的职责对齐。

3.2 按子域拆分(DDD - 领域驱动设计)

领域驱动设计(Domain-Driven Design, DDD)由 Eric Evans 提出,是微服务拆分最系统化的方法。其核心思想是将软件模型与业务领域模型对齐,通过限界上下文(Bounded Context)来划分服务边界。

DDD 核心概念(软考必考)
· 领域(Domain):业务问题域,如"电商"
· 子域(Subdomain):领域的细分,分为核心子域、支撑子域、通用子域
· 限界上下文(Bounded Context):一个模型适用的明确边界,通常对应一个微服务
· 实体(Entity):有唯一标识的领域对象,如"订单"
· 值对象(Value Object):无唯一标识,如"地址"
· 聚合(Aggregate):一组相关对象的集合,保证事务一致性
· 聚合根(Aggregate Root):聚合的入口,外部只能通过它访问聚合内对象
电商领域(Domain) 用户上下文 User Context · 实体: User, Account · 值对象: Address · 聚合根: User 订单上下文 Order Context · 实体: Order, OrderItem · 值对象: Money · 聚合根: Order 库存上下文 Inventory Context · 实体: Stock, Product · 值对象: SKU · 聚合根: Stock 支付上下文 Payment Context · 实体: Payment, Refund · 聚合根: Payment 物流上下文 Logistics Context · 实体: Shipment, Route · 聚合根: Shipment 下单 扣库存 触发支付 发货 每个限界上下文 → 一个微服务,边界内模型一致,边界间通过 API/事件交互
图 3:DDD 限界上下文映射 —— 电商领域服务边界划分

3.3 拆分粒度判断标准

判断维度 粒度过粗(接近单体) 粒度合适 粒度过细(纳米服务)
服务职责 承担多个业务能力 单一业务能力 一个业务能力的一部分
团队规模 需多人团队维护 2-Pizza 团队(6-8人) 不足 2 人
代码行数 十万行以上 万行级 千行以下
部署频率 数月一次 每周多次 每小时多次(过度)
数据库 共享多张表 独立数据库 单表服务(过度)
通信开销 低(多为进程内) 适中 高(频繁网络调用)
软考记忆口诀
拆分粒度判断:"一个服务一个能力,两块披萨一个团队,一周发布几次不嫌多,独立数据库不共享"。
核心原则:高内聚低耦合是根本标准,技术指标只是参考。

案例:电商系统微服务拆分

某中型电商平台原为单体 Java 应用,日订单量 50 万,团队 30 人,决定进行微服务拆分。采用 DDD 方法拆分过程如下:

第一步:领域建模。通过事件风暴(Event Storming)梳理业务流程,识别出核心子域(订单、支付、库存)、支撑子域(用户、商品)、通用子域(认证、通知)。

第二步:划分限界上下文。每个限界上下文对应一个微服务,共拆分出 8 个核心服务:用户服务、商品服务、订单服务、支付服务、库存服务、物流服务、营销服务、评价服务。

第三步:定义服务接口。服务间通过 REST API 同步调用(如订单查库存)和消息队列异步通知(如支付成功通知物流)通信。

第四步:数据库拆分。订单库(MySQL)、商品库(MySQL+ES)、库存库(Redis+MySQL)、用户库(MySQL)独立部署。

结果:拆分后各服务独立部署,订单服务发布频率从月级提升到日级,库存服务独立扩容应对秒杀,系统整体可用性从 99.5% 提升到 99.95%。

四、微服务核心组件

微服务架构不是简单的服务拆分,还需要一整套基础设施组件支撑服务的注册发现、配置管理、通信治理、容错保护。本节介绍六大核心组件。

4.1 微服务整体架构总览

Web 客户端 移动端 API 网关 路由·鉴权·限流 服务注册中心 Nacos/Eureka 注册 配置中心 Apollo/Nacos 熔断器 Hystrix 用户服务 独立DB Sidecar 订单服务 独立DB Sidecar 支付服务 独立DB Sidecar 库存服务 独立DB Sidecar 服务网格(Service Mesh)—— Istio/Linkerd · Sidecar 代理所有流量 消息队列 Kafka / RabbitMQ 链路追踪 Jaeger / Zipkin 用户DB 订单DB 支付DB 库存DB 监控告警 · Prometheus + Grafana
图 4:微服务完整架构总览 —— 六大核心组件协同

4.2 API 网关(API Gateway)

API 网关是微服务对外的统一入口,承担路由转发、鉴权认证、限流熔断、日志监控、协议转换等横切关注点。客户端不直接访问后端服务,而是通过网关访问。

Web App 第三方 API Gateway 路由转发 按路径分发 鉴权认证 JWT/OAuth 限流熔断 保护后端 负载均衡 多实例分发 协议转换 HTTP→gRPC 日志监控 访问记录 响应聚合 / 接口编排 一次请求聚合多个服务结果 实现:Spring Cloud Gateway / Zuul / Kong / Nginx 单一入口,屏蔽内部服务拓扑 用户服务 订单服务 支付服务 库存服务
图 5:API 网关核心功能 —— 统一入口与横切关注点

4.3 服务注册与发现(Service Registry & Discovery)

微服务实例动态创建销毁,IP 和端口不断变化。服务注册中心负责记录服务实例地址,让调用方能动态发现目标服务。分为客户端发现(客户端直接查询注册中心)和服务端发现(通过负载均衡器查询)两种模式。

服务注册中心 Nacos / Eureka / Consul 实例列表: IP:Port 服务提供者A 10.0.0.1:8080 启动时注册 服务提供者B 10.0.0.2:8080 心跳续约 服务消费者 查询注册中心 获取可用实例 负载均衡调用 ①注册 ①注册 ②发现 返回列表 ③直接调用 健康检查机制 提供者定期发送心跳(30s) · 注册中心检测超时则剔除实例 · 消费者本地缓存实例列表
图 6:服务注册与发现机制 —— 注册 + 心跳 + 发现
注册中心 一致性模型 健康检查 典型用途
Eureka AP(最终一致) 心跳 Spring Cloud 经典选择
Nacos AP/CP 可切换 心跳+主动探测 注册+配置一体
Consul CP(Raft) 主动探测 多数据中心
Zookeeper CP(ZAB) 会话保活 Dubbo/Kafka 协调
软考 CAP 定理回顾
分布式系统无法同时满足一致性(C)、可用性(A)、分区容错性(P),只能满足其中两个。注册中心通常选择 AP(如 Eureka)优先保证可用性,因为临时不一致比服务不可用更可接受。Zookeeper 选择 CP,适合强一致性场景。

4.4 配置中心(Config Center)

配置中心实现配置的集中管理、动态刷新、环境隔离、版本回滚。微服务环境下,数百个服务的配置散落在各处难以管理,配置中心解决了这个问题。主流实现有 Apollo、Nacos Config、Spring Cloud Config。

配置中心的核心能力是动态刷新:修改配置后无需重启服务即可生效,通过长轮询或推送机制通知客户端。这对调优(如线程池大小、限流阈值)极其重要。

4.5 服务网格(Service Mesh)

服务网格(Service Mesh)是处理服务间通信的基础设施层,通过 Sidecar 代理拦截所有进出流量,实现流量管控、熔断限流、安全加密、可观测性等能力,将治理能力从业务代码中剥离。代表实现 Istio、Linkerd。

Pod / 主机 A 服务A 业务逻辑 无需治理 代码 Sidecar 代理Envoy 流量拦截 熔断/限流 Pod / 主机 B 服务B 业务逻辑 无需治理 代码 Sidecar 代理Envoy 流量拦截 加密/观测 Sidecar 间通信 mTLS 加密 · 熔断限流 · 链路追踪 控制面(Control Plane)—— Istio 下发策略:路由规则 · 熔断配置 · 安全策略
图 7:Service Mesh Sidecar 模式 —— 业务与治理解耦

4.6 熔断器(Circuit Breaker)

熔断器用于防止级联故障。当下游服务故障率达到阈值时,熔断器"跳闸"直接返回失败,不再调用下游,给故障服务恢复时间。熔断器有三个状态:

Closed 关闭(正常) 请求正常通过 Open 打开(熔断) 直接返回失败 Half-Open 半开(试探) 放行少量请求 故障率↑ 超阈值 等待 超时后 请求成功 请求失败 → 重新熔断
图 8:熔断器三状态转换 —— Closed / Open / Half-Open
熔断器 vs 降级 vs 限流(软考易混淆点)
· 熔断:下游故障时切断调用,保护系统不级联崩溃
· 降级:主流程失败时返回兜底数据(如默认值、缓存)
· 限流:限制请求速率,防止流量过载
三者常配合使用:限流挡住洪峰 → 熔断切断故障 → 降级保证用户体验

五、容器化技术(Docker)

容器化是云原生的基石。Docker 通过容器技术将应用及其依赖打包成一个可移植的标准化单元,实现"一次构建,到处运行"。容器比虚拟机更轻量,启动更快,资源利用率更高。

5.1 Docker 核心概念

5.2 Docker 架构

Docker Client docker build docker pull docker run docker push Docker Daemon 镜像管理 容器管理 网络管理 数据卷管理 REST API Registry 镜像仓库 Docker Hub Harbor push pull 运行中容器 App1 App2 共享主机内核 run 宿主机操作系统(Linux 内核)
图 9:Docker 架构 —— Client-Server 模式

5.3 容器 vs 虚拟机

虚拟机架构 App A Libs App B Libs App C Libs Guest OS Guest OS Guest OS Hypervisor (VMware/KVM) 宿主机 OS 硬件基础设施 每个 VM 完整 OS · 启动慢 · GB级 容器架构 App A Libs Bin App B Libs Bin App C Libs Bin Docker Engine 宿主机 OS(共享内核) 硬件基础设施 共享内核 · 启动秒级 · MB级 无 Guest OS · 资源占用低
图 10:虚拟机 vs 容器架构对比
对比维度 虚拟机(VM) 容器(Container)
虚拟化层级 硬件级虚拟化 操作系统级虚拟化
Guest OS 每个 VM 完整操作系统 无,共享主机内核
启动时间 分钟级 秒级甚至毫秒级
资源占用 GB 级 MB 级
隔离性 强隔离 进程级隔离(较弱)
安全性 高 中(共享内核有风险)
密度 单机数十个 单机数百上千个
跨平台 强(硬件抽象) 弱(依赖内核版本)

5.4 常用 Docker 命令

命令 说明
docker build -t name:tag .根据 Dockerfile 构建镜像
docker images列出本地镜像
docker run -d -p 8080:80 name后台运行容器并映射端口
docker ps查看运行中的容器
docker stop <id>停止容器
docker rm <id>删除容器
docker pull/push拉取/推送镜像
docker logs <id>查看容器日志
docker exec -it <id> bash进入容器执行命令

案例:容器化一个 Java Spring Boot 服务

Dockerfile 示例(多阶段构建优化镜像大小):

第一阶段:使用 Maven 镜像编译打包,生成 jar 文件;第二阶段:使用精简的 JRE 镜像运行,最终镜像从 800MB 降到 150MB。最佳实践包括:使用官方基础镜像、利用缓存优化构建顺序、非 root 用户运行、使用 .dockerignore 排除无关文件、合理设置健康检查(HEALTHCHECK)。

注意事项:容器内日志输出到 stdout/stderr 便于收集;配置通过环境变量或配置中心注入,不硬编码;使用多阶段构建减小镜像体积;镜像打 tag 而非用 latest,保证可追溯。

六、容器编排(Kubernetes)

当容器数量从几个增长到几百上千个时,手动管理变得不可能。Kubernetes(K8s)是 Google 开源的容器编排系统,负责容器的自动部署、扩缩容、故障恢复、负载均衡,是云原生的事实标准。

6.1 K8s 架构

K8s 集群由控制面(Master)和工作节点(Worker Node)组成。Master 负责集群管控决策,Worker Node 运行实际业务容器。

Master 节点(控制面 Control Plane) kube-apiserver 唯一入口 · REST API 认证授权 etcd 键值存储 集群状态数据 kube-scheduler Pod 调度 资源评估 controller-manager 副本/节点/端点 控制器集合 cloud-controller-manager(云厂商集成) Worker Node 1 kubelet kube-proxy Pod 1 容器 Pod 2 容器 Pod 3 容器×2 容器运行时 containerd / Docker kubelet 管理本节点 Pod 生命周期 Worker Node 2 kubelet kube-proxy Pod 4 容器 Pod 5 容器 Pod 6 容器×2 kube-proxy 维护网络规则与负载均衡 Pod 间通信通过 Service 抽象
图 11:Kubernetes 集群架构 —— Master + Worker Nodes

6.2 K8s 核心概念

概念 说明
Pod K8s 最小调度单元,包含一个或多个紧密耦合的容器,共享网络和存储
Deployment 管理无状态应用,控制 Pod 副本数、滚动更新、回滚
Service 为一组 Pod 提供稳定的访问入口和负载均衡(IP/域名不变)
Ingress HTTP/HTTPS 路由入口,将外部流量路由到 Service
ConfigMap 存储非敏感配置信息,注入 Pod 作为环境变量或文件
Secret 存储敏感信息(密码、密钥),Base64 编码,可加密存储
StatefulSet 管理有状态应用(如数据库),Pod 有序、有持久标识
DaemonSet 每个节点运行一个 Pod 副本,用于日志收集、监控
Namespace 资源隔离的逻辑分区,如 dev/test/prod

6.3 Pod 生命周期

Pending 等待调度 拉取镜像 Creating 创建容器 初始化 Running 运行中 就绪探针 Terminating 优雅终止 preStop Succeeded/Failed 退出 释放资源 探针机制 liveness存活 readiness就绪 startup启动 重启策略:Always(默认)/ OnFailure / Never
图 12:Pod 生命周期与探针机制

案例:在 K8s 上部署微服务

某团队将订单服务部署到 K8s,流程如下:编写 Deployment 定义副本数 3,配置资源请求/限制(CPU 500m/1000m);创建 Service 暴露订单服务,集群内通过服务名访问;配置 HPA(水平自动扩缩容),CPU 超过 70% 自动扩容到 10 个副本;通过 Ingress 暴露 HTTP 接口给外部;使用 ConfigMap 管理非敏感配置,Secret 管理数据库密码。结果:大促期间自动扩容应对流量洪峰,故障 Pod 自动重启,实现零运维介入。

七、CI/CD 与 DevOps

CI/CD 是微服务和云原生的"血管系统",让代码从提交到生产的过程自动化、流水线化。DevOps 则是一种强调开发与运维协作的文化和实践。

7.1 CI/CD 概念

代码提交 git push 构建 编译+打包 单元测试 覆盖率检查 镜像构建 docker build 部署测试 测试环境 部署生产 蓝绿/灰度发布 CI 持续集成 | CD 持续交付 | CD 持续部署 主流工具 Jenkins · GitLab CI GitHub Actions · ArgoCD GitOps 工作流 Git 作为唯一事实来源 声明式配置+自动同步 发布策略 蓝绿 · 金丝雀(灰度) 滚动 · A/B 测试
图 13:CI/CD 流水线全流程
DevOps 核心理念(软考要点)
DevOps = Development + Operations,强调开发运维一体化。核心实践包括:自动化 CI/CD、基础设施即代码(IaC)、监控告警、微服务、容器化、故障文化(Blameless)。目标是缩短交付周期、提高发布频率、提升系统可靠性。

案例:GitOps 工作流

某团队采用 GitOps 模式部署应用:所有 K8s 清单(YAML)存储在 Git 仓库作为唯一事实来源;开发人员修改 YAML 提交 PR;CI 自动校验语法和策略;合并后 ArgoCD 检测到 Git 变更,自动将声明状态同步到 K8s 集群;若部署异常,回滚只需 git revert。优势:审计追踪、环境可重现、回滚简单、声明式优于命令式。

八、云原生(Cloud Native)四要素

云原生(Cloud Native)是 Pivotal 公司于 2013 年提出、CNCF(云原生计算基金会)推动的技术理念,指充分利用云的弹性伸缩和分布式优势构建应用。云原生不是单一技术,而是一套方法论和技术集合。

云原生 Cloud Native 微服务 Microservices 服务自治 独立部署 容器化 Containerization Docker 封装 K8s 编排 DevOps 开发运维一体 CI/CD 自动化 文化协作 持续交付 Continuous Delivery 流水线 自动化部署 CNCF 生态:Prometheus · Istio · Helm · Harbor · etcd · gRPC
图 14:云原生四大要素
软考记忆口诀
云原生四要素:"微、容、Dev、持" —— 微服务、容器化、DevOps、持续交付。四者缺一不可,共同构成云原生应用的基础。CNCF(Cloud Native Computing Foundation)是 Linux 基金会下的子组织,托管 K8s、Prometheus、Istio 等项目。

九、微服务通信模式

微服务间通信分为同步通信和异步通信两大类,选择合适的通信模式对系统性能和可靠性至关重要。

9.1 同步通信

9.2 异步通信

同步通信 服务A 调用方 服务B 被调方 请求 响应 阻塞等待 · 强一致 · 耦合高 协议:REST / gRPC / Thrift + 实时性好,立即得到结果 + 适合查询类操作 - 等待阻塞,资源占用 - 故障级联风险 - 吞吐量受限 异步通信 服务A 发布者 服务B 订阅者 消息 队列 发布 消费 非阻塞 · 最终一致 · 解耦 Kafka / RabbitMQ / RocketMQ + 削峰填谷、解耦、广播 - 最终一致、调试复杂
图 15:同步通信 vs 异步通信
维度 REST gRPC 消息队列
通信方式同步同步异步
协议HTTP/1.1HTTP/2TCP/AMQP
序列化JSONProtobuf多种
性能中高高
耦合度中中低
一致性强强最终一致
典型场景对外 API内部调用事件通知

十、分布式事务

微服务拆分数据库后,原本一个本地事务就能保证的一致性,现在变成跨服务跨库的分布式事务问题。这是微服务架构最复杂的难题之一。

CAP 定理与 BASE 理论回顾
· CAP:一致性(C)、可用性(A)、分区容错(P) 三选二。分布式系统必选 P,故在 C 和 A 间权衡。
· BASE:基本可用(Basically Available)、软状态(Soft state)、最终一致(Eventually consistent)。是 AP 系统的实践指南。
分布式事务大多追求最终一致性而非强一致性。

10.1 2PC / 3PC(两阶段/三阶段提交)

2PC(Two-Phase Commit)引入协调者,第一阶段询问所有参与者能否提交(Prepare),第二阶段根据回复决定提交或回滚(Commit/Rollback)。

协调者 参与者1 参与者2 参与者3 ①Prepare ②Yes ③Commit 缺点:同步阻塞 · 协调者单点 · 数据不一致风险 · 性能差
图 16:2PC 两阶段提交

10.2 TCC(Try-Confirm-Cancel)

TCC 是业务层面的两阶段:Try 预留资源、Confirm 确认提交、Cancel 取消释放。每个服务需实现三个接口,侵入性强但性能好。

Try 预留资源 冻结库存 Confirm 确认提交 扣减库存 Cancel 取消释放 解冻库存 成功 失败 业务侵入强 · 性能好 · 需保证幂等 · 空回滚处理
图 17:TCC 三阶段

10.3 Saga 模式

Saga 将长事务拆分为一系列本地事务,每个本地事务有对应的补偿事务。任一步骤失败,执行已完成步骤的补偿操作回滚。分为编排式(Orchestration)和协同式(Choreography)两种。

创建订单 T1 扣减库存 T2 扣减余额 T3 发货 T4 ✗失败 失败触发补偿 补偿发货 补偿余额 补偿库存 补偿顺序:C4 → C3 → C2 → C1(逆序回滚)
图 18:Saga 模式 —— 正向执行 + 补偿回滚
方案 一致性 性能 复杂度 侵入性
2PC强一致差中低
3PC强一致差高低
TCC强一致好高高
Saga最终一致好中中
本地消息表最终一致中低中

案例:订单支付分布式事务

电商下单涉及订单服务、库存服务、支付服务三个独立数据库。采用 Saga 编排式方案:T1 创建订单(待处理) → T2 扣减库存 → T3 扣减余额 → T4 订单状态改为已支付。若 T3 余额不足,Saga 协调器依次执行补偿:C2 回滚库存 → C1 取消订单。最终一致性通过消息重试和幂等保证。相比 2PC,性能提升 5 倍,且无长时间锁资源。

十一、分布式链路追踪与可观测性

微服务环境下,一个请求可能经过数十个服务,故障定位极其困难。可观测性(Observability)通过三大支柱帮助理解系统内部状态。

可观测性 Observability 日志 Logging 离散事件记录 ELK / Loki 指标 Metrics 聚合数值数据 Prometheus 追踪 Tracing 请求链路 Jaeger / Zipkin
图 19:可观测性三大支柱
Trace: 请求全程 1520ms Gateway 50ms Order 80ms Inventory 120ms Payment 200ms DB Query 90ms DB Query 150ms Span: 每个服务调用是一个 Span,包含 traceId、spanId、parentSpanId 通过 traceId 串联一次请求所有 Span,parentSpanId 构建调用树 定位:Payment 服务的 DB Query 150ms 是性能瓶颈
图 20:分布式链路追踪 —— 一次请求的完整调用链

案例:跨 5 个服务的请求追踪

用户下单请求经网关 → 订单 → 库存 → 支付 → 通知 5 个服务,总耗时 800ms 异常。通过 Jaeger 查看 Trace 发现支付服务耗时 500ms(正常 100ms),进一步定位是支付服务的数据库慢查询。OpenTelemetry 统一了三大支柱的数据采集标准,避免多套 SDK 维护负担。

十二、微服务安全

微服务安全涉及外部访问安全和服务间通信安全两个层面。

客户端 API网关 OAuth2 验证JWT HTTPS 认证中心 签发JWT 签发 内部零信任网络(Zero Trust) 服务A Sidecar mTLS 服务B Sidecar mTLS 服务C Sidecar mTLS mTLS双向认证 mTLS 双向证书认证 · 流量加密 · 最小权限 JWT 短时令牌 · 服务间鉴权 密钥管理 Vault · 证书自动轮转 安全要点 外部 OAuth2+JWT | 内部 mTLS | 零信任 | 密钥集中管理 | 最小权限原则
图 21:微服务安全架构 —— 外部认证 + 内部 mTLS
OAuth 2.0 / JWT / mTLS 速记
· OAuth 2.0:授权框架,四种授权模式(授权码、简化、密码、客户端凭证)
· JWT:Header.Payload.Signature,无状态令牌,自包含用户信息
· mTLS:双向 TLS 认证,服务间互验证书,防中间人攻击

十三、云原生实战案例

综合前述所有组件,构建一个完整的云原生电商系统架构。

云原生电商系统完整架构 接入层:CDN · WAF · 负载均衡 · Ingress (Nginx) HTTPS 终止 · 流量路由 · DDoS 防护 API 网关层:Spring Cloud Gateway · JWT 鉴权 · 限流熔断 业务服务层(K8s 集群 · 每服务独立 Deployment + HPA) 用户服务 Java 商品服务 Java+ES 订单服务 Java 支付服务 Go 库存服务 Java 营销/推荐 Python Service Mesh (Istio) 流量管控 · 熔断 · mTLS · 链路追踪 消息中间件 Kafka(日志流) · RocketMQ(事务消息) 数据层 MySQL(主从) · Redis(缓存) · ES(搜索) · MongoDB(画像) · MinIO(对象存储) 可观测性 + 运维平台 Prometheus+Grafana(指标) · ELK(日志) · Jaeger(追踪) · ArgoCD(GitOps) · Jenkins(CI)
图 22:云原生电商系统完整架构

案例:技术栈选型与经验总结

技术选型:网关 Spring Cloud Gateway;注册/配置 Nacos;熔断 Sentinel;追踪 SkyWalking;编排 K8s+ArgoCD;数据库 MySQL+Redis+ES。

踩坑经验:① 初期服务拆分过细(30个),运维负担重,后合并到 12 个;② 分布式事务选用 Saga + 本地消息表混合方案;③ 链路追踪采样率初期 100% 影响性能,调整为 10%;④ ConfigMap 存敏感配置导致泄露,迁移到 Vault;⑤ HPA 扩容滞后,提前配置预热。

收益:交付频率从月级到日级;大促扩容从 2 小时缩到 10 分钟;可用性 99.95%→99.99%。

十四、软考考点总结

必考核心概念
1. 架构演进:单体 → SOA(ESB) → 微服务(去中心化) → 云原生(容器+DevOps)
2. 微服务特征:独立部署、独立数据库、去中心化、技术多样性、轻量通信
3. 拆分方法:按业务能力、按 DDD 限界上下文;判断标准:高内聚低耦合
4. 核心组件:API网关、服务注册发现、配置中心、服务网格、熔断器
5. Docker:镜像/容器/Dockerfile/仓库;容器 vs 虚拟机(共享内核、轻量)
6. K8s:Master(apiserver/scheduler/etcd/controller) + Worker(kubelet/kube-proxy);Pod/Deployment/Service
7. 云原生四要素:微服务、容器化、DevOps、持续交付
8. 通信:REST/gRPC 同步,Kafka/RabbitMQ 异步
9. 分布式事务:2PC、TCC、Saga、本地消息表;CAP/BASE 理论
10. 可观测性:日志、指标、追踪三大支柱
易混淆点 辨析
SOA vs 微服务 SOA 用 ESB 中心化总线;微服务去中心化、独立数据库、轻量通信
容器 vs 虚拟机 容器共享内核、秒级启动、MB级;虚拟机完整OS、分钟级、GB级
熔断 vs 降级 vs 限流 熔断切断故障调用;降级返回兜底;限流控制速率
CI vs CD vs CD 持续集成(构建测试) → 持续交付(可发布) → 持续部署(自动上线)
2PC vs TCC vs Saga 2PC 资源层强一致;TCC 业务层强一致;Saga 最终一致+补偿
AP vs CP 注册中心 Eureka(AP可用) vs Zookeeper/Consul(CP一致)
记忆口诀
· 微服务四原则:"高内聚、独立部、去中心、技术多"
· 云原生四要素:"微、容、Dev、持"
· 熔断三态:"闭→开→半"(Closed→Open→Half-Open)
· 可观测三支柱:"日、指、追"(Logging/Metrics/Tracing)
· K8s Master 四组件:"API、etcd、sched、ctrl"
常见题型
1. 选择题:微服务特征、组件职责、K8s 概念、CAP 定理
2. 简答题:对比 SOA 与微服务、容器与虚拟机、各分布式事务方案
3. 论述题:给定场景设计微服务架构(拆分方案、组件选型、事务处理)
4. 案例分析:分析架构问题、给出改进建议(如拆分过细、缺少熔断、数据一致性问题)

微服务与云原生是系统架构设计师考试的现代架构核心考点。掌握演进路线、核心组件、分布式难题(事务/追踪/安全)的解决方案,并能结合实际场景做权衡设计,是考试通过的关键。架构没有银弹,权衡(Trade-off)始终是架构师最重要的能力。