Springcloud alibaba + nacos +seata 教程

317 阅读5分钟

摘要:本文主要介绍了springcloud alibaba + nacos +seata测试分布式事务的ATXA模式的示例代码,未接入网关,只用了feign之间调用。

简介

项目共分为三个子工程,goods-servicemember-serviceweb-service,在web-service中调用其他两个工程来测试事务。

主要代码和实现步骤

创建父工程huzhihui-alibaba-seata,你可以创建你自己工程的名称,pom文件内容如下

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.github.huzhihui</groupId>
    <artifactId>huzhihui-alibaba-seata</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>member-service</module>
        <module>goods-service</module>
        <module>web-service</module>
    </modules>
    <packaging>pom</packaging>

    <properties>
        <java.version>1.8</java.version>
        <alibaba.cloud.version>2.2.9.RELEASE</alibaba.cloud.version>
        <springboot.version>2.3.12.RELEASE</springboot.version>
        <seata.version>1.5.2</seata.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
                <version>${alibaba.cloud.version}</version>
            </dependency>
            <!--feign-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
                <version>${alibaba.cloud.version}</version>
            </dependency>
            <!-- nacos 作为服务注册中心 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>${alibaba.cloud.version}</version>
            </dependency>
            <!-- nacos 作为配置中心 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
                <version>${alibaba.cloud.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                <version>${alibaba.cloud.version}</version>
            </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>
            <dependency>
                <groupId>io.seata</groupId>
                <artifactId>seata-spring-boot-starter</artifactId>
                <version>${seata.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>com.alibaba</groupId>
                        <artifactId>druid</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
                <version>${alibaba.cloud.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>io.seata</groupId>
                        <artifactId>seata-spring-boot-starter</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.12</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.2.6</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${springboot.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
                <version>${springboot.version}</version>
            </dependency>


            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <version>${springboot.version}</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.3.1</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-actuator</artifactId>
                <version>${springboot.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>${springboot.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

然后创建三个子工程

goods-servicemember-serviceweb-service

goods-service工程主要代码

创建数据库dynamic_goods

建表语句

CREATE TABLE `goods` (
  `id` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
  `name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `desc` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  • 如果使用AT模式则需要增加下面的日志表
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  `ext` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>huzhihui-alibaba-seata</artifactId>
        <groupId>com.github.huzhihui</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>goods-service</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator</artifactId>
            <version>${springboot.version}</version>
        </dependency>
        <!-- nacos 作为服务注册中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- nacos 作为配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba</groupId>
                    <artifactId>druid</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>io.seata</groupId>
                    <artifactId>seata-spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

</project>

bootstrap.yml

主要配置服务名称和nacos相关配置

spring:
  application:
    name: goods-service
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.137.100:8848
        username: "nacos"
        password: "nacos"
      config:
        server-addr: 192.168.137.100:8848
        username: "nacos"
        password: "nacos"
server:
  port: 8084

application.yml

配置数据库连接和seata

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://192.168.137.100:3306/dynamic_goods?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&useAffectedRows=true&allowMultiQueries=true
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root
mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  typeAliasesPackage: com.github.huzhihui.goods.entity
  global-config:
    db-config:
      id-type: auto
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: true
    auto-mapping-unknown-column-behavior: none
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
seata:
  enabled: true
  application-id: goods-service
  tx-service-group: hzh_tx_group
  service:
    vgroup-mapping:
      hzh_tx_group: true
  config:
    type: nacos
    nacos:
      namespace: seata-server
      serverAddr: 192.168.137.100:8848
      group: SEATA_GROUP
      username: "nacos"
      password: "nacos"
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 192.168.137.100:8848
      group: SEATA_GROUP
      namespace: seata-server
      username: "nacos"
      password: "nacos"
  data-source-proxy-mode: XA

主要的代码

  • GoodsServiceApplication启动类
@MapperScan("com.github.huzhihui.goods.mapper")
@SpringBootApplication
public class GoodsServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(GoodsServiceApplication.class, args);
    }
}
  • GoodsEntity实体
@Data
@TableName("goods")
public class GoodsEntity {

    @TableId(type = IdType.INPUT)
    private String id;

    @TableField(value = "`name`")
    private String name;

    @TableField(value = "`desc`")
    private String desc;

    private Date createTime;
}
  • goodsMapper接口
@Repository
public interface GoodsMapper extends BaseMapper<GoodsEntity> {
}
  • goodsController控制类入口
@RestController
@RequestMapping(value = "goods")
public class GoodsController {

    @Autowired
    private GoodsMapper goodsMapper;

    @GetMapping(value = "add")
    public String add(String name){
        GoodsEntity goodsEntity = new GoodsEntity();
        goodsEntity.setId(IdWorker.getIdStr());
        goodsEntity.setName(name);
        goodsMapper.insert(goodsEntity);
        return "SUCCESS";
    }

    @GetMapping(value = "update")
    public String update(String id,String name){
        GoodsEntity goodsEntity = new GoodsEntity();
        goodsEntity.setId(id);
        goodsEntity.setName(name);
        goodsMapper.updateById(goodsEntity);
        return "SUCCESS";
    }
}

member-service工程主要代码

创建数据库dynamic_member

建表语句

CREATE TABLE `user` (
  `id` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
  `name` varchar(40) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `address` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  • 如果使用AT模式则需要增加下面的日志表
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  `ext` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>huzhihui-alibaba-seata</artifactId>
        <groupId>com.github.huzhihui</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>member-service</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator</artifactId>
            <version>${springboot.version}</version>
        </dependency>
        <!-- nacos 作为服务注册中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- nacos 作为配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba</groupId>
                    <artifactId>druid</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>io.seata</groupId>
                    <artifactId>seata-spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

</project>

bootstrap.yml

主要配置服务名称和nacos相关配置

spring:
  application:
    name: member-service
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.137.100:8848
        username: "nacos"
        password: "nacos"
      config:
        server-addr: 192.168.137.100:8848
        username: "nacos"
        password: "nacos"
server:
  port: 8083

application.yml

配置数据库连接和seata

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://192.168.137.100:3306/dynamic_member?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&useAffectedRows=true&allowMultiQueries=true
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root
mybatis-plus:
  mapper-locations: classpath:/mapper/*Mapper.xml
  typeAliasesPackage: com.github.huzhihui.member.entity
  global-config:
    db-config:
      id-type: auto
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: true
    auto-mapping-unknown-column-behavior: none
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
seata:
  enabled: true
  application-id: member-service
  tx-service-group: hzh_tx_group
  service:
    vgroup-mapping:
      hzh_tx_group: true
  config:
    type: nacos
    nacos:
      namespace: seata-server
      serverAddr: 192.168.137.100:8848
      group: SEATA_GROUP
      username: "nacos"
      password: "nacos"
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 192.168.137.100:8848
      group: SEATA_GROUP
      namespace: seata-server
      username: "nacos"
      password: "nacos"
  data-source-proxy-mode: XA

主要的代码

  • GoodsServiceApplication启动类
@MapperScan("com.github.huzhihui.member.mapper")
@SpringBootApplication
public class MemberServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(MemberServiceApplication.class, args);
    }
}
  • UserEntity实体
@Data
@TableName("user")
public class UserEntity {

    @TableId(type = IdType.INPUT)
    private String id;

    private String name;

    private String address;

    private Date createTime;
}
  • UserMapper接口
@Repository
public interface UserMapper extends BaseMapper<UserEntity> {
}
  • goodsController控制类入口
@RestController
@RequestMapping(value = "user")
public class UserController {

    @Autowired
    private UserMapper userMapper;

    @GetMapping(value = "add")
    public String add(String name){
        UserEntity userEntity = new UserEntity();
        userEntity.setId(IdWorker.getIdStr());
        userEntity.setName(name);
        userMapper.insert(userEntity);
        return "SUCCESS";
    }

    @GetMapping("update")
    public String update(String id,String name){
        UserEntity userEntity = new UserEntity();
        userEntity.setId(id);
        userEntity.setName(name);
        userMapper.updateById(userEntity);
        return "SUCCESS";
    }
}

web-service工程

该工程用做服务调用的入口

pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>huzhihui-alibaba-seata</artifactId>
        <groupId>com.github.huzhihui</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>web-service</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- nacos 作为服务注册中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- nacos 作为配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>io.seata</groupId>
                    <artifactId>seata-spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

bootstrap.yml

spring:
  application:
    name: web-service
  main:
    allow-bean-definition-overriding: true
  cloud:
    loadbalancer:
      retry:
        enabled: false
    nacos:
      discovery:
        server-addr: 192.168.137.100:8848
        username: "nacos"
        password: "nacos"
      config:
        server-addr: 192.168.137.100:8848
        username: "nacos"
        password: "nacos"
server:
  port: 8082
ribbon:
  ConnectTimeout: 100000
  ReadTimeout: 1000000
  OkToRetryOnAllOperations: false
feign:
  sentinel:
    enabled: true

application.yml

seata:
  enabled: true
  application-id: web-service
  tx-service-group: hzh_tx_group
  service:
    vgroup-mapping:
      hzh_tx_group: true
  config:
    type: nacos
    nacos:
      namespace: seata-server
      serverAddr: 192.168.137.100:8848
      group: SEATA_GROUP
      username: "nacos"
      password: "nacos"
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 192.168.137.100:8848
      group: SEATA_GROUP
      namespace: seata-server
      username: "nacos"
      password: "nacos"

核心代码

  • WebServiceApplication
@EnableFeignClients
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class WebServiceApplication {

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

}
  • GoodsFeignApi
@FeignClient("goods-service")
public interface GoodsFeignApi {

    @GetMapping(value = "goods/add")
    String add(@RequestParam String name);

    @GetMapping(value = "goods/update")
    String update(@RequestParam("id") String id,@RequestParam("name") String name);
}
  • MemberFeignApi
@FeignClient(value = "member-service")
public interface MemberFeignApi {

    @GetMapping(value = "user/add")
    String add(@RequestParam String name);

    @GetMapping(value = "user/update")
    String update(@RequestParam("id") String id,@RequestParam("name") String name);

}
  • CommonController
@Slf4j
@RestController
@RequestMapping(value = "common")
public class CommonController {

    @Autowired
    private GoodsFeignApi goodsFeignApi;
    @Autowired
    private MemberFeignApi memberFeignApi;

    @GlobalTransactional
    @GetMapping(value = "add-all")
    public String addAll(String memberName,String goodsName) throws Exception{
        String memberResult = memberFeignApi.add(memberName);
        log.info("member 结果"+memberResult);
        String goodsResult = goodsFeignApi.add(goodsName);
        log.info("goods 结果"+goodsResult);
        Thread.sleep(10000);
        int a = 1/0;
        return "SUCCESS";
    }

    @GlobalTransactional
    @GetMapping(value = "update-all")
    public String updateAll(String memberName,String goodsName) throws Exception{
        String memberResult = memberFeignApi.update("1586912853468667905",memberName);
        log.info("member 结果"+memberResult);
        String goodsResult = goodsFeignApi.update("1586912864549994497",goodsName);
        log.info("goods 结果"+goodsResult);
        Thread.sleep(10000);
        int a = 1/0;
        return "SUCCESS";
    }

}

测试

  • 需要提前在nacos配置一个事务分组,因为上面的配置的分组为hzh_tx_group image.png

XA模式

该模式不需要undo这个表,并且事务按照XA协议来,通过分布式事务统一管理,具体可以看官方文档对XA模式的介绍

AT模式

该模式需要创建undo表,上面已经列出来了,该模式通过日志补偿方式,可能存在并发情况下补偿失败的情况。