Seata分布式事务框架安装

715 阅读2分钟

因为 Seata 针对不同框架在具体安装上会有点差异,所以本文章部分安装步骤或配置是仅针对 Nacos Spring Cloud 框架和 MySQL 数据库以及个别框架的特定版本。

安装 Seata 服务端

步骤一:在数据库中运行该文件

v1.4.2 seata/script/server/db/mysql.sql 图片.png

运行完后数据库中有以下几张表:

表名说明
global_table全局事务
branch_table分支事务
lock_table全局锁

步骤二:下载安装包并解压

官方下载链接 github.com/seata/seata… 图片.png

步骤三:修改解压后的配置文件

打开文件 conf/file.conf 图片.png

修改mode以及数据库连接信息 图片.png

步骤四:修改解压后的注册文件

打开文件 conf/registry.conf 图片.png

修改type和nacos信息

图片.png

步骤五:运行启动脚本

运行脚本 bin/seata-server.bat 图片.png

启动成功后在 nacos 中可以看到服务 图片.png

安装 Seata 客户端

步骤一:在数据库中运行SQL文件

v1.4.2 seata/script/client/at/db 图片.png

运行完后数据库中有以下几张表:

表名说明
undo_log

步骤二:MAVEN项目里添加依赖

...
<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>

    <spring.boot.version>2.6.3</spring.boot.version>
    <spring.cloud.version>2021.0.1</spring.cloud.version>
    <alibaba.cloud.version>2021.0.1.0</alibaba.cloud.version>
    <spring-cloud-starter-alibaba-seata.version>2021.0.1.0</spring-cloud-starter-alibaba-seata.version>
    <seata-spring-boot-starter.version>1.4.2</seata-spring-boot-starter.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring.boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${alibaba.cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- Spring boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Cloud -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>

    <!-- Nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
    <!-- Seata -->
    <dependency>
        <groupId>io.seata</groupId>
        <artifactId>seata-spring-boot-starter</artifactId>
        <version>${seata-spring-boot-starter.version}</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        <version>${spring-cloud-starter-alibaba-seata.version}</version>
        <exclusions>
            <exclusion>
                <groupId>io.seata</groupId>
                <artifactId>seata-spring-boot-starter</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

<!-- 此处使用阿里云maven仓库避免网络问题加载依赖失败 -->
<repositories>
    <repository>
        <id>aliyunmaven</id>
        <name>aliyunmaven</name>
        <url>https://maven.aliyun.com/repository/central</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
...

步骤三:修改 bootstrap.yml 文件

spring:
  application:
    # 服务名称,可以自定义名称替换 xxxx-service
    name: xxxx-service

步骤四:修改 application.yml 文件

# 服务端口
server:
  port: 8080

spring:
  cloud:
    nacos:
      # nacos地址
      discovery:
        server-addr: 127.0.0.1:8848
    alibaba:
      seata:
        # 此处的值跟下一步骤里的 Nacos 配置对应
        tx-service-group: seata-tx-service-group

seata:
  # 分布式事务模式
  data-source-proxy-mode: AT
  config:
    type: nacos
    # 根据实际情况修改
    nacos:
      server-addr: 127.0.0.1:8848
      group: "DEFAULT_GROUP"

步骤五:修改 NACOS 配置列表

图片.png

Data id配置内容
service.vgroupMapping.seata-tx-service-groupseata-tx-service-group
service.seata-tx-service-group.grouplist127.0.0.1:8091

使用 Seata 分布式事务

根据实际情况自定义Spring Boot启动类

@EnableDiscoveryClient
@EnableAutoConfiguration
@SpringBootApplication
public class ExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class);
    }

}

需要分布式事务的场景加上GlobalTransactiona注解

@GlobalTransactional(rollbackFor = Exception.class)
public xxxx xxxx(...) {
  ...
}

启动客户端成功后则可以看到以下日志

register TM success. client version:1.4.2, server version:1.4.2 ...

参考资料和链接