⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/Seata/intro/ 「芋道源码」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

本文基于 Seata 0.6.0-SNAPSHOT 版本,望知悉。

1. 概述

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

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

项目结构

2. 代码统计

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

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

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 目录下,以达到排除单元测试的代码量。

Shell 脚本统计代码量

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-rmseata-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 的接入。

艿艿:两者的代码是一致的。

 项目

666. 彩蛋

初步一个统计,预计要看的代码总量,大概在 1W 行左右。这么一算,内心无比淡定,妥妥的好看懂,哈哈哈哈。

本文更多的是说明每个项目的用途,代码量的统计。所以这里在推荐一篇胖友写的文章,可以更加深入的了解 Seata :《深度剖析一站式分布式事务方案Seata(Fescar)-Server》

文章目录
  1. 1. 1. 概述
  2. 2. 2. 代码统计
  3. 3. 3. Seata 角色
  4. 4. 4. seata-common 项目
  5. 5. 5. seata-core 项目
  6. 6. 6. seata-config 项目
  7. 7. 7. seata-discovery 项目
  8. 8. 8. seata-rm 项目
  9. 9. 9. seata-server 项目
  10. 10. 10. seata-tm 项目
  11. 11. 11. seata-tcc 项目
  12. 12. 12. seata-spring 项目
  13. 13. 13. integration 项目
  14. 14. 666. 彩蛋