本文共 5436 字,大约阅读时间需要 18 分钟。
上一个章节已经讲解了seata服务端,也就是seata中TC、TM和RM概念中的TC的部署,本章节讲解seata客户端也就是TM和RM的集成.虽然分TM和RM,但是这是逻辑上的概念,在实质的集成中,TM和RM的集成方式是一样的.以server-user服务和server-pay为例集成.server-user为TM,server-pay为RM.
com.alibaba.cloud spring-cloud-alibaba-seata 2.2.0.RELEASE io.seata seata-spring-boot-starter io.seata seata-spring-boot-starter 1.2.0
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"
undo_log表sql脚本的位置:seata资源包路径:seata-1.2.0/script/client/at/db/mysql.sql
com.alibaba.cloud spring-cloud-alibaba-seata 2.2.0.RELEASE io.seata seata-spring-boot-starter io.seata seata-spring-boot-starter 1.2.0
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"
undo_log表sql脚本的位置:seata资源包路径:seata-1.2.0/script/client/at/db/mysql.sql
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(); }}
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") ResultSettest01();}
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(); }}
可以看到pay数据库的支付流水表并没插入记录,证明分布式事务起到了作用,出现异常,server-pay服务中插入的数据回滚了.
您的点赞、收藏、转发和关注是我持续创作的动力!
源码地址:
转载地址:http://futli.baihongyu.com/