SOURCE_MODIFICATION.md 8.6 KB

基于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_1.png

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

img_2.png

nacos 页面展示

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


新建数据库表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 nacos 页面展示 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坐标

     <!-- 注意一定要引入对版本,要引入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