seata源码分析之-AT模式客户端分析1
前言
放假了有时间详细的看下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
有用到。
于是看了下用的地方,后来看到了熟悉的拦截器方法调用,一般就是这里用的:
然后就会想应该是AOP
的时候加入了这个拦截器,然后调用方法的时候做了拦截。然后我们看拦截器在哪里被用到了:
然后我们看到了AOP
的处理器GlobalTransactionScanner
继承了spring
的AbstractAutoProxyCreator
:
重写了这个熟悉的wrapIfNecessary
方法,里面加入了GlobalTransactionalInterceptor
拦截器处理:
那GlobalTransactionScanner
又是怎么用进来的呢,肯定是某个自动配置类里面实例化的,就是我最开始说的spring.factories
中配置的。
至此我们知道了GlobalTransactional
注解怎么起作用的,简单来说就是自动配置文件spring.factories
中的GlobalTransactionAutoConfiguration
配置类中实例化了并注入了GlobalTransactionScanner
,而这个类是seata
继承spring
动态代理处理器AbstractAutoProxyCreator
,并覆盖了wrapIfNecessary
方法,加入了拦截器GlobalTransactionalInterceptor
,进行了方法的增强,具体的事务操作就是增强做的。
最终是交给TransactionalTemplate
来做的。其实TransactionalTemplate
做的就是TM
要做的事情,这个例子里BusinessService
就是TM
的角色,你也可以简单的理解为GlobalTransactional
就是给TM
用的,他来进行指挥,然后TC
帮他传达到RM
,RM
来进行具体操作。
好了,今天先到这里吧,后面继续。希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。