Springboot 、Springcloud 集成分布式事务 Seata1.4.1
理论者略过。。。自己去找资料看吧。。。
直接上实践。。。
本地集成采用 springboot 2.X + seata 1.4.1 ,seata 目前最新的版本也就是 1.4.1 ,不同的版本集成有所不同。
服务注册中心采用 nacos
所以需要提前准备好:
jdk已安装,并且环境变量已配置
nacos已安装
各个服务都已写好,可以进行分布式集成后的测试。
步骤:
1、为各个微服务模块的数据库添加 事务回滚表 undo_log ,切记用到的微服务都要创建这张表。
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2、用到的微服务导入 seata 依赖
<!--seata-->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.1</version> <!--指定最新版本,当然要与seata-server版本一致-->
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
3、安装事务协调器 seata-server
提示:seata-server 的启动需要java开发环境,所以先确保JDK已经配置了。
从 https://github.com/seata/seata/releases,下载服务器软件包,将其解压缩。
解压后,修改配置文件 regist.conf ,修改后如下:
registry {
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "120.24.71.90:8848"
group = "SEATA_GROUP"
namespace = ""
cluster = "default"
username = ""
password = ""
}
}
config {
type = "file"
file {
name = "file.conf" #Seata配置文件(同级file.conf文件)
}
}
widows 版本安装
直接下载下来。
seata-server-1.4.1\seata\bin\seata-server.bat
seata-server.bat 点击启动。
centos7 直接安装
tar -zxvf seata-server-1.4.1.tar.gz
cd /seata/conf
vim registry.conf 编辑配置文件
启动:./seata-server.sh -p 8091 -h 127.0.0.1 -m file
docker 安装
拉取镜像
docker pull seataio/seata-server:1.4.1
启动 seata
docker run --name seata-server -p 8091:8091 -d seataio/seata-server:1.4.1
复制配置
docker cp seata-server:/seata-server /mydata/seata
停止seata
docker stop seata-server
删除seata
docker rm seata-server
重新运行seata
docker run -d --restart always --name seata-server -p 8091:8091 -v /mydata/seata:/seata-server -e SEATA_IP=8.135.114.10 -e SEATA_PORT=8091 seataio/seata-server:1.4.1
进入到seata的挂载目录,编辑配置
cd /mydata/seata/resources
vi registry.conf
重启seata
docker restart seata-server
安装成功后,查看nacos中是否有seata的服务
4、所有想要用到分布式事务的服务需要配置、并且导入 file.conf
seata:
enabled: true
application-id: ${spring.application.name}
# 是否开启数据源自动代理 如果不开启设置为false
enable-auto-data-source-proxy: true
tx-service-group: gulimall-order-tx-group
service:
vgroup-mapping:
gulimall-order-tx-group: default #key与上面的tx-service-group的值对应
registry:
type: nacos
nacos:
application: seata-server
server-addr: 120.24.71.90:8848
namespace:
group: DEFAULT_GROUP
config:
type: file
file:
name: file.conf
5、在主业务的service 类的 方法上添加 @GlobalTransactional 与@Transactional
在从业务服务的的feign调用的service的方法上添加本地事务 @Transactional
订单服务
@GlobalTransactional
@Transactional
@Override
public void testSeata() {
OrderEntity entity = new OrderEntity();
entity.setOrderSn(UUID.randomUUID().toString());
this.save(entity);
log.info("order return is : {}",JSONObject.toJSONString(entity));
// 远程调用
R save = wareFeignService.save();
log.info("ware return is : {}",JSONObject.toJSONString(save));
int i = 1/0;
}
仓储服务
@Transactional
@Override
public void saveTest(WareInfoEntity entity) {
this.save(entity);
}
6、启动进行测试