# nacos-seata **Repository Path**: ifccod/nacos-seata ## Basic Information - **Project Name**: nacos-seata - **Description**: 一个基于nacos为注册中心的分布式事务项目案例 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-01-01 - **Last Updated**: 2021-08-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 分布式事务seata集成springboot+dubbo使用 ## 版本: - **seata:1.4.0** - **springboot:2.1.1.RELEASE** - **dubbo:2.7.8** - **nacos:1.4.0** - **mysql:8.0+** - **redis:6.0.8** **
** ## seata配置
**注:先贴一份springboot的配置,便于下面占位符的解释** ```json seata: #这个随便起名字,注意这个值要和 vgroup-mapping 后跟的一样 tx-service-group: nacos-order service: grouplist: nacos-ccod: 192.168.124.129:8091 vgroup-mapping: nacos-order: nacos-ccod disable-global-transaction: false client: tm: # 一阶段全局回滚结果上报TC重试次数(默认1次,建议大于1) rollback-retry-count: 3 # 一阶段全局提交结果上报TC重试次数(默认1次,建议大于1) commit-retry-count: 3 rm: report-success-enable: true async-commit-buffer-limit: 1000 application-id: nacos-order ``` ###
### 注:下面是seata的配置 ### seata/conf/registry.conf ```json registry { # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa #配置中心这里我选用nacos type = "nacos" loadBalance = "RandomLoadBalance" loadBalanceVirtualNodes = 10 nacos { application = "seata-server" serverAddr = "127.0.0.1:8848" group = "SEATA_GROUP" namespace = "" #注意这里,在springboot接入时候,配置文件中的配置,可对比一下上方springboot配置 #${seata:tx-service-group} 为 事务群组的名字,我用的是本应用的名字 #seata.service.grouplist.${cluster}: 192.168.124.129:8091 #seata.service.grouplist.vgroup-mapping.${seata:tx-service-group} = ${cluster} cluster = "nacos-ccod" username = "nacos" password = "nacos" } } ``` ### seata/conf/file.conf ```json store { ## store mode: file、db、redis # 我这里使用的是redis的方式,其他方式可以看一下官方文档的配置 mode = "redis" ## redis store property redis { host = "127.0.0.1" port = "6379" password = "cuican" database = "1" minConn = 1 maxConn = 10 maxTotal = 100 queryLimit = 100 } } ``` ** ## springboot相关代码 分为三个应用 - nacos-goods 商品 - nacos-order 订单 - nacos-gateway 网关入口 nacos-goods和nacos-order为服务提供简单的接口,主要入口在nacos-gateway
相关代码 ```java @Service public class SeataService { //引用的是nacos-goods的服务 @Autowired private GoodsFacadeClient goodsFacadeClient; //引用的是nacos-order的服务 @Autowired private OrderFacadeClient orderFacadeClient; @GlobalTransactional(name = "test-seata",rollbackFor = Exception.class) public String testSeata(String enable){ GoodsDto goodsDto = new GoodsDto(); goodsDto.setGoodsId("1008611"); goodsDto.setDesc("分布式事务商品"); goodsDto.setPrice("18.32"); goodsFacadeClient.addGoods(goodsDto); OrderDTO orderDTO = new OrderDTO(); orderDTO.setOrderId("1008611"); orderDTO.setCreateTime(new Date()); orderDTO.setPrice("18.32"); orderDTO.setUpdateTime(new Date()); orderFacadeClient.createOrder(orderDTO); //通过传参判断是否抛出异常 if(StringUtils.isNotEmpty(enable)){ System.out.println(1/0); } return "SUCCESS"; } } //GoodsFacadeClient goodsFacadeClient; @DubboReference private GoodsFacade goodsFacade; @Override public boolean addGoods(GoodsDto dto) { System.out.println("新增商品服务执行了"); return goodsFacade.addGoods(dto); } //OrderFacadeClient orderFacadeClient; @DubboReference private OrderFacade orderFacade; @Override public boolean createOrder(OrderDTO dto) { return orderFacade.createOrder(dto); } ```
### controller代码: --- ```java @RestController public class GatewayController { @Autowired private SeataService seataService; @GetMapping public String testSeata(String enable){ return seataService.testSeata(enable); } } ```
## 启动三个项目 - 浏览器访问 **http://localhost** ,这样没有异常,可以正常入库 - 浏览器访问 **http://localhost?enable=true **,1/0异常,可以看到库内无数据生成,也可以看到回滚日志 ```java 2021-01-01 13:00:25.904 INFO 15968 --- [p-nio-80-exec-2] i.seata.tm.api.DefaultGlobalTransaction : Begin new global transaction [192.168.122.1:8091:88256630658961408] 2021-01-01 13:00:26.006 INFO 15968 --- [p-nio-80-exec-2] i.seata.tm.api.DefaultGlobalTransaction : [192.168.122.1:8091:88256630658961408] rollback status: Rollbacked ```
代码地址:[https://gitee.com/ifccod/nacos-seata](https://gitee.com/ifccod/nacos-seata)