要在Spring Cloud 2中集成Seata、MyBatis Plus以实现分布式事务,您可以按照以下步骤进行操作:
步骤 1: 准备环境
1.1 安装 Nacos
-
下载 Nacos:
- 访问 Nacos GitHub 下载 Nacos 1.4.0 的压缩包。
-
解压文件:
tar -zxvf nacos-server-1.4.0-bin.tar.gz
-
启动 Nacos:
- 进入解压后的目录,并启动 Nacos 服务。
cd nacos-server-1.4.0 ./bin/startup.sh -m standalone
1.2 安装 Seata
-
下载 Seata:
- 从 Seata 的 GitHub 或者官方网站下载 Seata 1.4.0 的压缩包。
-
解压文件:
tar -zxvf seata-server-1.4.0.tar.gz
-
配置 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=
- 进入
-
启动 Seata:
- 进入到
seata-server-1.4.0/script
目录。 - 执行启动脚本。
sh seata-server.sh start
- 进入到
步骤 2: 创建 Spring Cloud 项目
2.1 创建 Maven 项目
-
创建一个新的 Maven 项目:
- 使用 IntelliJ IDEA 或者其他 IDE 创建一个新的 Maven 项目。
-
添加依赖:
- 在
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 应用
-
添加 Spring Boot 启动类:
- 创建
Application.java
类并添加@SpringBootApplication
和@EnableDiscoveryClient
注解。@SpringBootApplication @EnableDiscoveryClient public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
- 创建
-
配置 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:
- 添加 Nacos 和 Seata 的配置。
-
创建实体类:
- 创建 MyBatis Plus 的实体类,并继承
BaseEntity
。@Data @NoArgsConstructor @AllArgsConstructor @TableName("account") public class Account implements Serializable { private Long id; private String name; private Integer balance; }
- 创建 MyBatis Plus 的实体类,并继承
-
创建 Mapper 接口:
- 创建 MyBatis Plus 的 Mapper 接口。
@Mapper public interface AccountMapper extends BaseMapper<Account> { }
- 创建 MyBatis Plus 的 Mapper 接口。
-
创建 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; } } }
- 创建 Service 接口和对应的实现。
-
创建 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"; } }
- 创建 REST 控制器来暴露转账接口。
步骤 3: 运行并测试
-
启动 Nacos 和 Seata 服务:
- 确保 Nacos 和 Seata 服务正在运行。
-
运行 Spring Boot 应用:
- 运行
Application.java
类启动 Spring Boot 应用程序。
- 运行
-
执行测试:
- 使用 Postman 或者浏览器访问相应的端点,触发分布式事务。
- URL:
http://localhost:8080/transfer?from=Alice&to=Bob&amount=100
- URL:
- 使用 Postman 或者浏览器访问相应的端点,触发分布式事务。
通过以上步骤,您就可以在Spring Cloud 2中集成Seata和MyBatis Plus,并实现分布式事务了。请注意,这只是一个简化的教程,实际部署时可能需要考虑更多的细节和优化。如果您在安装过程中遇到任何问题,请参考 Seata 和 Nacos 的官方文档获取更详细的说明和示例。