Seata Server 1.5.2 源码学习

Seata 包括 Server端和Client端 。Seata中有三种角色:TC、TM、RM , 其中,Server端就是TC,TM和RM属Client端 。Client端的源码学习上一篇已讲过,详见 《Seata 1.5.2源码学习》,今天来学习Server端的源码 。
源码下载地址:https://github.com/seata/seata
启动类 ServerApplication 没什么好说的,重点是ServerRunner

Seata Server 1.5.2 源码学习

文章插图
ServerRunner 是一个 CommandLineRunner 实例 , 因此在Spring Boot启动完成后会回调其run()方法 。而在ServerRunner的run()方法中调用了Server.start()方法 。
Seata Server 1.5.2 源码学习

文章插图
在Server#start()方法中,初始化了包括id生成器在内的很多组件,我们先不管这些,重点关注以下几行代码:
NettyRemotingServer nettyRemotingServer = new NettyRemotingServer(workingThreads);DefaultCoordinator coordinator = DefaultCoordinator.getInstance(nettyRemotingServer);coordinator.init();nettyRemotingServer.setHandler(coordinator);DefaultCoordinator是一个单例Bean , 在整个应用中只有一个DefaultCoordinator实例
Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图
DefaultCoordinator 实现了 TransactionMessageHandler
NettyRemotingServer#setHandler()设置的正是TransactionMessageHandler
Seata Server 1.5.2 源码学习

文章插图
DefaultCoordinator#onRequest()
Seata Server 1.5.2 源码学习

文章插图
重点是这三行:
AbstractTransactionRequestToTC transactionRequest = (AbstractTransactionRequestToTC) request;transactionRequest.setTCInboundHandler(this);transactionRequest.handle(context);DefaultCoordinator实现了TCInboundHandler接口 , 所以它不仅是一个TransactionMessageHandler,还是一个TCInboundHandler
这里transactionRequest.setTCInboundHandler(this),就是指定AbstractTransactionRequestToTC中的TCInboundHandler设置为DefaultCoordinator
Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图
AbstractTransactionRequest#handle()
Seata Server 1.5.2 源码学习

文章插图
不同的请求分发给对应的处理器去处理
Seata Server 1.5.2 源码学习

文章插图
现在请求和对应的处理器都有了,下面具体看一下每种请求都是如何被处理的
1. 开启全局事务
Seata Server 1.5.2 源码学习

文章插图
开启事务直接调用子类DefaultCoordinator#doGlobalBegin(),同时放在一个处理模板中执行
Seata Server 1.5.2 源码学习

文章插图
在doGlobalBean()中调用DefaultCore#begin()并返回全局事务ID(xid)
Seata Server 1.5.2 源码学习

文章插图
new GlobalSession()
Seata Server 1.5.2 源码学习

文章插图
添加一个SessionManager作为Session的监听器
Seata Server 1.5.2 源码学习

文章插图
Core
Seata Server 1.5.2 源码学习

文章插图
总结一下 , 开启事务:
  1. 创建一个GlobalSession
  2. 【Seata Server 1.5.2 源码学习】给GlobalSession添加一个监听器SessionManager
  3. session.begin()

Seata Server 1.5.2 源码学习

文章插图
开启事务 , 创建一个全局事务,如果是seata.store.mode=db的话,向global_table表插入一条记录
2. 分支事务注册
Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图
DefaultCore#branchRegister()
Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

推荐阅读