SpringCloud+Seata+Nacos分布式事务实战
spring cloud微服务中使用seata实现分布式事务,并使用nacos作为配置中心与注册中心
·
一、Seata服务搭建
1. 拉取seata服务的镜像(seata-seaver)
# 这里我们选择拉取1.2.0的版本,目前应该是最新的
docker pull seataio/seata-server:1.2.0
# 查看一下镜像,虽然没什么卵用
docker images
如果出现这个就说明拉取镜像成功
2. 上传配置到配置中心
- 因为我使用的是Nacos作为配置中心,所以现在要把配置上传到nacos,这个参照一下官网的上传方式就好了http://seata.io/zh-cn/docs/user/configurations.html,拉到下面发现有个标黄的地方给他展开。
- 但是到这里可能并没什么卵用,因为我用的是docker(为什么是Docker呢,个人习惯吧,平时搭环境用docker会方便一点),不是下载的二进制文件,所以他这种方式弄不了。
那么重点来了:我们简单讲一下上传原理,就是通过脚本读取配置文件里面的配置项,然后调用Nacos的Api来上传每一项配置(因为我用的是nacos,所以举例也用naocs,其他的注册中心原理一样)
- 接下来我提供一下gtihub上的配置文件和脚本,
上传的时候注意一下图片中的这个路径
。
3. 接下来启动镜像
# 启动seata-server服务
docker run --name seata-server -d \
-p 8091:8091 \
-e SEATA_CONFIG_NAME=file:/root/seata-config/registry \
-e SEATA_IP=192.168.1.195 \
-e SEATA_PORT=8091 \
-v /usr/dvsc/seata1.2.0/registry.conf:/root/seata-config/registry.conf \
-v /usr/dvsc/seata1.2.0/logs:/root/logs \
seataio/seata-server:1.2.0
如果使用了注册中心,则会将SEATA_IP:SEATA_PORT这个地址注册到注册中心,如果不配置的话可能会找不到seata服务。
-v 当前机器的路径:docker容器里面的路径,虽然大家都知道,但是以防忘记。
# registry.conf 的配置内容
registry {
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "192.168.1.191:5280"
namespace = "lp"
cluster = "DEFAULT"
}
}
config {
type = "nacos"
nacos {
serverAddr = "192.168.1.191:5280"
namespace = "seata"
group = "DEFAULT_GROUP"
}
}
}
- 我这里使用了nacos做为配置中心和注册中心
- 因为我这里挂载了日志目录,所以可以在宿主机查看日志,如果没有挂载,就使用docker logs 容器ID
来查看日志
如果看日志没有报错,那到这里seata的服务就算是起来了
二、客户端配置
1. 添加Seata依赖包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
2. 在项目配置中添加如下配置
# Seata 服务组配置
spring.cloud.alibaba.seata.tx-service-group=DVSC-GOV-GROUP
# seata nacos 注册中心
seata.registry.type=nacos
# 这个地方需要配置的是seata服务的名称,seata会根据这个名称去连接nacos上注册的seata服务
seata.registry.nacos.application=seata-server
seata.registry.nacos.server-addr=192.168.1.191:5280
seata.registry.nacos.namespace=lp
seata.registry.nacos.cluster=DEFAULT
#seata nacos 配置中心:这个配置中心和服务的配置用同一个就行了。
seata.config.type=nacos
seata.config.nacos.server-addr=192.168.1.191:5280
seata.config.nacos.group=SEATA_GROUP
seata.config.nacos.namespace=seata
对应的配置了服务组配置之后,需要在seata对应的配置中心配置里面增加一条:service.vgroupMapping.DVSC-GOV-GROUP=对应的服务分组名,默认写DEFAULT
3. 代码中添加注解
-
在需要实现分布式事务的方法上添加@GlobalTransactional注解。(如果是实现AT模式的话到这里就可以了)
-
如果是TCC模式,必须要定义接口来实现服务。格式如下:
@LocalTCC public interface MenuService { @TwoPhaseBusinessAction(name = "addMenu", commitMethod = "commit", rollbackMethod = "rollback") Boolean addTenantMenu(BusinessActionContext actionContext); Boolean commit(BusinessActionContext actionContext); Boolean rollback(BusinessActionContext actionContext); }
-
@TwoPhaseBusinessAction注解中的参数,name为必须,但是内容是自定义的,后面两个是提交和回滚的方法配置,如果是commit和rollback可以省略不写,因为是默认的。
三、代码示例
后续补上github代码连接。
更多推荐
已为社区贡献1条内容
所有评论(0)