目录
一、Seata介绍
seata全称是:simple extensiable autonomous transaction architecture,中文直译就是:简单的、可扩展的、自治的事务架构。
Seata作为跨数据库的分布式事务管理和解决办法,提供了AT、TCC、Saga、XA四种事务模式解决方案。 其中AT模式对业务代码几乎零修改零侵入。相关介绍请见官网。
Seata分为服务端(Seata Server)和客户端(即各个微服务)。服务端即TC全局协调中心,客户端即TM和RM。
Seata基本概念
在 Seata 的架构中,一共有三个角色:
- TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。 (个人感觉若叫“Global Transaction Coordinator” GTC更加直观)
- TM (Transaction Manager) - 事务管理器:定义全局事务的范围,开始全局事务、提交或回滚全局事务。
- RM ( Resource Manager ) - 资源管理器:管理分支事务处理的资源( Resource ),与 TC 交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
其中,TC 为单独部署的Seata-Server 服务端,TM 和 RM 为嵌入到各个微服务应用中的 Client 客户端。
在 Seata 中,分布式事务的生命周期示意图如下(绿色箭头为服务间调用链路,传递过程中自动携带全局事务xid的传递):
注:全局事务的整体提交还是回滚,是由全局事务的发起方来决定的。 发起方决定后,告诉TC,并由TC通知各服务进行branch事务在各服务本地的commit/rollback操作。
更多原理和过程分析
可参见文章:[图文] Seata AT 模式分布式事务源码分析_旧时光 | YoungChen's 博客-CSDN博客
二、无分布式事务控制的情况
在之前的Java工程(4.SpringCloud:Sentinel服务流控与服务降级_zyplanke的专栏-CSDN博客)已经有支付服务、订单服务。在其工程基础上,对其进行修改(主要是增加对数据库的访问)
1、对pom.xml增加spring-boot-starter-data-jpa、mysql-connector-java、druid-spring-boot-starter三个依赖。内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.10</version>
<relativePath/>
</parent>
<modules>
<module>payment</module>
<module>order</module>
</modules>
<groupId>com.example</groupId>
<artifactId>myproject-global-pom</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<description>This is my project global pom config</description>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<springcloud.version>3.1.6</springcloud.version>
<springcloudalibaba.version>2021.0.4.0</springcloudalibaba.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${springcloudalibaba.version}</version>
<exclusions>
<exclusion>
<!-- nacos-client2.0.4版本存在官方github上的#6999及#10385号Bug; nacos-client2.2.1版本存在当配置中心配置变化后客户端AsyncAppender进程数不断增加Bug -->
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${springcloudalibaba.version}</version>
<exclusions>
<exclusion>
<!-- nacos-client2.0.4版本存在官方github上的#6999及#10385号Bug; nacos-client2.2.1版本存在当配置中心配置变化后客户端AsyncAppender进程数不断增加Bug -->
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>${springcloud.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>${springcloud.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${springcloud.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>${springcloud.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>${springcloudalibaba.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>