无尽光芒

Seata分布式事务处理

2021.12.11

Seata简介

seata 简介

1:启动Seata

1.1 下载Seata

前往GitHub 下载 Seata

1.2 配置Seata

Seata 中的配置文件在 seata/conf 目录中,启动要修改的配置文件有两个,分别是:file.confregistry.conf

按照我的理解,file.conf 是配置事务回滚需要文件数据的,registry.conf 是配置注册中心的。

按照自己需要来进行修改,我这里使用了 MysqlNacos 来进行配置。

1.3 启用Seata
### 这里指定host 的时候,如果是不同机器访问,则指定对外host
sh seata-server.sh -p 8091 -h 127.0.0.1 -m file

启动成功:

image.png

Nacos 中也成功注册了。

image.png

2:编写项目

这次的项目编写,因为是测试,所以很简单的一个分布式调用。

分别为:调用方,库存方,订单方。

调用方调用减库存,调用订单方生成订单。

2.1:调用方

使用OpenFeign 来进行调用服务。

则需要引入包内容为:

// 进行调用
 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>

// 注册中心
<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

// seata
<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>

配置文件内容为:

server:
  port: 1001

spring:
  application:
    name: seata-web
  cloud:
    nacos:
      discovery:
        # 注册中心地址
        server-addr: 192.168.31.37:8848
        username: nacos
        password: nacos
feign:
  hystrix:
    enabled: false
  client:
    config:
      default:
        #建立连接所用的时间,适用于网络状况正常的情况下,两端连接所需要的时间
        ConnectTimeOut: 5000
        #指建立连接后从服务端读取到可用资源所用的时间
        ReadTimeOut: 5000
seata:
  enabled: true
  enable-auto-data-source-proxy: true
  tx-service-group: test-default
  registry:
    type: nacos
    nacos:
      password: xiaofsu
      username: nacos
      # 注册中心地址
      server-addr: 192.168.31.37:8848
      application: seata-server
  service:
    vgroup-mapping:
      test-default: default
    disable-global-transaction: false
    grouplist:
      # seata启动对外地址
      default: 192.168.31.37:8091
  client:
    rm:
      report-success-enable: false

具体代码不放置了,具体就是使用OpenFeign 来进行调用订单方和库存方。

在服务发起调用的时候,需要添加Seata 的事务注解@GlobalTransactional(rollbackFor = Exception.class) 来让Seata 处理。

2.2:订单和库存方

同样也需要导入Seata 包。

配置文件

server:
  port: 2001

spring:
  application:
    name: seata-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.31.37:8848
        username: nacos
        password: nacos
    alibaba:
      seata:
        tx-service-group: test-default
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.31.37:49177/seata_1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: root

seata:
  service:
    vgroup-mapping:
      test-default: default
    grouplist:
      default: 192.168.31.37:8091
    disable-global-transaction: false

3:测试

先正常情况下测试,可以进行减库存和生成订单操作。

当某一个服务抛出异常之后,则事务回滚。


image.png

A-B A-C (A-C 调用异常,事务回滚)

具体代码:Gitee


image.png

A-B A-C B-D (B-D 调用异常,事务回滚)

具体代码:Gitee