seata源码分析之-AT模式客户端分析1

本文深入探讨了Seata分布式事务处理框架的AT模式工作原理,包括核心概念、Spring Boot下的客户端实现方式及其自动配置机制。通过分析源码,揭示了GlobalTransactional注解如何通过AOP技术实现对业务方法的增强,进而完成分布式事务的协调。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

放假了有时间详细的看下seata的相关原理,版本是1.4,看官网的那些图和介绍可能并不是很明白相关的组件是怎么工作的,有什么TC,TM,RM,他们做了哪些工作的,可能对一些细节和为什么这么设计并不是很清楚,所以还是想去了解下,顺便看下大厂的代码和设计思路,最直接的方式就是结合官网的介绍,然后看源码,对照着分析,但是这样的难度又比较大,很多人不知道怎么看,所以我决定还是从几个方面来分析下,比如我们现在用微服务,那我们就看下他在springcloud下是如何运行,AT,XA,TCC,SAGA这几种模式又是怎么运作的,各自有什么优缺点,比如从AT开始,貌似这个是比较复杂的,不过没关系,再复杂的东西最终也是很多简单的东西结合起来而已,当然你可能需要先了解TC,TM,RM是什么,大致做什么用的,方便理解,话不多说,那我们就开始吧。

一些基本的概念

我想说下一些名字,要理解为什么会出现,不要死记硬背他们是干嘛的。我们可以自己先想下,如果我们要做这个分布式事务,最简单的就是我们有多个事务要提交对吧,那就是有多个可以控制事务的服务对吧,那我们可以简单的认为他们就是RM,也就是资源管理器,可以理解为管理的就是数据库资源,我要执行事务,要回滚,我要锁资源,提交,释放这些操作。那问题来了,他们这些服务又是什么时候触发这些操作呢,一般是有其他第三方调用触发,那就得有个原因来让他们执行这些事,那这个原因的来源就是TM,也就是事务控制器,其实就是来触发RM做事情的。也可以理解为TM可以控制RM的行为,理论上所有的提交,回滚都可以让TM来控制,来个RPC调用就好啦,理想情况是这样的,但是一般TM也是业务方,如果TM挂了,那整个事务怎么处理呢,没有人控制了,所以能不能独立出一个专门的服务来处理这些问题,于是我们有了TC,事务协调器。它可以从全局上来看整个事务的状态,无论是TM挂了还是RM挂了,他都可以检测到,而且他本身可以集群高可用,这样遇到异常情况,他都可以处理,如果有一个出问题了,他可以控制RM回滚,而且他还可以记录全局事务的一些信息。TM紧紧只需要关注业务,不需要去直接去控制RM的提交和回滚,只需要跟TC通信,让TC去跟RM通信,进行解耦,TC对整个事务状态也是有追踪,可以监控异常情况作出反应,不至于出现TM挂了事务就不知道要怎么办了。大致可以这么理解,可能不是专业吧。

seata在springcloud下的客户端是怎么工作的

寻找seata在springboot的自动配置

一般这种框架在springboot下可以无感使用,基本都是有自动配置文件spring.factories的。
在这里插入图片描述
然后我们可以找一个比较重要的类GlobalTransactionAutoConfiguration,这里我解释下为什么我找到的是这个。
在这里插入图片描述

官方的springcloud-eureka-seata例子

我直接下了官方的例子,里面就有这个例子,默认是用AT模式的,然后我看了下BusinessService文件:
在这里插入图片描述
其实有GlobalTransactional这个注解,根据以往的经验,这些注解都是在AOP过程中被拿出来分析,然后做代理增强,在他的方法前后做点事情,所以就看这个注解在哪里被用到。
在这里插入图片描述
一点开,看见有那么多,但是从名字上看好像GlobalTransactionScanner和GlobalTransactionalInterceptor有用到。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210209211311118.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd3ZWkxOTg3MTEwMw==,size_16,color_FFFFFF,t_70
于是看了下用的地方,后来看到了熟悉的拦截器方法调用,一般就是这里用的:
在这里插入图片描述

在这里插入图片描述
然后就会想应该是AOP的时候加入了这个拦截器,然后调用方法的时候做了拦截。然后我们看拦截器在哪里被用到了:
在这里插入图片描述
然后我们看到了AOP的处理器GlobalTransactionScanner继承了springAbstractAutoProxyCreator
在这里插入图片描述
重写了这个熟悉的wrapIfNecessary方法,里面加入了GlobalTransactionalInterceptor拦截器处理:
在这里插入图片描述
GlobalTransactionScanner又是怎么用进来的呢,肯定是某个自动配置类里面实例化的,就是我最开始说的spring.factories中配置的。

在这里插入图片描述
至此我们知道了GlobalTransactional注解怎么起作用的,简单来说就是自动配置文件spring.factories中的GlobalTransactionAutoConfiguration配置类中实例化了并注入了GlobalTransactionScanner,而这个类是seata继承spring动态代理处理器AbstractAutoProxyCreator,并覆盖了wrapIfNecessary方法,加入了拦截器GlobalTransactionalInterceptor,进行了方法的增强,具体的事务操作就是增强做的。

在这里插入图片描述
在这里插入图片描述
最终是交给TransactionalTemplate来做的。其实TransactionalTemplate做的就是TM要做的事情,这个例子里BusinessService就是TM的角色,你也可以简单的理解为GlobalTransactional就是给TM用的,他来进行指挥,然后TC帮他传达到RMRM来进行具体操作。

好了,今天先到这里吧,后面继续。希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值