字数:约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
| 用户下单请求 ↓ [订单服务] 创建订单记录 ↓ [库存服务] 扣减库存 ← 需要分布式事务保证 ↓ [库存服务] 扣减库存 ↓ [账户服务] 冻结货款 ← 需要分布式事务保证 ↓ [库存服务] 扣减库存 ↓ [营销服务] 发放优惠券 ↓ 返回下单结果
|
这个流程里,有两个关键风险点:
- 库存扣减和订单创建必须原子——不能订单创建了但库存没扣
- 账户冻结和库存扣减必须原子——不能库存扣了但钱没扣
传统的本地事务在这里完全失效,因为它们涉及多个数据库。
这就是 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>
<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 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 tx-service-group: my_tx_group client: rm: 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) { OrderDO order = orderMapper.create(request);
inventoryClient.deductStock(request.getSkuId(), request.getQuantity());
accountClient.freezeAmount(request.getUserId(), request.getTotalAmount());
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) { InventoryDO inventory = inventoryMapper.selectBySkuId(skuId); if (inventory.getStock() < quantity) { throw new BizException("库存不足"); } inventoryMapper.deductStock(skuId, quantity); 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 table-meta-checker: auto tm: default-global-transaction-timeout: 30000 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
| 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
| [ { "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 } ]
|
这里定义了两种规则:
- 正常情况下:QPS上限1000,直接拒绝
- 冷启动场景: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) .setMinRequestAmount(5) .setStatIntervalMs(10000) .setSlowRatioThreshold(0.6) .setTimeWindow(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 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 版本的三剑客:
- Seata 2.6.0 —— 分布式事务的最终一致性保障,AT 模式零侵入,undo log 自动回滚
- Sentinel 1.8.9 —— 流量控制的完整方案,流控+熔断+降级三板斧,冷启动+匀速排队两种效果
- Nacos 3.2.1 —— 服务发现+配置中心二合一,配置热更新,健康检查优化
这三个组件不是孤立的:Nacos 做服务治理,Sentinel 做流量防护,Seata 做数据一致性——三位一体,才是微服务稳定性的完整解法。
如果你觉得这套东西太复杂,那我只说一句:
等你线上出过一次库存超卖、一次服务雪崩、一次配置改错导致的全站故障,你就会明白这些东西的价值了。
分布式系统的稳定性,不是设计出来的,是在生产环境里扛出来的。
祝你的系统永远不需要触发熔断。