基于JDK17+Seata改造
项目改造基于JDK17+Nacos2.2+Sentinel1.8.6+Seata1.6.1版本,(官方推荐配置)
使用原因
由于项目上使用微服架构,各服务都有独立的数据库,那么如何保证事务的一致性?
而Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
Seata改造
Seata可分为两种方式配合项目使用
1:代码进行maven编译成jar包进行项目部署
2:修改seata文件下config.txt以及script下nacos-center文件进行改造,运行bin目录启动
Seata改造
A:安装包方式改造(推荐) 改造包地址 zip目录下
安装包方式较为简单,容易变更以及部署
改造处理方式
1:下载安装包 1.6.1
1:官网 https://seata.io/zh-cn/
2:下载地址:https://seata.io/zh-cn/blog/download.html
3:参考文档:https://seata.io/zh-cn/blog/seata-quick-start.html
3:部署指南:https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html
2:修改seata/seata/conf/application.yml内容
源文件seata/config默认使用file方式,需要修改为nacos,并修改seata的config、registry、store都将其改为nacos
nacos的配置应于项目实际使用的proup/namespace一致,否则配置不生效,group默认使用为public
3:新建数据库表seata使用的库以及表(当前使用的数据库版本为8.0)
根据seata/seata/script/server/db/mysql.sql建数据库表seata
注:多个服务要进行事务回滚,那么都应每个服务的表都加入“undo_log”
4:配置 seata server 参数 修改config.txt(非常重要)
config.txt位置: seata/seata/script/config-center/config.txt
修改数据库连接,配置不同服务默认分组(分组后,在实际项目中进行一一对应方可进行事务管理)
部署配置 seata-server不同版本存在不同方式
V1.4.2以及之前
修改conf.txt文件并将其推至送nacos中
配置文件详情见conf.txt
推送至nacos(使用git命令方式)
nacos-config.sh或者 nacos-config.py
sh nacos-config.sh -h 172.22.1.190 -p 8848 -g SEATA_GROUP -t d229c141-52de-4e60-bd4f-216391283c58 -u nacos -w SOPQzj312#!40Cc
-h – nacos ip
-p – nacos 端口
-g – seata-server配置文件 分组名
-t – seata-server配置文件 命名空间ID,当然在此之前需要现在nacos上新建命名空间并记录下命名空间ID
-u – nacos账号
-w – nacos密码
当前版本为V1.6.2(当前使用如下操作)-seataServer.properties
Seata从v1.4.2版本开始,支持从一个Nacos dataId配置项中获取所有配置信息。
所以,在nacos配置中心中新建配置,dataId为 seataServer.properties配置项
group 默认是使用default_group 推荐修改为于项目nacos的pom的一致,方便管理
在nacos中 添加dataID:seataServer.properties文件,具体内容还是config.txt中的配置


启动seata
windows:
进入bin目录下,启动bat即可
linux: (如已经配置端口,可不指定端口)
sh seata-server.sh -h 172.22.1.190 -p 8091 -m db
页面展示
seata 页面

nacos 页面展示

B:源码改造
源码改造处理方式(与安装包改造基本一致)
源码 maven clean install package 初始化启动会存在问题
处理方式两种:(先选择其一)
1:删除serializer模块中seata-serializer-protobuf即可,seata-serializer注释引用protobuf模块,该可以不被引用
2:很明显就是protobuf包下generated不存在,其实这是由于seata的serializer项目么有编译造成的,
只需要我们idea下载安装Protobuf Support插件,然后重启idea,
然后在idea右侧maven菜单中,双击如下protobuf-compile执行就可以生成protobuf项目的java代码了。
修改conf.txt文件(着重)
该配置文件中主要修改内容
1:默认file修改为nacos配置信息(store.mode )
2:修改seata 数据库连接地址(应在对应数据库中新增库表)
3:修改service.vgroup_mapping 配置(注册服务) 启用默认分组
如需多个服务使用事务管理,应创建多个service.vgroup_mapping。规则为“service.vgroup_mapping.{namespace}-seata-service-group=default”
4:启用分布式事务指定的群组 --多个服务使用一个群组管理
#service.vgroupMapping.calvin_test_tx_group=default
5:default-grouplist配置
service.default.grouplist=127.0.0.1:8091 服务默认端口。7081 该配置首位指定上升一位
service.enableDegrade=false 是否降级处理 默认false
service.disableGlobalTransaction=false 事务管理-全局事务管理 false为开启 true为关闭
特别注意
conf.txt配置中加的service.vgroup_mapping-**应于nacos中进行分组下进行新增配置

新建数据库表seata使用的库以及表(当前使用的数据库版本为8.0)
根据seata/seata/script/server/db/mysql.sql建数据库表seata
注:多个服务要进行事务回滚,那么都应每个服务的表都加入“undo_log”
nacos注册seataServer.properties 该配置文件应与项目中保持一致,也与该服务配置一致
操作方式与 安装包方式中该文件处理方式一致
服务group 保持与项目分组一致,便于管理 data-id 使用seataServer.properties命名,使用txt脚本,添加conf.txt的内容
注册启动后nacos进行页面查看
nacos 页面展示

application.yml改造
该文件改造主要是适配于多环境下启动
该文件可进行改造也可使用默认
源码文件已保存名为application-bak.yml
源码配置文件示例已存为application.example.yml
改造application.yml
改为多配置文件,详情查看 server/resources/application.yml
新增dev.yml、test.yml、local.yml、prod.yml 灵活配置
项目服务启动
windows:
选择server服务下的ServerAppliction.java进行启动
也可 nohup sh seata-server.sh -p 11091 > /usr/local/seata/logs/seata_nohup.log 2>&1 &
linux:
进行maven 进行打包后,使用命令进行打包部署
mvn clean install '-Dmaven.test.skip=true'
mvn clean package '-Dmaven.test.skip=true'
java -jar seata.jar(打包jar名) &
也可以使用 nohup java -jar seata.jar(打包jar名) & 输出实时文件日志
如果linux未指定端口名 启动命令 还应加上端口等信息
docker run -d --restart always --name seata-server -p 8091:8091 -p 7091:7091 -v /usr/local/seata/seata-server:/seata-server -e SEATA_PORT=8091 -e SEATA_IP=[自己的ip地址] seataio/seata-server:1.6.1
以下为seata整合springCloud项目操作说明
springCloud项目整合引入pom坐标
<!-- 注意一定要引入对版本,要引入spring-cloud版本seata,而不是springboot版本的seata-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<!-- 排除掉springcloud默认的seata版本,以免版本不一致出现问题-->
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 上面排除掉了springcloud默认seata版本,此处引入和seata-server版本对应的seata包-->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.6.1</version>
</dependency>
yml中引入sata配置信息
详情看server/resources下springCloud-example.yml
具体项目使用 A服务方加上注解@GlobalTransactional(rollbackFor = Exception.class)
注:多个服务要进行事务回滚,那么都应每个服务的表都加入“undo_log”
参考链接
https://blog.csdn.net/qq_33222798/article/details/128918225?spm=1001.2014.3001.5506