## 基于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
    2：参考文档：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坐标
         <!-- 注意一定要引入对版本，要引入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