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
文章插图
ServerRunner 是一个 CommandLineRunner 实例 , 因此在Spring Boot启动完成后会回调其run()方法 。而在ServerRunner的run()方法中调用了Server.start()方法 。
文章插图
在Server#start()方法中,初始化了包括id生成器在内的很多组件,我们先不管这些,重点关注以下几行代码:
NettyRemotingServer nettyRemotingServer = new NettyRemotingServer(workingThreads);DefaultCoordinator coordinator = DefaultCoordinator.getInstance(nettyRemotingServer);coordinator.init();nettyRemotingServer.setHandler(coordinator);DefaultCoordinator是一个单例Bean , 在整个应用中只有一个DefaultCoordinator实例
文章插图
文章插图
文章插图
DefaultCoordinator 实现了 TransactionMessageHandler
NettyRemotingServer#setHandler()设置的正是TransactionMessageHandler
文章插图
DefaultCoordinator#onRequest()
文章插图
重点是这三行:
AbstractTransactionRequestToTC transactionRequest = (AbstractTransactionRequestToTC) request;transactionRequest.setTCInboundHandler(this);transactionRequest.handle(context);DefaultCoordinator实现了TCInboundHandler接口 , 所以它不仅是一个TransactionMessageHandler,还是一个TCInboundHandler
这里transactionRequest.setTCInboundHandler(this),就是指定AbstractTransactionRequestToTC中的TCInboundHandler设置为DefaultCoordinator
文章插图
文章插图
AbstractTransactionRequest#handle()
文章插图
不同的请求分发给对应的处理器去处理
文章插图
现在请求和对应的处理器都有了,下面具体看一下每种请求都是如何被处理的
1. 开启全局事务
文章插图
开启事务直接调用子类DefaultCoordinator#doGlobalBegin(),同时放在一个处理模板中执行
文章插图
在doGlobalBean()中调用DefaultCore#begin()并返回全局事务ID(xid)
文章插图
new GlobalSession()
文章插图
添加一个SessionManager作为Session的监听器
文章插图
Core
文章插图
总结一下 , 开启事务:
- 创建一个GlobalSession
- 【Seata Server 1.5.2 源码学习】给GlobalSession添加一个监听器SessionManager
- session.begin()
文章插图
开启事务 , 创建一个全局事务,如果是seata.store.mode=db的话,向global_table表插入一条记录
2. 分支事务注册
文章插图
文章插图
DefaultCore#branchRegister()
文章插图
文章插图
推荐阅读
- 观察者 CH58X/CH57X/V208 Observer例程讨论讲解
- Seata 1.5.2 源码学习
- Sql Server性能排查和优化懒人攻略
- 分布式事务框架 Seata 入门案例
- Azure DevOps Server 入门实践与安装部署
- 【Serverless】快速集成云函数HarmonyOS
- Eureka Server 实现在线扩容
- Seata 环境搭建
- 【Serverless】云函数微信小程序
- SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截