字数:约4200字 | 阅读时间:12分钟
“分布式系统的稳定性,不是设计出来的,是在生产环境里扛出来的。”


前言

2026年了,如果你还在手写熔断逻辑、手动配置超时时间,那真的要反思一下是不是在”重复造轮子”。

Spring Cloud Alibaba 2025.1版本带来了全面升级,Sentinel 1.8.9的流量控制能力、Seata 2.6.0的分布式事务架构、Nacos 3.2.1的配置中心与服务发现——这三个组件几乎涵盖了微服务架构最核心的三个难题:流量稳定性、数据一致性、服务治理。

本文将以一个真实的电商下单场景为线索,带你完整实践这三个组件的协同使用。

业务场景:一个棘手的下单流程

先交代一下背景:我们有一个简化的电商系统,用户下单需要涉及多个服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
用户下单请求

[订单服务] 创建订单记录

[库存服务] 扣减库存 ← 需要分布式事务保证

[库存服务] 扣减库存

[账户服务] 冻结货款 ← 需要分布式事务保证

[库存服务] 扣减库存

[营销服务] 发放优惠券

返回下单结果

这个流程里,有两个关键风险点:

  1. 库存扣减和订单创建必须原子——不能订单创建了但库存没扣
  2. 账户冻结和库存扣减必须原子——不能库存扣了但钱没扣

传统的本地事务在这里完全失效,因为它们涉及多个数据库。

这就是 Seata 要解决的问题。

Seata 2.6.0:分布式事务新架构

2.1 为什么选 Seata?

在分布式事务领域,有几种主流方案:

方案 原理 优点 缺点
2PC 协调者预提交+各节点提交 强一致 性能差,有协调者单点
TCC Try-Confirm-Cancel三阶段 性能好 业务侵入性强
Saga 长事务补偿 适合长流程 无隔离性
AT 自动补偿 无侵入 需支持undo log

Seata 支持所有这四种模式,其中 AT 模式对 Spring Boot 项目最为友好,业务代码几乎零侵入。

2.2 Seata 2.6.0核心改进

Seata 2.0 在架构层面做了重大升级:

1
2
3
4
5
6
7
8
9
10
Seata 2.6.0架构
├── TC (Transaction Coordinator) - 事务协调器
│ ├── 高可用集群模式(raft协议)
│ ├── 事务会话存储升级为DB+Redis双写
│ └── 全局事务超时优化(减少30%无效等待)
├── TM (Transaction Manager) - 事务管理器
│ └── Spring Cloud Alibaba自动装配
└── RM (Resource Manager) - 资源管理器
├── MySQL/PostgreSQL原生支持
└── 支持XID自动传播

2.3 实战:下单流程的分布式事务

第一步:引入依赖

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
<!-- Seata 2.6.0 需要单独指定版本 -->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>2.6.0</version>
</dependency>

第二步:配置 Seata

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server:
port: 8080

seata:
application-id: order-service
# Seata 2.6.0 TC 服务地址(高可用集群)
registry:
type: nacos
nacos:
server-addr: ${NACOS_HOST:localhost}:8848
group: SEATA_GROUP
cluster: default
config:
type: nacos
nacos:
server-addr: ${NACOS_HOST:localhost}:8848
group: SEATA_GROUP
# AT模式配置
tx-service-group: my_tx_group
client:
rm:
# AT模式undo表自动清理
undo:
log-table: undo_log
keep-history: false

第三步:标注分布式事务边界

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Service
public class OrderServiceImpl implements OrderService {

@GlobalTransactional(name = "create-order", rollbackFor = Exception.class)
@Override
public OrderDO createOrder(CreateOrderRequest request) {
// 1. 创建订单
OrderDO order = orderMapper.create(request);

// 2. 扣减库存(远程调用)
inventoryClient.deductStock(request.getSkuId(), request.getQuantity());

// 3. 冻结货款(远程调用)
accountClient.freezeAmount(request.getUserId(), request.getTotalAmount());

// 4. 发放优惠券(远程调用)
promotionClient.grantCoupon(request.getUserId(), request.getCouponId());

return order;
}
}

第四步:RM端配置(库存服务)

1
2
3
4
5
6
7
8
@FeignClient(name = "inventory-service")
public interface InventoryClient {

@Override
@GlobalTransactional(name = "deduct-stock")
void deductStock(@RequestParam("skuId") String skuId,
@RequestParam("quantity") Integer quantity);
}

库存服务的实现类也需要加上 @Transactional,这是 AT 模式的必要条件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Service
public class InventoryServiceImpl implements InventoryService {

@Transactional
@GlobalTransactional(name = "deduct-stock", rollbackFor = Exception.class)
@Override
public void deductStock(String skuId, Integer quantity) {
// 1. 检查库存
InventoryDO inventory = inventoryMapper.selectBySkuId(skuId);
if (inventory.getStock() < quantity) {
throw new BizException("库存不足");
}
// 2. 扣减库存(自动生成undo log)
inventoryMapper.deductStock(skuId, quantity);
// 3. 扣减记录
inventoryMapper.insertDeductLog(skuId, quantity);
}
}

当任意一步抛出异常时,Seata TC 会协调所有 RM 回滚,undo log 会自动恢复数据。

2.4 关键配置项

1
2
3
4
5
6
7
8
9
seata:
client:
rm:
report-success-enable: false # 成功不频繁上报,减少TC压力
table-meta-checker: auto # 自动检查表结构
tm:
default-global-transaction-timeout: 30000 # 全局事务超时30秒
degrade-check-enable: true # 开启降级检测
degrade-check-period: 2000 # 降级检查周期

Sentinel 1.8.9:流量控制的正确姿势

3.1 为什么需要流量控制?

光有分布式事务还不够。假设某次大促,库存服务突然被打爆,如果没有任何流量控制:

  • 库存服务 OOM → 所有下单请求失败 → 订单服务跟着崩 → 用户看到的是”下单失败”
  • 如果有 Sentinel,可以直接拒绝超出阈值的请求 → 返回”抢购人数过多”而不是系统崩溃

Sentinel 的核心理念:让系统扛得住,而不是让系统崩得漂亮。

3.2 Sentinel 1.8.9 核心能力

1
2
3
4
5
6
7
// Sentinel 1.8.9 新增的流控效果
public enum ControlBehavior {
DIRECT_REJECT, // 直接拒绝(默认)
WARM_UP, // 冷启动(渐进式放行)
匀速排队, // 匀速排队(严格控速)
默认拒绝 // 热开(根据调用关系自适应)
}

3.3 实战:下单接口的流量控制

方式一:注解方式(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@RestController
@RequestMapping("/api/orders")
public class OrderController {

@SentinelResource(value = "createOrder",
blockHandler = "createOrderBlock",
fallback = "createOrderFallback")
@PostMapping
public Result<OrderVO> createOrder(@RequestBody @Validated CreateOrderDTO dto) {
return orderService.createOrder(dto);
}

// 流控处理
public Result<OrderVO> createOrderBlock(CreateOrderDTO dto, BlockException e) {
log.warn("下单接口被限流: {}", e.getClass().getSimpleName());
return Result.fail("抢购人数过多,请稍后重试");
}

// 熔断降级
public Result<OrderVO> createOrderFallback(CreateOrderDTO dto, Throwable t) {
log.error("下单接口异常: {}", t.getMessage(), t);
return Result.fail("系统繁忙,请稍后重试");
}
}

方式二:规则配置(与Nacos集成)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Nacos配置中心的Sentinel规则
[
{
"resource": "createOrder",
"limitApp": "default",
"grade": 1,
"count": 1000,
"controlBehavior": 0,
"strategy": 0,
"clusterMode": false
},
{
"resource": "createOrder",
"limitApp": "default",
"grade": 1,
"count": 500,
"controlBehavior": 1,
"strategy": 0,
"clusterMode": false
}
]

这里定义了两种规则:

  1. 正常情况下:QPS上限1000,直接拒绝
  2. 冷启动场景:QPS上限500,逐步预热

3.4 熔断策略升级

Sentinel 1.8 支持基于响应时间的智能熔断:

1
2
3
4
5
6
7
8
9
DegradeRule.newRule()
.setResource("createOrder")
.setGrade(CircuitBreakerStrategy.SLOW_RT_RATIO.name())
.setCount(200) // 慢请求阈值:200ms
.setMinRequestAmount(5)
.setStatIntervalMs(10000) // 10秒窗口
.setSlowRatioThreshold(0.6) // 60%慢请求触发熔断
.setTimeWindow(10) // 熔断时长10秒
.build();

当 createOrder 接口的响应时间超过 200ms 的比例超过 60% 时,触发 10 秒熔断,期间所有请求直接返回降级结果。

Nacos 3.2.1:配置中心与服务发现

4.1 配置中心 vs 服务发现

很多同学分不清这两个概念:

  • 服务发现:解决”服务在哪”的问题。库存服务启动后,向 Nacos 注册,消费者通过服务名”找到”库存服务的 IP:Port。
  • 配置中心:解决”配置在哪”的问题。所有服务的配置(如数据库密码、开关)集中存储在 Nacos,修改配置后不需要重启服务。

Nacos 3.2.1 两个功能都支持,而且打通了。

4.2 实战:配置热更新

Nacos 配置中心添加配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"dataId": "order-service.yaml",
"group": "DEFAULT_GROUP",
"content": "
spring:
datasource:
url: jdbc:mysql://${DB_HOST}:3306/order_db
username: ${DB_USER}
password: ${DB_PASSWORD}

order:
timeout: 30
max-retry: 3

sentinel:
enabled: true
dashboard: localhost:8080
"
}

Spring Boot 读取配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Data
@Component
@ConfigurationProperties(prefix = "order")
public class OrderProperties {
private Integer timeout = 30;
private Integer maxRetry = 3;
}

// 使用
@Service
public class OrderServiceImpl {
@Value("${order.max-retry:3}")
private int maxRetry;

@Autowired
private OrderProperties orderProps; // 也可以用这个
}

配置变更监听(热生效):

1
2
3
4
5
6
@NacosConfigListener
public void onConfigChange(String config) {
log.info("配置变更: {}", config);
// 重新加载配置
this.refresh();
}

4.3 服务注册与发现

服务启动时自动注册:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:localhost}:8848
namespace: ${NACOS_NAMESPACE:public}
group: DEFAULT_GROUP
enabled: true
# 2026新增:健康检查优化
health-check:
enabled: true
heart-beat-interval: 5000
heart-beat-timeout: 15000
ip-delete-timeout: 30s

Feign 调用时直接用服务名:

1
2
3
4
5
@FeignClient(name = "inventory-service")
public interface InventoryClient {
@PostMapping("/internal/inventory/deduct")
Result<Void> deductStock(@RequestBody DeductStockRequest request);
}

Nacos 会自动负载均衡到具体的实例节点。

三个组件的协同

完整架构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌─────────────────────────────────────────────────────┐
│ Nacos 注册中心 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │订单服务 │ │库存服务 │ │账户服务 │ │
│ │8080 │ │8081 │ │8082 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────┘

┌─────────────┼─────────────┐
↓ ↓ ↓
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Sentinel │ │ Seata │ │ Nacos │
│流量控制 │ │分布式事务 │ │配置中心 │
│熔断降级 │ │AT模式 │ │配置热更新│
└──────────┘ └──────────┘ └──────────┘

完整依赖配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>2.6.0</version>
</dependency>

总结

Spring Cloud Alibaba 2026 版本的三剑客:

  1. Seata 2.6.0 —— 分布式事务的最终一致性保障,AT 模式零侵入,undo log 自动回滚
  2. Sentinel 1.8.9 —— 流量控制的完整方案,流控+熔断+降级三板斧,冷启动+匀速排队两种效果
  3. Nacos 3.2.1 —— 服务发现+配置中心二合一,配置热更新,健康检查优化

这三个组件不是孤立的:Nacos 做服务治理,Sentinel 做流量防护,Seata 做数据一致性——三位一体,才是微服务稳定性的完整解法。

如果你觉得这套东西太复杂,那我只说一句:

等你线上出过一次库存超卖、一次服务雪崩、一次配置改错导致的全站故障,你就会明白这些东西的价值了。

分布式系统的稳定性,不是设计出来的,是在生产环境里扛出来的。

祝你的系统永远不需要触发熔断。