3.8 Spring Cloud Alibaba Seata 分布式事务| 学习笔记

简介: 快速学习 3.8 Spring Cloud Alibaba Seata 分布式事务。

开发者学堂课程【Spring Cloud 微服务架构设计与开发实战 3.8 Spring Cloud Alibaba Seata 分布式事务】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/60/detail/1101


3.8 Spring Cloud Alibaba Seata 分布式事务

 

内容介绍

一、Seata 微服务分布式事务框架

二、Seata 微服务分布式架构图

三、Seata 微服务分布式事务框架实战

 

这节课讲如何结合 Spring Cloud 去使用阿里巴巴微服务分布式事务框架 Seata,Seata 是阿里云开发的重要解决方案,下面介绍相关特定。

 

一、Seata 微服务分布式事务框架

Seata 可以认为是尝试去支持不同微服务框架的事务性机制,而微服务本身是很难去支持分布式事务,这是一个很大的弱点,在于其协议,目前 Spring Cloud 默认使用协议是 http,这个协议本身并不支持事务特性,所谓企业级开发有很多重要的要求,但 Spring Cloud 是不支持的,而作为某些公司就会用到基于微服务的一些事务机制,这里提醒微服务架构中的事务绝大部分的都没有实现真正意义上事务的ACID 特性。

1、Spring Cloud Seata

Seata 早期名为 Fescar,是阿里巴巴开源的分布式事务框架,后面与项目Fast&EaSy 合并,变成更好用简单的分布式事务框架,不仅支持 Dubbo,Spring Cloud 等,包括其他的微服务分布式事务也是支持的。

2、阿里 Seata 发展路线图

如下面图 Seata 也在不断的迭代,这里注意在微服务架构中可以去不断的切换不同的主页,不断的升级改造。后面会提到具体这样使用,因为微服务架构中大部分做的都是消息补偿,比如做个消息中心店,发消息更新对面的服务,或者用定时针的这些机制用的更多,而因为性能问题使用分布式的更少。

image.png

 

二、Seata 微服务分布式架构图

1、电商交易场景(无事务分布式架构图)

image.png

一般模拟的场景为用户要购买,购买的话要生成订单,快递服务,抢购的时候还要库存问题,比如一个物品要买10件而库存只有5件,这里就要做判断,看是不是成功,这中间就要涉及到不同数据一次性判断问题,还要做数据的头部,包括同步积分,同步优惠券等一系列问题,这里面就会有微服务分布事务的问题出现,当然这个是在微服务架构中很难实现的,主要是靠 RPC 框架,RPC 主要在自己业务上用得更多,后面变成开源了,也是在微服务架构中比较重要的解决方案。

2、Seata 分布式事务架构图

image.png

当然这些只是了解不强迫使用,了解只是为了以后的架构设计多个选择,能更合理的技术选型而不是直接的做某个框架,架构设计要综合考虑,包括成本,需求等问题。

 

三、Seata 微服务分布式事务框架实战

1、Seata 分布式事务改造

实战的话框架的实现机制大部分都是补偿机制,虽然模拟了一个分布式事务协议,但不是真正意义上的,没有强制性去使用库,没有做分布式锁的概念,实际上是尝试插入数据,然后再删除,可以发现是通过逻辑上的特性代码来模拟一个真正的分布式事务。

简单的注解

@GlobalTransactional

直接标注在事务方法上即可

@GlobalTransactional

public void purchase(String userld, String

commodityCode, int orderCount) {

}

这里需要注意 GlobalTransactional 叫全局事务,设计模式上很像一些协议,包括JTA 事务这种框架,爬取几个库和做了一些什么操作都会有一个根事务,还有像事务管理器,资源管理器这些角色参与进来。这种叫强事务,严重会影响到系统的性能,因为有大量的协调事件加上长级事务锁、数据库的锁、资源的锁,所以会影响整个系统的优良性,而系统在事务这方面选择的走实物系统。

<dependency>

<groupld> io.seata </groupld>

<artifactld> seata-all </artifactld>

<version> ${seata.version} </version>

</dependency>

2Seata 实战依赖

这个代码要加上 Seata 的依赖,也可以直接用但要考虑到兼容,因为阿里巴巴版本和 Spring Cloud 版本没有及时的跟进,可能会有1-2个版本的差异,那么包括现在演示的2.1,2.1,2.3提前做测试还可以用。这做依赖的时候可以用快速开发,里面也统一提供了一个甲方依赖包,配置到文件中就可以直接拉进依赖包。可以看下下面的代码,主要是做一个扩展,Seata 知识的几种模式实际都是在逻辑上通过模拟事务的场景,使用当中要慎重,因为实际上事务会有更多的消息通信,更多的协调工作,而且这里面肯定会影响到系统的性能。

<dependency>

<groupId>com. Alibaba.cloud</groupId>

<artifactId>spring-cloud-starter-alibaba-seata</artifactId>

<version>2.2.1. RELEASE</version>

</dependency>

3、代码讲解

下面重点讲解下代码,Seata 这种分布事务需要注意一个问题,比如是在某一个微服务里面调用了其他接口的场景,服务是下单类的服务操作,接下来就是购买,购买就要生成一个订单,然后要调用支付的服务,库存的服务,这里模拟的一个交易的服务场景,代码如下:

SeateBusinessServicelmpl.java 中代码为

package com. alibaba.services;

import io. seata. spring. annotation.GlobalTransactional;

public class SeataBusinessServiceImpl implements SeataBusinessServices

private StorageService storageService;

private OrderService orderService;

private PayService payService;

/**

*购买,启动全局事务

*/

@GlobalTransactional

public void buy(String userId, String commodityCode, int orderCount)

// 1.订单微服务

orderService . create(userId, commodityCode, orderCount);

// 2.库存微服务

storageService . deduct( commodityCode, orderCount);

// 3.支付微服务

payService . deduct(userId, orderCount);

//4.其他微服务调用,快递服务,积分、优惠券等

}

如有订单的服务,实现接口,账号的实现,支付,仓库的实现,而在案例的代码中下单操作实际上接入了仓库 StorageService 的实现,订单 OrderService 的实现和支付 PayService 的实现,而如果要启动分布式事务的话就一定要有全局注解 @GlobalTransactional,下面在下订单的时候就要依次调用订单微服务,减库存,完成支付操作,当然也可以完成其他的,比如推送一个快递,积分,优惠券等,其他的微服务都可以一次性调用,但一般没有要求是不会这样做的,而会做逻辑性操作 try.catch,尝试去调用这个服务,只是说有这样一种框架多一个选择比没有好,而且知道他的机制模式和实现方法。

相关文章
|
7月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
4989 95
|
8月前
|
SQL Java 关系型数据库
Spring事务传播机制:7种姿势教你玩转"事务接力赛"
事务传播机制是Spring框架中用于管理事务行为的重要概念,它决定了在方法调用时事务如何传递与执行。通过7种传播行为,开发者可以灵活控制事务边界,适应不同业务场景。例如:REQUIRED默认加入或新建事务,REQUIRES_NEW独立开启新事务,NESTED支持嵌套回滚等。合理使用传播机制不仅能保障数据一致性,还能提升系统性能与健壮性。掌握这“七种人格”,才能在复杂业务中游刃有余。
|
Java Spring
Spring中事务失效的场景
因为Spring事务是基于代理来实现的,所以某个加了@Transactional的⽅法只有是被代理对象调⽤时, 那么这个注解才会⽣效 , 如果使用的是被代理对象调用, 那么@Transactional会失效 同时如果某个⽅法是private的,那么@Transactional也会失效,因为底层cglib是基于⽗⼦类来实现 的,⼦类是不能重载⽗类的private⽅法的,所以⽆法很好的利⽤代理,也会导致@Transactianal失效 如果在业务中对异常进行了捕获处理 , 出现异常后Spring框架无法感知到异常, @Transactional也会失效
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
393 0
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
1799 0
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——事务相关
本文介绍Spring Boot事务配置管理,阐述事务在企业应用开发中的重要性。事务确保数据操作可靠,任一异常均可回滚至初始状态,如转账、购票等场景需全流程执行成功才算完成。同时,事务管理在Spring Boot的service层广泛应用,但根据实际需求也可能存在无需事务的情况,例如独立数据插入操作。
336 0
|
9月前
|
Java 关系型数据库 数据库
深度剖析【Spring】事务:万字详解,彻底掌握传播机制与事务原理
在Java开发中,Spring框架通过事务管理机制,帮我们轻松实现了这种“承诺”。它不仅封装了底层复杂的事务控制逻辑(比如手动开启、提交、回滚事务),还提供了灵活的配置方式,让开发者能专注于业务逻辑,而不用纠结于事务细节。
1146 1
|
12月前
|
人工智能 Java 数据库连接
Spring事务失效场景
本文深入探讨了Spring框架中事务管理可能失效的几种常见场景及解决方案,包括事务方法访问级别不当、方法内部自调用、错误的异常处理、事务管理器或数据源配置错误、数据库不支持事务以及不合理的事务传播行为或隔离级别。通过合理配置和正确使用`@Transactional`注解,开发者可以有效避免这些问题,确保应用的数据一致性和完整性。
1036 10
|
12月前
|
人工智能 负载均衡 Java
Spring AI Alibaba 发布企业级 MCP 分布式部署方案
本文介绍了Spring AI Alibaba MCP的开发与应用,旨在解决企业级AI Agent在分布式环境下的部署和动态更新问题。通过集成Nacos,Spring AI Alibaba实现了流量负载均衡及节点变更动态感知等功能。开发者可方便地将企业内部业务系统发布为MCP服务或开发自己的AI Agent。文章详细描述了如何通过代理应用接入存量业务系统,以及全新MCP服务的开发流程,并提供了完整的配置示例和源码链接。未来,Spring AI Alibaba计划结合Nacos3的mcp-registry与mcp-router能力,进一步优化Agent开发体验。
3857 14
|
11月前
|
Java 关系型数据库 MySQL
【Spring】【事务】初学者直呼学会了的Spring事务入门
本文深入解析了Spring事务的核心概念与使用方法。Spring事务是一种数据库事务管理机制,通过确保操作的原子性、一致性、隔离性和持久性(ACID),维护数据完整性。文章详细讲解了声明式事务(@Transactional注解)和编程式事务(TransactionTemplate、PlatformTransactionManager)的区别与用法,并探讨了事务传播行为(如REQUIRED、REQUIRES_NEW等)及隔离级别(如READ_COMMITTED、REPEATABLE_READ)。
773 1