一.概述
上一个章节已经讲解了seata服务端,也就是seata中TC、TM和RM概念中的TC的部署,本章节讲解seata客户端也就是TM和RM的集成.虽然分TM和RM,但是这是逻辑上的概念,在实质的集成中,TM和RM的集成方式是一样的.以server-user服务和server-pay为例集成.server-user为TM,server-pay为RM.
二.server-user集成seata
1.server-user.pom中加入相关依赖.
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>2.2.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
2.bootstrap.yml中加入相关配置.
seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: my_test_tx_group
enable-auto-data-source-proxy: true
config:
type: nacos
nacos:
namespace:
serverAddr: 47.96.131.185:8849
group: SEATA_GROUP
userName: "nacos"
password: "nacos"
registry:
type: nacos
nacos:
application: seata-server #seata服务端(TC)在nacos中的应用名称
server-addr: 47.96.131.185:8849
namespace:
userName: "nacos"
password: "nacos"
3.user数据库加入表undo_log.
undo_log表sql脚本的位置:seata资源包路径:seata-1.2.0/script/client/at/db/mysql.sql
三.server-pay集成seata
1.server-pay.pom中加入相关依赖.
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>2.2.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
2.bootstrap.yml中加入相关配置.
seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: my_test_tx_group
enable-auto-data-source-proxy: true
config:
type: nacos
nacos:
namespace:
serverAddr: 47.96.131.185:8849
group: SEATA_GROUP
userName: "nacos"
password: "nacos"
registry:
type: nacos
nacos:
application: seata-server #seata服务端(TC)在nacos中的应用名称
server-addr: 47.96.131.185:8849
namespace:
userName: "nacos"
password: "nacos"
3.pay数据库加入表undo_log.
undo_log表sql脚本的位置:seata资源包路径:seata-1.2.0/script/client/at/db/mysql.sql
四.测试代码编写
1.server-user服务
(1).SeataTestController
package com.ccm.server.user.controller;
import com.ccm.common.exception.result.ResultSet;
import com.ccm.server.user.dao.mysql.domain.UserInfo;
import com.ccm.server.user.dao.mysql.mapper.TestTableMapper;
import com.ccm.server.user.dao.mysql.mapper.UserInfoMapper;
import com.ccm.server.user.openfeign.ServerPayFeign;
import io.seata.spring.annotation.GlobalTransactional;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description seata测试控制层
* @Author ccm
* @CreateTime 2020/7/16 21:59
*/
@Api(tags = "seata测试")
@RestController
@RequestMapping(value = "seataTest")
public class SeataTestController {
@Autowired
private UserInfoMapper userInfoMapper;
@Autowired
private ServerPayFeign serverPayFeign;
@GlobalTransactional
@ApiOperation(value = "seata分布式事务测试")
@GetMapping(value = "test01")
public ResultSet test02() {
ResultSet.getFeignData(serverPayFeign.test01());
int i = 1/0;
UserInfo userInfo = new UserInfo();
userInfoMapper.insert(userInfo);
return ResultSet.success();
}
}
(2).ServerPayFeign
package com.ccm.server.user.openfeign;
import com.ccm.common.exception.result.ResultSet;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @Description 调用server-pay的feign层
* @Author ccm
* @CreateTime 2020/08/28 9:46
*/
@FeignClient(name = "server-pay")
public interface ServerPayFeign {
@GetMapping(value = "seataTest/test01")
ResultSet<String> test01();
}
2.server-pay服务
(1).SeataTestController
package com.ccm.server.pay.controller;
import com.ccm.common.exception.result.ResultSet;
import com.ccm.server.pay.dao.mysql.domain.PayFlowingWater;
import com.ccm.server.pay.dao.mysql.mapper.PayFlowingWaterMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;
/**
* @Description seata rm端测试控制层
* @Author ccm
* @CreateTime 2020/7/16 21:59
*/
@Api(tags = "seata rm端测试")
@RestController
@RequestMapping(value = "seataTest")
public class SeataTestController {
@Autowired
private PayFlowingWaterMapper payFlowingWaterMapper;
@ApiOperation(value = "seata测试")
@GetMapping(value = "test01")
public ResultSet test01() {
PayFlowingWater payFlowingWater = new PayFlowingWater();
payFlowingWater.setFlowingWaterId(UUID.randomUUID().toString());
payFlowingWaterMapper.insert(payFlowingWater);
return ResultSet.success();
}
}
3.启动gateway、server-user和server-pay服务
4.打开gateway的swagger界面
5.接口测试
6.查看数据库
可以看到pay数据库的支付流水表并没插入记录,证明分布式事务起到了作用,出现异常,server-pay服务中插入的数据回滚了.
您的点赞、收藏、转发和关注是我持续创作的动力!
源码地址:https://gitee.com/chouchimoo/ccm-mall.git(本章节代码分支:zj-37)