seata具体介绍可以查看官网描述,这里不做过多赘述。从开发人员角度可以理解为一套中间件,以@GlobalTranscation注解的方式替换掉原本只能支持单数据库,服务器的@Transcation实现多服务,多数据库的总体事务控制。
Seata官方文档
参考我的另一篇文章consul集成seata配置
客户端启动入口位置,注册组件
@ComponentScan(basePackages = "io.seata.spring.boot.autoconfigure.properties")
@ConditionalOnProperty(prefix = SEATA_PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
@Configuration
@EnableConfigurationProperties({
SeataProperties.class})
注册GlobalTransCationScaner组件
@Bean
@DependsOn({
BEAN_NAME_SPRING_APPLICATION_CONTEXT_PROVIDER, BEAN_NAME_FAILURE_HANDLER})
@ConditionalOnMissingBean(GlobalTransactionScanner.class)
public GlobalTransactionScanner globalTransactionScanner(SeataProperties seataProperties, FailureHandler failureHandler) {
if (LOGGER.isInfoEnabled()) {
LOGGER.info("Automatically configure Seata");
}
return new GlobalTransactionScanner(seataProperties.getApplicationId(), seataProperties.getTxServiceGroup(), failureHandler);
}
负责扫描GlobalTranscation注解是否存在,若存在且配置项支持全局事务控制,io.seata.spring.annotation.GlobalTransactionScanner#existsAnnotation
,存在则注册TM和RM客户端
@Override
public void afterPropertiesSet() {
ConfigurationCache.addConfigListener(ConfigurationKeys.DISABLE_GLOBAL_TRANSACTION,
(ConfigurationChangeListener)this);
if (disableGlobalTransaction) {
if (LOGGER.isInfoEnabled()) {
LOGGER.info("Global transaction is disabled.");
}
return;
}
if (initialized.compareAndSet(false, true)) {
initClient();
}
}
在initClient中,注册tm客户端,rm客户端 ,再注册一个sping注销事件,注销时停止rm和tm客户端远程实例
private void registerSpringShutdownHook() {
if (applicationContext instanceof ConfigurableApplicationContext) {
((ConfigurableApplicationContext) applicationContext).registerShutdownHook();
ShutdownHook.removeRuntimeShutdownHook();
}
ShutdownHook.getInstance().addDisposable(TmNettyRemotingClient.getInstance(applicationId, txServiceGroup));
ShutdownHook.getInstance().addDisposable(RmNettyRemotingClient.getInstance(applicationId, txServiceGroup));
}
TM客户端初始化,tm是事务发起和结束的基础,负责事务的开始和提交或回滚决定,注册时传入事务分组id
TM初始化完成的事情:
TmNettyRemotingClient.init()
io.seata.core.rpc.netty.TmNettyRemotingClient#registerProcessor
io.seata.core.rpc.netty.AbstractNettyRemotingClient#init
io.seata.core.rpc.netty.AbstractNettyRemoting#init
io.seata.core.rpc.processor.client.ClientOnResponseProcessor#process
,后续处理逻辑为消息发送初始化方法:io.seata.core.rpc.netty.RmNettyRemotingClient#init
RM与TM的init中,都继承和调用了父类的init方法,所以这里一致io.seata.core.rpc.netty.AbstractNettyRemotingClient#init
,启动线程接收池,启动线程清理超时请求
不同的是在注册processor的时候有些不一致:io.seata.core.rpc.netty.RmNettyRemotingClient#registerProcessor
注册提交处理器:RmBranchCommitProcessor
回滚处理器:RmBranchRollbackProcessor
undoLog处理器:RmUndoLogProcessor
TC响应处理器:ClientOnResponseProcessor
注册心跳监听
实现org.aopalliance.intercept.MethodInterceptor
io.seata.config.ConfigurationChangeListener
seata类配置改变和springmethod请求都会调用到io.seata.spring.annotation.GlobalTransactionalInterceptor#invoke
方法,在其中判断方法体上是否有GlobalTransactional或者GlobalLock注解,然后决定是否处理全局事务
boolean localDisable = disable || (degradeCheck && degradeNum >= degradeCheckAllowTimes);
if (!localDisable) {
if (globalTransactionalAnnotation != null) {
return handleGlobalTransaction(methodInvocation, globalTransactionalAnnotation);
} else if (globalLockAnnotation != null) {
return handleGlobalLock(methodInvocation, globalLockAnnotation);
}
}
在handleGlobalTransaction
中,实际处理方法为transactionalTemplate.execute
,他是调用io.seata.tm.api.TransactionalTemplate#execute
,并实io.seata.tm.api.TransactionalExecutor
接口中定义的事务定义
io.seata.tm.api.TransactionalTemplate#execute
为TM中事务控制的主要逻辑位置
其中的逻辑为:
8中,回滚的异常处理逻辑在io.seata.tm.api.TransactionalTemplate#completeTransactionAfterThrowing
其中会判断用户定义是否需要回滚,若此处需要回滚则发送消息给TC,TC决定回滚并分发给RM,拥有相同XID的RM执行UndoLog中的数据恢复工作
9 中清除UndoLog信息
处理TCC模式下的截断和实现
压缩机,提供7z,zip等格式的压缩
配置加载模块,包括Seata自身的配置和注册中心的配置信息
主启动模块,`io.seata.server.Server#main``为服务端的启动方法,其中也包含auth,log等模块,其中主要区别有io.seata.server.coordinator,coordinator为TC的主要逻辑处理协调类,负责事务回滚和提交的决策
启动步骤:
ServerOnResponseProcessor
负责处理commit和rollbackRegRmProcessor
rm消息处理响应RegTmProcessor
tm消息处理响应ServerHeartbeatProcessor
客户端探知的心跳响应核心模块,包括登录认证,解压压缩,常量信息,事件,上下文,异常,锁,日志,调用,序列化,存储等功能的实现和封装
服务注册,负责注册到注册中心,其中分不同注册中心,方式不一致
metrics监控,为阿里的监控模块,低侵入集成
sql解析器,负责解析业务系统的sql和生成反向sql,是rm可以实现undo的主要解析
rm处理器模块代码,RM为资源管理器,其代理数据库的提交和回滚,日志等操作
其中,rm-datasource 包处理数据库中的事务提交回滚等实现
rm-datasource包组成:
exec:对sql按照不同的sql类型进行执行,并保存执行前后镜像文件到undo数据结构中,用于事务回滚,继承结构举例
io.seata.rm.datasource.ConnectionProxy#processGlobalTransactionCommit
提交 @Override
public void rollback() throws SQLException {
targetConnection.rollback();//本地事务进行回滚
if (context.inGlobalTransaction() && context.isBranchRegistered()) {
// 如果是全局事务,且进行过分支注册,则向server报告未提交完成
report(false);
}
context.reset();
}
事务管理器模块,事务的发起和结束(提交或回滚)由其处理和发送给tc
TCC模式的处理模块,TCC模式为TC决定是否提交和回滚,由RM提交确认状态,TC统一决定是否提交或回滚
Saga模式的处理模块,Saga模式为支持降级处理策略的AT,其中降级算法由业务代码提供
整合,一体化模块,其中集成dubbo和http客户端等
数据库脚本包,包含各个数据库的初始化脚本和其他数据库脚本等
Seata客户端依赖包的自动装配类和扫描类等位于此包中