前言
目录
文档配置文件只是列出一部分具体看项目
注册和配置都是用nacos,环境是在windows,mybatisplus
链接:百度网盘 请输入提取码
提取码:1dzo
1.安装seata和nacos
1.1nacos
直接bin目录下启动
ps:之前曾经出现过,注册到nacos上的seata不是配置文件中设置的服务名,导致出问题,后面换了一个新的seata,如图上面1.4.0版本的。
修改配置
registry模块:
type = "nacos" nacos { application = "seata-server" #seata注册到nacos上面的应用名 serverAddr = "127.0.0.1:8848" #注册中心的地址 group = "SEATA_GROUP" #分组 namespace = "c38653c6-e0df-403c-a53d-b87a7aa2ba98" #命名空间,强烈建议新建一个namespage单独用于seata,填写命名空间id cluster = "seata-cluster" #集群名 username = "nacos" #nacos的用户名 password = "nacos" #nacos密码 }
config模块:
type = "nacos" nacos { serverAddr = "127.0.0.1:8848" #注册中心的地址 group = "SEATA_GROUP" #分组 namespace = "c38653c6-e0df-403c-a53d-b87a7aa2ba98" #命名空间,强烈建议新建一个namespage单独用于seata,填写命名空间id username = "nacos" #nacos的用户名 password = "nacos" #nacos密码 dataId="seataServer.properties" }
1.2nacos的配置
a.添加命名空间
b.添加配置文件seataServer.properties
这个是seata配置文件中写到的dataId
注意点:service.vgroupMapping.my-tx-group=seata-cluster。和改造项目中的配置文件中对应
my-tx-group名字随意写,上下一致
# 数据存储方式,db代表数据库 store.mode=db store.db.datasource=druid store.db.dbType=mysql store.db.driverClassName=com.mysql.cj.jdbc.Driver store.db.url=jdbc:mysql://localhost:3306/seata?useSSL=false store.db.user=root store.db.password=root store.db.minConn=5 store.db.maxConn=30 store.db.globalTable=global_table store.db.branchTable=branch_table store.db.queryLimit=100 store.db.lockTable=lock_table store.db.maxWait=5000 # 事务、日志等配置 server.recovery.committingRetryPeriod=1000 server.recovery.asynCommittingRetryPeriod=1000 server.recovery.rollbackingRetryPeriod=1000 server.recovery.timeoutRetryPeriod=1000 server.maxCommitRetryTimeout=-1 server.maxRollbackRetryTimeout=-1 server.rollbackRetryTimeoutUnlockEnable=false server.undo.logSaveDays=7 server.undo.logDeletePeriod=86400000 #transaction service group mapping service.vgroupMapping.my-tx-group=seata-cluster #disable seata when false service.disableGlobalTransaction=true # 客户端与服务端传输方式 transport.serialization=seata transport.compressor=none # 关闭metrics功能,提高性能 metrics.enabled=false metrics.registryType=compact metrics.exporterList=prometheus metrics.exporterPrometheusPort=9898
2.改造项目
2.1依赖内容添加
<!--添加seata相关--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> <exclusions> <exclusion> <artifactId>seata-spring-boot-starter</artifactId> <groupId>io.seata</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>1.5.2</version> <!-- 对应自己的版本--> </dependency>
2.2配置文件添加内容
seata: registry: #TC服务注册中心的配置,微服务根据这些信息区注册中心获取tc服务地址 #参考tc服务自己的registry.conf中的配置 #包括:地址、namespace、group、application-name、cluster type: nacos nacos: #tc server-addr: 127.0.0.1:8848 namespace: "c38653c6-e0df-403c-a53d-b87a7aa2ba98" group: SEATA_GROUP application: seata-server #tc服务载nacos中的服务名称 username: nacos password: nacos tx-service-group: my-tx-group #事务组,根据这个获取tc服务的cluster名称 enabled: true service: #事务组与tc服务cluster的映射关系 vgroupMapping: my-tx-group: seata-cluster grouplist: seata-server: 127.0.0.1:8091
2.3.添加数据库代理类
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import io.seata.rm.datasource.DataSourceProxy; import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class DataSourceProxyConfig { @Bean public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) throws Exception { // 订单服务中引入了mybatis-plus,所以要使用特殊的SqlSessionFactoryBean MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); // 代理数据源 sqlSessionFactoryBean.setDataSource(new DataSourceProxy(dataSource)); // 生成SqlSessionFactory return sqlSessionFactoryBean.getObject(); } }
不然不能自动回滚
3.数据库
创建两个数据库 seata,seata-demo,分别是给seata数据库,和业务表数据库。
其中业务数据库,添加了一个undo_log 是和seata相关的
4.测试效果
postman 上执行post 请求
订单服务打上断点,发现数据库中订单表添加了一条数据,执行扣款的时候,出现以前,回滚,数据被删除了。说明分布式事务成功。
5.剩下问题
seata其他模式如何使用