1.下载seata

下载地址:https://github.com/seata/seata/releases
image.png
如图,可选择对应版本进行下载。需要注意的是,我们需要下载两个内容

server.zip

seata服务端,需要进行对应的配置修改以及服务端启动
image.png

  • bin:用于存放 Seata Server 可执行命令。
  • conf:用于存放 Seata Server 的配置文件。
  • lib:用于存放 Seata Server 依赖的各种 Jar 包。
  • logs:用于存放 Seata Server 的日志。

    source code

    seata源码,需要获取script\config-center\config.txt配置文件内的内容,进行配置文件上传,以便seata整合第三方配置中心例如nacos等
    image.png

    2.seata配置中心

    为什么需要配置中心

    对于seata的服务端以及客户端来说,都需要进行一些参数配置。
    而对于这些配置的存储,seata提供了6种方案支持。具体可通过查看sertver.zip下seata\conf\registry.conf文件中的config项进行查看
    image.png
    如图,默认为file类型,然而在具体使用中,我们通常会使用第三方配置中心来存储seata的配置,因为毕竟本地文件的存储形式不利于实时配置,配置性太弱,无法应对各种突发情况

    整合nacos

    配置上传到nacos

    seata提供了很多配置参数,具体参考这里。因为需要整合第三方配置中心,所以我们需要先将参数上传到对应的配置中心。seata为我们提供了配置上传的方式
  1. 打开source code\script\config-center\config.txt文件,里面包括了seata所需的所有参数,我们可以根据具体业务情况进行删减,以DB作为存储模式的配置文件如下,需要注意的是,如果连接的mysql版本低于8.0.0,需要将driverClassName改为com.mysql.jdbc.Driver ``` store.mode=db

store.db.datasource=druid store.db.dbType=mysql store.db.driverClassName=com.mysql.cj.jdbc.Driver store.db.url=jdbc:mysql://8.142.132.135:3306/seata_test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true store.db.user=root store.db.password=root store.db.minConn=5 store.db.maxConn=30 store.db.globalTable=global_table store.db.branchTable=branch_table store.db.queryLimit=100 store.db.lockTable=lock_table store.db.maxWait=5000

  1. 2. source code\script\config-center\nacos目录下,右键打开git bush here
  2. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/28218714/1656249690311-5d9bb3f2-29b3-4524-b00a-9ec28a2a5565.png#clientId=u5321f507-cee0-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=481&id=u7262b230&margin=%5Bobject%20Object%5D&name=image.png&originHeight=721&originWidth=1099&originalType=binary&ratio=1&rotation=0&showTitle=false&size=53087&status=done&style=none&taskId=u8041ab74-082b-4ab7-b3d8-8a3b454f828&title=&width=732.6666666666666)
  3. 3. git命令行输入如下命令
  4. ```shell
  5. sh nacos-config.sh -h 8.142.132.135 -p 8848 -g SEATA_GROUP -u nacos -w nacos
  • -h:Nacos 的 host,默认取值为 localhost
  • -p:端口号,默认取值为 8848
  • -g:Nacos 配置的分组,默认取值为 SEATA_GROUP
  • -u:Nacos 用户名
  • -w:Nacos 密码
  1. 出现如图所示,代表配置上传成功

image.png

  1. nacos查看,配置已上传成功

image.png

seata服务端

配置已经上传到了nacos,接下来需要配置seata服务端,改为nacos作为配置中心
修改配置文件sertver.zip下seata\conf\registry.conf文件中的config项

  1. config {
  2. type = "nacos"
  3. nacos {
  4. serverAddr = "8.142.132.135:8848"
  5. namespace = ""
  6. group = "SEATA_GROUP"
  7. username = "nacos"
  8. password = "nacos"
  9. dataId = "seataServer.properties"
  10. }
  11. }

seata客户端

配置已经上传到了nacos,接下来需要配置seata客户端,改为nacos作为配置中心

  1. 添加pom文件

    1. <!--引入 seata 依赖-->
    2. <dependency>
    3. <groupId>com.alibaba.cloud</groupId>
    4. <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    5. </dependency>
  2. yml文件添加如下配置,通常来说客户端配置与服务端配置是一致的

    1. seata:
    2. config:
    3. type: nacos
    4. nacos:
    5. server-addr: 8.142.132.135:8848
    6. group : "SEATA_GROUP"
    7. namespace: ""
    8. username: "nacos"
    9. password: "nacos"

    3.seata注册中心

    为什么需要注册中心

    因为在具体seata分布式事务的执行过程中,RM(参与事务的微服务)需要接收TC(seata服务端)发出的调度指令,并且TC也需要获取RM的反馈。那么TC也需要将自己的服务信息注册到注册中心上,才方便上述机制的实现
    对于配置中心,seata支持8种方案,具体可通过查看sertver.zip下seata\conf\registry.conf文件中的registry项进行查看。
    image.png
    如图,默认为file。在实际应用中,通常需要结合第三方注册中心来实现

    整合nacos

    seata服务端

    修改配置文件sertver.zip下seata\conf\registry.conf文件中的registry项

    1. registry {
    2. type = "nacos"
    3. nacos {
    4. application = "seata-server"
    5. serverAddr = "8.142.132.135:8848"
    6. group = "SEATA_GROUP"
    7. namespace = ""
    8. cluster = "default"
    9. username = "nacos"
    10. password = "nacos"
    11. }
    12. }

    seata客户端

  3. 添加pom文件

    1. <!--引入 seata 依赖-->
    2. <dependency>
    3. <groupId>com.alibaba.cloud</groupId>
    4. <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    5. </dependency>
  4. yml文件添加如下配置,客户端配置与服务端配置必须一致,不然找不到对应服务。注意其中的application项,必须与服务端保持一致

    1. seata:
    2. registry:
    3. type: nacos
    4. nacos:
    5. application: seata-server
    6. server-addr: 8.142.132.135:8848
    7. group : "SEATA_GROUP"
    8. namespace: ""
    9. username: "nacos"
    10. password: "nacos"

    4.Seata事务分组

    为什么需要事务分组

    事务分组是 Seata 提供的一种 TC(Seata Server) 服务查找机制。具体参考这里
    因为seata服务端是需要依赖于注册中心去运行的,因此对于seata服务端来说,需要一个服务名声明自己的服务
    而事务分组在服务名上又多加了一个层级,这样设计后,事务分组可以作为资源的逻辑隔离单位,出现某集群故障时可以快速failover,只切换对应分组,可以把故障缩减到服务级别

    客户端查找TC集群原理

    通过事务分组获取服务名,共需要以下 3 步:

  5. 客户端服务启动时,从配置文件中获取服务分组的名称;

  6. 从配置中心,通过事务分组名获取 TC 集群名;
  7. 根据 TC 群组名以及其他信息构建服务名,获取真实的 TC 服务列表。

    事务分组架构理解

    企业微信截图_16563863763120.png

    操作步骤

    定义事务分组以及应用集群名称配置

    在source code\script\config-center\config.txt文件中,输入如下内容
    如下图,指定了service-order-group、service-item-group3个分组对应的集群名为store-seata

    1. service.vgroupMapping.service-order-group=store-seata
    2. service.vgroupMapping.service-item-group=store-seata
    3. service.vgroupMapping.service-account-group=store-seata

    上传配置到nacos配置中心

    参考标题2即可

    seata服务端声明服务集群名称

    修改配置文件sertver.zip下seata\conf\registry.conf文件中的registry.cluster字段

    1. registry {
    2. type = "nacos"
    3. nacos {
    4. application = "seata-server"
    5. serverAddr = "8.142.132.135:8848"
    6. group = "SEATA_GROUP"
    7. namespace = ""
    8. cluster = "store-seata"
    9. username = "nacos"
    10. password = "nacos"
    11. }
    12. }

    seata客户端声明事务分组

  8. 添加pom文件

    1. <!--引入 seata 依赖-->
    2. <dependency>
    3. <groupId>com.alibaba.cloud</groupId>
    4. <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    5. </dependency>
  9. yml文件添加如下配置,客户端配置与服务端配置必须一致,不然找不到对应服务

    1. spring:
    2. cloud:
    3. alibaba:
    4. seata:
    5. tx-service-group: service-order-group

    5.启动seata server/client的前提

    在上述阶段,我们完成了以下步骤

  10. seata server相关配置上传到配置中心

  11. seata server配置中心配置
  12. seata server注册中心配置
  13. 声明了事务分组与集群名称的对应关系
  14. seata server配置集群名称

接下来就需要启动seata server了,启动seata server,我们还需要在对应的存储中心创建相关存储结构,通常来讲以数据库为例

打开README文件

文件路径:seata.zip\conf\README-zh.md
image.png
其中第1项即为seata server保存模式为DB时,客户端启动所需的建表语句
其中第2项即为seata server保存模式为DB时,服务端启动所需的建表语句

客户端启动sql文件

  1. -- 回滚日志表
  2. CREATE TABLE IF NOT EXISTS `undo_log`
  3. (
  4. `branch_id` BIGINT NOT NULL COMMENT 'branch transaction id',
  5. `xid` VARCHAR(128) NOT NULL COMMENT 'global transaction id',
  6. `context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
  7. `rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info',
  8. `log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status',
  9. `log_created` DATETIME(6) NOT NULL COMMENT 'create datetime',
  10. `log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime',
  11. UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
  12. ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';

服务端启动sql文件

  1. -- 全局事务表
  2. CREATE TABLE IF NOT EXISTS `global_table`
  3. (
  4. `xid` VARCHAR(128) NOT NULL,
  5. `transaction_id` BIGINT,
  6. `status` TINYINT NOT NULL,
  7. `application_id` VARCHAR(32),
  8. `transaction_service_group` VARCHAR(32),
  9. `transaction_name` VARCHAR(128),
  10. `timeout` INT,
  11. `begin_time` BIGINT,
  12. `application_data` VARCHAR(2000),
  13. `gmt_create` DATETIME,
  14. `gmt_modified` DATETIME,
  15. PRIMARY KEY (`xid`),
  16. KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
  17. KEY `idx_transaction_id` (`transaction_id`)
  18. ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
  19. -- 分支事务表
  20. CREATE TABLE IF NOT EXISTS `branch_table`
  21. (
  22. `branch_id` BIGINT NOT NULL,
  23. `xid` VARCHAR(128) NOT NULL,
  24. `transaction_id` BIGINT,
  25. `resource_group_id` VARCHAR(32),
  26. `resource_id` VARCHAR(256),
  27. `branch_type` VARCHAR(8),
  28. `status` TINYINT,
  29. `client_id` VARCHAR(64),
  30. `application_data` VARCHAR(2000),
  31. `gmt_create` DATETIME(6),
  32. `gmt_modified` DATETIME(6),
  33. PRIMARY KEY (`branch_id`),
  34. KEY `idx_xid` (`xid`)
  35. ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
  36. -- 全局锁表
  37. CREATE TABLE IF NOT EXISTS `lock_table`
  38. (
  39. `row_key` VARCHAR(128) NOT NULL,
  40. `xid` VARCHAR(128),
  41. `transaction_id` BIGINT,
  42. `branch_id` BIGINT NOT NULL,
  43. `resource_id` VARCHAR(256),
  44. `table_name` VARCHAR(32),
  45. `pk` VARCHAR(36),
  46. `status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
  47. `gmt_create` DATETIME,
  48. `gmt_modified` DATETIME,
  49. PRIMARY KEY (`row_key`),
  50. KEY `idx_status` (`status`),
  51. KEY `idx_branch_id` (`branch_id`),
  52. KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)
  53. ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
  54. -- 分布式锁表
  55. CREATE TABLE IF NOT EXISTS `distributed_lock`
  56. (
  57. `lock_key` CHAR(20) NOT NULL,
  58. `lock_value` VARCHAR(20) NOT NULL,
  59. `expire` BIGINT,
  60. primary key (`lock_key`)
  61. ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
  62. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
  63. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
  64. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
  65. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);

6.seata server启动

以下两种情况都是基于按步骤走完以上流程的情况下去部署的!!!!!!!!!

windows

经过配置上传,修改配置中心,修改注册中心,修改集群名称,建立sql表以后,seata server就可以运行了
进入server.zip/bin目录下,运行seata-server.bat即可
如图,seata服务端启动成功,默认端口8091
image.png

linux

新建文件夹

  1. cd /data
  2. mkdir seata
  3. cd /seata

    下载对应jar包,具体下载参考标题1

    参考:wget https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.tar.gz

    解压缩

  4. tar -zxvf seata-server-1.4.2.tar.gz

  5. rm -rf seata-server-1.4.2.tar.gz
  6. mkdir logs
  7. ls

image.png

修改配置文件

执行如下命令:vim seata-server-1.4.2/conf/registry.conf
输入如下内容,具体参考上述2,3标题

  1. config {
  2. type = "nacos"
  3. nacos {
  4. serverAddr = "8.142.132.135:8848"
  5. namespace = ""
  6. group = "SEATA_GROUP"
  7. username = "nacos"
  8. password = "nacos"
  9. dataId = "seataServer.properties"
  10. }
  11. }
  12. registry {
  13. type = "nacos"
  14. nacos {
  15. application = "linux-seata-server"
  16. serverAddr = "8.142.132.135:8848"
  17. group = "SEATA_GROUP"
  18. namespace = ""
  19. cluster = "default"
  20. username = "nacos"
  21. password = "nacos"
  22. }
  23. }

内存不足情况下修改sh文件

seata-server服务器启动的默认虚拟机参数对内存要求是比较高的。有时候我们的服务器内存不足,这时候需要我们去修改启动.sh文件
执行如下命令:vim /data/seata/seata-server-1.4.2/bin/seata-server.sh
之后修改如下部分内容
image.png

编写supervisor文件管理seata-server进程

执行如下命令:touch /etc/supervisord.d/seata-server.ini
文件内容如下

  1. [program:seata-server]
  2. directory=/data/seata/seata-server-1.4.2/bin
  3. command=sh seata-server.sh -h 8.142.132.135 -p 8091 -m db
  4. autorestart=true
  5. redirect_stderr=true
  6. stdout_logfile=/data/seata/logs/seata-server.log

其中包括以下几点

  1. sh命令后面,如果说具体项目部署不是在内网的话,-h参数一定要是外网IP!!!!!!!。不然项目启动后,无法连接到内网IP。
  2. 最好指定日志文件路径

执行如下命令更新supervisor:supervisorctl update
如图:项目启动成功
image.png

连接测试

启动外部项目,出现如下日志:RM和TM注册成功
image.png

7.seata的全局架构理解(DB模式)

image.png