分布式事务 Seata 教程 - Spring Cloud 2集成Mybatis Plus

要在Spring Cloud 2中集成Seata、MyBatis Plus以实现分布式事务,您可以按照以下步骤进行操作:

步骤 1: 准备环境

1.1 安装 Nacos
  1. 下载 Nacos:

  2. 解压文件:

    tar -zxvf nacos-server-1.4.0-bin.tar.gz
    
  3. 启动 Nacos:

    • 进入解压后的目录,并启动 Nacos 服务。
    cd nacos-server-1.4.0
    ./bin/startup.sh -m standalone
    
1.2 安装 Seata
  1. 下载 Seata:

    • 从 Seata 的 GitHub 或者官方网站下载 Seata 1.4.0 的压缩包。
  2. 解压文件:

    tar -zxvf seata-server-1.4.0.tar.gz
    
  3. 配置 Seata:

    • 进入 seata-server-1.4.0/conf 目录。
    • 编辑 config.txt 文件,设置 Nacos 作为注册中心。
      #registry
      registry.type=nacos
      registry.nacos.serverAddr=127.0.0.1:8848
      registry.nacos.group=SEATA_GROUP
      registry.nacos.namespace=
      
  4. 启动 Seata:

    • 进入到 seata-server-1.4.0/script 目录。
    • 执行启动脚本。
      sh seata-server.sh start
      

步骤 2: 创建 Spring Cloud 项目

2.1 创建 Maven 项目
  1. 创建一个新的 Maven 项目:

    • 使用 IntelliJ IDEA 或者其他 IDE 创建一个新的 Maven 项目。
  2. 添加依赖:

    • pom.xml 文件中添加必要的依赖项。
      <dependencies>
          <!-- Spring Cloud Alibaba Nacos -->
          <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
              <version>2.2.3.RELEASE</version>
          </dependency>
          <!-- Seata Client -->
          <dependency>
              <groupId>io.seata</groupId>
              <artifactId>seata-spring-boot-starter</artifactId>
              <version>1.4.0</version>
          </dependency>
          <!-- MyBatis Plus -->
          <dependency>
              <groupId>com.baomidou</groupId>
              <artifactId>mybatis-plus-boot-starter</artifactId>
              <version>3.4.0</version>
          </dependency>
          <!-- MySQL Driver -->
          <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>8.0.23</version>
          </dependency>
          <!-- Spring Boot Starter Web -->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
      </dependencies>
      
      <dependencyManagement>
          <dependencies>
              <dependency>
                  <groupId>com.alibaba.cloud</groupId>
                  <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                  <version>2.2.3.RELEASE</version>
                  <type>pom</type>
                  <scope>import</scope>
              </dependency>
          </dependencies>
      </dependencyManagement>
      
2.2 配置 Spring Cloud 应用
  1. 添加 Spring Boot 启动类:

    • 创建 Application.java 类并添加 @SpringBootApplication@EnableDiscoveryClient 注解。
      @SpringBootApplication
      @EnableDiscoveryClient
      public class Application {
          public static void main(String[] args) {
              SpringApplication.run(Application.class, args);
          }
      }
      
  2. 配置 application.yml 文件:

    • 添加 Nacos 和 Seata 的配置。
      spring:
        cloud:
          nacos:
            discovery:
              server-addr: 127.0.0.1:8848
          alibaba:
            seata:
              tx-service-group: my_test_tx_group
              enable-auto-data-source-proxy: true
              service:
                vgroup-mapping:
                  my_test_tx_group: default
                enable-degrade: false
                disable-global-transaction: false
        datasource:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/seata?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
          username: root
          password: yourpassword
        mybatis-plus:
          mapper-locations: classpath:mapper/*.xml
          configuration:
            map-underscore-to-camel-case: true
            cache-enabled: false
            log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      seata:
        client:
          rm:
            report-success-enable: true
            lock:
              retry-interval: 10
              retry-times: 30
              retry-policy-branch-rollback-on-conflict: true
          tm:
            default-global-transaction-timeout: 60000
        enabled: true
        config:
          type: nacos
          nacos:
            server-addr: 127.0.0.1:8848
            group: SEATA_GROUP
            namespace:
            username:
            password:
      
  3. 创建实体类:

    • 创建 MyBatis Plus 的实体类,并继承 BaseEntity
      @Data
      @NoArgsConstructor
      @AllArgsConstructor
      @TableName("account")
      public class Account implements Serializable {
          private Long id;
          private String name;
          private Integer balance;
      }
      
  4. 创建 Mapper 接口:

    • 创建 MyBatis Plus 的 Mapper 接口。
      @Mapper
      public interface AccountMapper extends BaseMapper<Account> {
      }
      
  5. 创建 Service 接口和服务实现:

    • 创建 Service 接口和对应的实现。
      public interface AccountService {
          void transfer(String fromName, String toName, int amount);
      }
      
      @Service
      public class AccountServiceImpl implements AccountService {
          @Autowired
          private AccountMapper accountMapper;
      
          @Override
          public void transfer(String fromName, String toName, int amount) {
              // 查询转账前账户余额
              Account fromAccount = accountMapper.selectOne(new QueryWrapper<Account>().eq("name", fromName));
              Account toAccount = accountMapper.selectOne(new QueryWrapper<Account>().eq("name", toName));
      
              // 开启全局事务
              RootContext.begin("XID");
              try {
                  // 从账户扣款
                  fromAccount.setBalance(fromAccount.getBalance() - amount);
                  accountMapper.updateById(fromAccount);
      
                  // 模拟异常
                  if (fromName.equals("Alice")) {
                      throw new RuntimeException("Simulated exception.");
                  }
      
                  // 到账户加款
                  toAccount.setBalance(toAccount.getBalance() + amount);
                  accountMapper.updateById(toAccount);
      
                  // 提交事务
                  RootContext.commit("XID");
              } catch (Exception e) {
                  // 回滚事务
                  RootContext.rollback("XID");
                  throw e;
              }
          }
      }
      
  6. 创建 REST 控制器:

    • 创建 REST 控制器来暴露转账接口。
      @RestController
      public class AccountController {
          @Autowired
          private AccountService accountService;
      
          @PostMapping("/transfer")
          public String transfer(@RequestParam("from") String fromName, @RequestParam("to") String toName, @RequestParam("amount") int amount) {
              accountService.transfer(fromName, toName, amount);
              return "Transfer successful";
          }
      }
      

步骤 3: 运行并测试

  1. 启动 Nacos 和 Seata 服务:

    • 确保 Nacos 和 Seata 服务正在运行。
  2. 运行 Spring Boot 应用:

    • 运行 Application.java 类启动 Spring Boot 应用程序。
  3. 执行测试:

    • 使用 Postman 或者浏览器访问相应的端点,触发分布式事务。
      • URL: http://localhost:8080/transfer?from=Alice&to=Bob&amount=100

通过以上步骤,您就可以在Spring Cloud 2中集成Seata和MyBatis Plus,并实现分布式事务了。请注意,这只是一个简化的教程,实际部署时可能需要考虑更多的细节和优化。如果您在安装过程中遇到任何问题,请参考 Seata 和 Nacos 的官方文档获取更详细的说明和示例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值