## 基于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中的配置 ![img.png](img.png) -- ![img_1.png](img_1.png) ##### 启动seata windows: 进入bin目录下,启动bat即可 linux: (如已经配置端口,可不指定端口) sh seata-server.sh -h 172.22.1.190 -p 8091 -m db ##### 页面展示 seata 页面 ![img_2.png](img_2.png) nacos 页面展示 ![img_3.png](img_3.png) #### 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中进行分组下进行新增配置 ![img_5.png](img_5.png) --- ##### 新建数据库表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进行页面查看 ![img_2.png](img_2.png) nacos 页面展示 ![img_3.png](img_3.png) ### 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坐标 com.alibaba.cloud spring-cloud-starter-alibaba-seata io.seata seata-spring-boot-starter io.seata seata-all io.seata seata-spring-boot-starter 1.6.1 ---- #### 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