Skip to content

Spring Cloud Alibaba 架构与实现原理

本文档基于 Spring Cloud Alibaba 2025.1.x 官方文档整理,详细阐述其整体架构、核心组件及其实现原理。


一、整体架构设计

Spring Cloud Alibaba 是一套一站式的微服务解决方案,旨在简化 Spring Cloud 应用与阿里巴巴分布式中间件的集成。其核心设计理念是将阿里巴巴在双 11 等大规模场景下验证的技术以标准化的方式提供给开发者。

1.1 架构图

┌─────────────────────────────────────────────────────────────┐
│                    Spring Cloud Alibaba                      │
├─────────────────────────────────────────────────────────────┤
│  ┌──────────────┐ ┌──────────────┐ ┌─────────────────────┐  │
│  │   Nacos      │ │   Sentinel   │ │     Seata           │  │
│  │ 服务发现注册  │ │ 流量防卫       │ │  分布式事务         │  │
│  │ 配置中心      │ │ 熔断降级       │ │  (AT/TCC/Saga)    │  │
│  └──────────────┘ └──────────────┘ └─────────────────────┘  │
│  ┌──────────────┐ ┌──────────────┐ ┌─────────────────────┐  │
│  │  RocketMQ    │ │   SchedulerX │ │     Other Services  │  │
│  │ 消息驱动      │ │ 分布式调度     │ │  (OSS/SMS/OTS...)  │  │
│  └──────────────┘ └──────────────┘ └─────────────────────┘  │
└─────────────────────────────────────────────────────────────┘


              ┌─────────────────────────────┐
              │    Spring Boot Application  │
              └─────────────────────────────┘

1.2 核心能力

能力域组件功能描述
服务注册与发现Nacos动态服务发现、服务管理与负载均衡
配置管理Nacos Config分布式配置集中化管理
流量控制Sentinel流量控制、熔断降级、系统保护
分布式事务SeataAT/TCC/Saga 等多种事务模式
消息驱动RocketMQ发布订阅、广播、顺序/延迟/事务消息
分布式调度SchedulerX定时任务分布式调度

来源: Spring Cloud Alibaba - context7.com


二、Nacos 服务注册发现与配置中心

2.1 概述

Nacos(Naming and Configuration Service)是阿里巴巴开源的云原生动态服务发现、配置管理和服务管理平台。

2.2 服务注册发现原理

2.2.1 注册机制

Nacos 支持两种服务实例类型:

  • 临时实例(Ephemeral):基于心跳机制,客户端每 5 秒发送心跳,15 秒未收到心跳则被移除。适用于无状态服务,符合 AP 特性。
  • 持久化实例(Persistent):基于 TTL 机制,支持多节点数据强一致性,符合 CP 特性。

2.2.2 心跳保活流程

Client ──(Heartbeat 5s)──> Nacos Server

              存活时间戳更新

            15s 无心跳 → 剔除实例

2.2.3 服务订阅与推送

Nacos 服务端采用长轮询机制实现配置的实时推送:

  1. 客户端发起订阅请求
  2. 服务端维护订阅关系
  3. 服务列表变化时主动推送到客户端
  4. 客户端本地缓存服务列表

代码示例

java
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

来源: Nacos Example - GitHub

2.3 配置中心实现机制

2.3.1 配置标识

Nacos Config 使用 dataId + group 唯一标识每个配置项。

2.3.2 配置拉取接口

java
ConfigService.getConfig(String dataId, String group, long timeoutMs)

2.3.3 配置变更通知

  • 客户端定时轮询(默认 10 秒)
  • 服务端支持 WebSocket 长连接推送
  • 本地缓存兜底机制

来源: Nacos Config - GitHub

2.4 CAP 理论实现

Nacos 通过 Distro 协议(AP)和 Raft 协议(CP)两种方式实现:

协议适用场景一致性模型
Distro临时实例最终一致性(AP)
Raft持久化实例/配置强一致性(CP)

三、Sentinel 流量防卫

3.1 概述

Sentinel 是以流量为切入点的基础设施组件,提供流量控制、熔断降级、系统负载保护等能力。

3.2 核心机制

3.2.1 SlotChain 责任链

Sentinel 采用责任链模式构建处理链路:

Entry -> FlowSlot -> DegradeSlot -> AuthoritySlot -> SystemSlot -> ... -> RealBusiness

每个 Slot 负责特定维度的检查和统计。

3.2.2 流量控制规则

支持多种流控模式:

  • 直接模式:针对资源本身进行限流
  • 关联模式:基于关联资源进行限流
  • 链路模式:根据请求来源进行限流
  • 预热模式:缓慢提升 QPS 限制
  • 集群模式:多实例共享限流配额

代码示例

java
@SentinelResource(value = "hello", blockHandler = "handleBlock", fallback = "handleFallback")
@GetMapping("/hello/{name}")
public String hello(@PathVariable String name) {
    return "Hello " + name;
}

// 规则加载
FlowRule rule = new FlowRule();
rule.setResource("hello");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(10);
FlowRuleManager.loadRules(rules);

来源: Sentinel Example - GitHub

3.2.3 熔断降级策略

策略说明
慢调用比例基于响应时间和异常比例综合判断
异常比率异常比例超过阈值触发降级
异常数单位时间内异常数量超过阈值

3.2.4 热点参数限流

对热点参数值进行限流,自动识别访问频率最高的参数。

3.2.5 系统自适应保护

基于系统负载指标(Load、CPU、RT、QPS)动态调整入口流量。


四、Seata 分布式事务

4.1 概述

Seata 是一个易于使用的分布式事务解决方案,支持 AT、TCC、Saga、XA 等多种事务模式。

4.2 核心架构

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│  RM        │     │  RM        │     │  RM        │
│ Resource   │     │ Resource   │     │ Resource   │
│ Manager    │     │ Manager    │     │ Manager    │
└──────┬──────┘     └──────┬──────┘     └──────┬──────┘
       │                   │                   │
       └───────────────────┼───────────────────┘

                    ┌──────▼──────┐
                    │    TC       │
                    │ Transaction │
                    │ Coordinator │
                    └─────────────┘
  • TC(Transaction Coordinator):事务协调器,维护全局和分支事务状态
  • TM(Transaction Manager):事务管理器,开启和提交全局事务
  • RM(Resource Manager):资源管理器,管理分支事务报告和执行全局指令

4.3 AT 模式实现原理

4.3.1 两阶段提交

第一阶段(本地事务阶段)

  1. SQL 解析,查询受影响行的 before image
  2. 执行业务 SQL
  3. 查询 after image
  4. 生成 undo_log 记录并本地提交

第二阶段(全局提交/回滚阶段)

  • 提交:异步删除 undo_log
  • 回滚:根据 undo_log 生成反向 SQL 进行补偿

4.3.2 全局锁机制

  • 更新数据前申请全局锁
  • 锁冲突时进入重试或失败
  • 提交成功后释放全局锁

4.3.3 数据库表结构

sql
-- undo_log 表(AT 模式必需)
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- TC 端全局事务表
CREATE TABLE IF NOT EXISTS `global_table` (
    `xid` VARCHAR(128) NOT NULL,
    `transaction_id` BIGINT,
    `status` TINYINT NOT NULL,
    -- ...其他字段
    PRIMARY KEY (`xid`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

-- TC 端分支事务表
CREATE TABLE IF NOT EXISTS `branch_table` (
    `branch_id` BIGINT NOT NULL,
    `xid` VARCHAR(128) NOT NULL,
    -- ...其他字段
    PRIMARY KEY (`branch_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

-- 全局锁表
CREATE TABLE IF NOT EXISTS `lock_table` (
    `row_key` VARCHAR(128) NOT NULL,
    `xid` VARCHAR(128),
    -- ...其他字段
    PRIMARY KEY (`row_key`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

4.3.4 使用示例

java
@Service
public class BusinessService {
    @GlobalTransactional(name = "purchase-tx", rollbackFor = Exception.class)
    public void purchase(String userId, String commodityCode, int count) {
        storageService.deduct(commodityCode, count);
        orderService.create(userId, commodityCode, count);
        accountService.debit(userId, count * 100);
    }
}

来源: Seata Example - GitHub

4.4 TCC 模式

Try-Confirm-Cancel 三阶段提交:

  • Try:资源准备检查与预留
  • Confirm:确认提交(要求幂等)
  • Cancel:取消操作(要求幂等)

4.5 Saga 模式

长事务拆分为多个短事务,正向执行或补偿执行。


五、RocketMQ 消息驱动

5.1 概述

Spring Cloud Alibaba RocketMQ 基于 Spring Cloud Stream 框架,提供统一的消息抽象。

5.2 核心功能

5.2.1 消息模型

  • 点对点(Point-to-Point):CLUSTERING 消费模式
  • 发布订阅(Pub/Sub):BROADCASTING 消费模式

5.2.2 顺序消息

通过 MessageQueueSelector 指定消息路由到同一队列,消费者端有序消费。

yaml
spring:
  cloud:
    stream:
      rocketmq:
        bindings:
          producer-out-0:
            producer:
              messageQueueSelector: orderlyMessageQueueSelector
          consumer-in-0:
            consumer:
              push:
                orderly: true

5.2.3 延迟消息

支持 18 个固定延迟级别(1s、5s、10s、30s、1m、2m、3m、4m、5m、6m、7m、8m、9m、10m、20m、30m、1h、2h)。

java
headers.put(MessageConst.PROPERTY_DELAY_TIME_LEVEL, 2); // 延迟级别 1-10

5.2.4 事务消息

实现本地事务与消息发送的原子性:

java
@Component("myTransactionListener")
public class TransactionListenerImpl implements TransactionListener {
    @Override
    public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        try {
            // 执行本地事务
            orderService.createOrder(orderId);
            return LocalTransactionState.COMMIT_MESSAGE;
        } catch (Exception e) {
            return LocalTransactionState.ROLLBACK_MESSAGE;
        }
    }

    @Override
    public LocalTransactionState checkLocalTransaction(MessageExt msg) {
        // 检查本地事务状态(半消息处理)
        if (orderService.orderExists(orderId)) {
            return LocalTransactionState.COMMIT_MESSAGE;
        }
        return LocalTransactionState.UNKNOW;
    }
}

事务消息流程

  1. Producer 发送半消息(Half Message)
  2. MQ 存储半消息,不可被消费
  3. Producer 执行本地事务
  4. Producer 根据结果提交或回滚
  5. TC 定时检查未知状态事务

来源: RocketMQ Example - GitHub

5.3 基础配置

yaml
spring:
  cloud:
    stream:
      rocketmq:
        binder:
          name-server: localhost:9876
        bindings:
          producer-out-0:
            producer:
              group: producer-group
          consumer-in-0:
            consumer:
              messageModel: CLUSTERING
              subscription: 'TagA || TagB'
      bindings:
        producer-out-0:
          destination: test-topic
        consumer-in-0:
          destination: test-topic
          group: consumer-group

六、依赖配置

6.1 BOM 引入

xml
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2025.1.x</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

6.2 Starter 依赖

xml
<!-- Nacos 服务发现 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- Nacos 配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- Sentinel 流控 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<!-- Seata 分布式事务 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

<!-- RocketMQ 消息驱动 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>

来源: Spring Cloud Alibaba Dependencies - context7.com


七、参考资料

  1. Spring Cloud Alibaba Official Repository
  2. Context7 - Spring Cloud Alibaba Documentation
  3. Nacos Example
  4. Sentinel Example
  5. Seata Example
  6. RocketMQ Example

文档生成日期:2026 年 5 月 6 日基于 Spring Cloud Alibaba 2025.1.x 版本

更新于:

note