# 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)