Seata 源码分析 —— 项目结构一览

x33g5p2x  于2021-12-21 转载在 其他  
字(2.5k)|赞(0)|评价(0)|浏览(222)

1. 概述

本文主要分享 Seata 的项目结构。 希望通过本文能让胖友对 Seata 的整体项目有个简单的了解。

在拉取 Seata 项目后,我们会发现拆分了好多 Maven 项目。是不是内心一紧,产生了恐惧感?不要方,我们就是继续怼。

2. 代码统计

这里先分享一个小技巧。笔者在开始源码学习时,会首先了解项目的代码量。

第一种方式,使用 IDEA Statistic 插件,统计整体代码量。

我们可以粗略的看到,总的代码量在 19878 行。相比 Dubbo 代码量级在10W 级,算起来并不多。

第二种方式,使用 Shell 脚本命令逐个 Maven 模块统计 。

一般情况下,笔者使用 find . -name "*.java"|xargs cat|grep -v -e ^$ -e ^\s*\/\/.*$|wc -l 。这个命令只过滤了部分注释,所以相比 IDEA Statistic 会偏多

当然,考虑到准确性,胖友需要手动 cd 到每个 Maven 项目的 src/main/java 目录下,以达到排除单元测试的代码量。

3. Seata 角色

在开始看项目的结构前,我们先要了解下 Seata 的事务过程中,一共有哪些角色。如下图所示:
引用自 https://github.com/seata/seata


 

  • Seata TC(Transaction Coordinator),事务协调者,会接受全局事务的开启、提交、回滚,分支事务的注册。通过它的协调,达到多事务的一致性。
  • Seata TM(Transaction Manager),事务管理器,或者可以理解成事务的发起者,负责向 TC 发起全局事务的开启、提交、回滚。
  • Seata RM(Resource Manager),资源管理器,或者可以理解成事务的参与者,负责向 TC 发起分支事务的注册、提交,接收自 TC 请求的分支事务的提交、回滚。
    艿艿:当然,TC、TM、RM 并不是 Seata 所独有哈。

4. seata-common 项目

seata-common 项目,提供 Seata 封装的工具类、异常类等,大概在 2022 行代码左右。可以等到代码调用到的时,在看里面的逻辑。

5. seata-core 项目

seata-core 项目,提供 Seata 封装的 RPC、数据模型、通信消息格式等,大概在 10701 行。holy shit ,比想象中的多好多代码哈。可以等到代码调用到的时,在看里面的逻辑。

6. seata-config 项目

seata-config 项目,Seata 对配置中心的接入,大概在 1778 行代码左右。不同的 Maven 子项目,接入不同的配置中心:
用于 Seata TC 和 Seata RM 从配置中心,读取配置。

  • seata-config-core 项目,配置的核心实现,默认提供使用 File 存储配置。
  • seata-config-apollo 项目,提供对 Apollo 的接入。
  • seata-config-consul 项目,提供对 Consul 的接入。
  • seata-config-nacos 项目,提供对 Nacos 的接入。
  • seata-config-zk 项目,提供对 Zookeeper 的接入。


 

7. seata-discovery 项目

seata-discovery 项目,Seata 对注册中心的接入和负载均衡的功能,大概在 3486 行代码左右。不同的 Maven 子项目,接入不同的配置中心:

  • 用于 Seata TC 注册到注册中心。

  • 用于 Seata TM 从注册中心发现 Seata TC 。

  • seata-registry-core 项目,对注册中心的接入的核心实现,默认提供基于 File 实现注册发现。

  • seata-discovery-consul 项目,提供对 Consul 的接入。

  • seata-discovery-eureka 项目,提供对 Eureka 的接入。

  • seata-discovery-nacos 项目,提供对 Nacos 的接入。

  • seata-discovery-redis 项目,提供对 Redis 的接入。

  • seata-discovery-sofa 项目,提供对 SofaRegistry 的接入。

  • seata-discovery-zk 项目,提供对 Zookeeper 的接入。


 

8. seata-rm 项目

seata-rm 项目,Seata 对 RM 的核心实现,大概在 497 行代码。

seata-rm-datasource 项目,Seata 通过对 JDBC 拓展,从而实现对 MySQL 等的透明接入 Seata RM 的实现,大概在 7651 行代码。

🔥 看到此处,我们需要知道,seata-rm 和 seata-rm-datasource 项目,是我们需要重点看的项目。虽然 seata-rm-datasource 项目看起来代码很多,但是考虑到对 JDBC 相关接口的实现,很多是重复代码,实际算下来,也不会有这么大的代码量。so 保持淡定 🙂 。

9. seata-server 项目

seata-server 项目,Seata 对 TC 的核心实现,提供了事务协调、锁、事务状态、事务会话等功能,大概在 4049 行代码。


 

🔥 seata-server 项目,是另外一个我们需要花精力去研究的项目。

10. seata-tm 项目

seata-tm 项目,Seata 对 TM 的实现,提供了全局事务管理,例如说事务的发起,提交,回滚等,大概在 1316 行代码。

🔥 seata-tm 项目,也是一个我们需要花精力去研究的项目。

11. seata-tcc 项目

seata-tcc 项目,Seata 对 TCC 事务模式的实现,大概在

这个项目,可以等看完 Seata 核心逻辑后,在进行来看。

未来,Seata 会提供 Saga 事务模式,应该也会是一个子项目。

12. seata-spring 项目

seata-spring 项目,Spring 对 Seata 集成的实现,大概在 1019 行代码。例如说,使用 @GlobalTransactional 注解,自动创建全局事务,就是通过 seata-spring 项目来实现的。


 

13. integration 项目

integration 项目,用于对不同框架的集成,大概在 146 行代码左右。目前提供了对 Dubbo 框架的集成:

  • seata-dubbo 项目,提供对 Apache Dubbo 的接入。
  • seata-dubbo-alibaba 项目,提供对 Alibaba Dubbo 的接入。
    艿艿:两者的代码是一致的。

相关文章