分布式事务解决方案seata架构的安装摆设(AT模式)

打印 上一主题 下一主题

主题 1014|帖子 1014|积分 3042

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.介绍

seata官网:Seata 是什么? | Apache Seata
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简朴易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案
在Seata的事务管理中有三个紧张的脚色:


  • TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
  • TM (Transaction Manager) - 事务管理器:界说全局事务的范围、开始全局事务、提交或回滚全局事务。
  • RM (Resource Manager) - 资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

其中,TMRM可以理解为Seata的客户端部分,引入到参与事务的微服务依赖中即可。将来TMRM就会帮忙微服务,实现本地分支事务与TC之间交互,实现事务的提交或回滚。而TC服务则是事务协调中心,是一个独立的微服务,需要单独摆设。





2.摆设TC服务

2.1 导入数据库表

Seata支持多种存储模式,但考虑到持久化的需要,我们一般选择基于数据库存储。因此需要创建一个数据库‘seata’,运行一下sql命令。
  1. CREATE DATABASE IF NOT EXISTS `seata`;
  2. USE `seata`;
  3. CREATE TABLE IF NOT EXISTS `global_table`
  4. (
  5.     `xid`                       VARCHAR(128) NOT NULL,
  6.     `transaction_id`            BIGINT,
  7.     `status`                    TINYINT      NOT NULL,
  8.     `application_id`            VARCHAR(32),
  9.     `transaction_service_group` VARCHAR(32),
  10.     `transaction_name`          VARCHAR(128),
  11.     `timeout`                   INT,
  12.     `begin_time`                BIGINT,
  13.     `application_data`          VARCHAR(2000),
  14.     `gmt_create`                DATETIME,
  15.     `gmt_modified`              DATETIME,
  16.     PRIMARY KEY (`xid`),
  17.     KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
  18.     KEY `idx_transaction_id` (`transaction_id`)
  19. ) ENGINE = InnoDB
  20.   DEFAULT CHARSET = utf8mb4;
  21. CREATE TABLE IF NOT EXISTS `branch_table`
  22. (
  23.     `branch_id`         BIGINT       NOT NULL,
  24.     `xid`               VARCHAR(128) NOT NULL,
  25.     `transaction_id`    BIGINT,
  26.     `resource_group_id` VARCHAR(32),
  27.     `resource_id`       VARCHAR(256),
  28.     `branch_type`       VARCHAR(8),
  29.     `status`            TINYINT,
  30.     `client_id`         VARCHAR(64),
  31.     `application_data`  VARCHAR(2000),
  32.     `gmt_create`        DATETIME(6),
  33.     `gmt_modified`      DATETIME(6),
  34.     PRIMARY KEY (`branch_id`),
  35.     KEY `idx_xid` (`xid`)
  36. ) ENGINE = InnoDB
  37.   DEFAULT CHARSET = utf8mb4;
  38. CREATE TABLE IF NOT EXISTS `lock_table`
  39. (
  40.     `row_key`        VARCHAR(128) NOT NULL,
  41.     `xid`            VARCHAR(128),
  42.     `transaction_id` BIGINT,
  43.     `branch_id`      BIGINT       NOT NULL,
  44.     `resource_id`    VARCHAR(256),
  45.     `table_name`     VARCHAR(32),
  46.     `pk`             VARCHAR(36),
  47.     `status`         TINYINT      NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
  48.     `gmt_create`     DATETIME,
  49.     `gmt_modified`   DATETIME,
  50.     PRIMARY KEY (`row_key`),
  51.     KEY `idx_status` (`status`),
  52.     KEY `idx_branch_id` (`branch_id`),
  53.     KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)
  54. ) ENGINE = InnoDB
  55.   DEFAULT CHARSET = utf8mb4;
  56. CREATE TABLE IF NOT EXISTS `distributed_lock`
  57. (
  58.     `lock_key`       CHAR(20) NOT NULL,
  59.     `lock_value`     VARCHAR(20) NOT NULL,
  60.     `expire`         BIGINT,
  61.     primary key (`lock_key`)
  62. ) ENGINE = InnoDB
  63.   DEFAULT CHARSET = utf8mb4;
  64. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
  65. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
  66. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
  67. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
复制代码
2.2.准备配置文件

创建一个seata文件夹,在该文件夹下创建一个application.yml文件,写入配置信息,例:
  1. server:
  2.   port: 7099
  3. spring:
  4.   application:
  5.     name: seata-server
  6. logging:
  7.   config: classpath:logback-spring.xml
  8.   file:
  9.     path: ${user.home}/logs/seata
  10.   extend:
  11.     logstash-appender:
  12.       destination: 127.0.0.1:4560
  13.     kafka-appender:
  14.       bootstrap-servers: 127.0.0.1:9092
  15.       topic: logback_to_logstash
  16. seata:
  17.   config:
  18.     # support: nacos 、 consul 、 apollo 、 zk  、 etcd3
  19.     type: file
  20.     nacos:
  21.       server-addr: 127.0.0.1:8848
  22.       namespace:
  23.       group: SEATA_GROUP
  24.       username:
  25.       password:
  26.       data-id: seataServer.properties
  27.     consul:
  28.       server-addr: 127.0.0.1:8500
  29.       acl-token:
  30.       key: seata.properties
  31.     apollo:
  32.       appId: seata-server
  33.       apollo-meta: http://192.168.1.204:8801
  34.       apollo-config-service: http://192.168.1.204:8080
  35.       namespace: application
  36.       apollo-access-key-secret:
  37.       cluster: seata
  38.     zk:
  39.       server-addr: 127.0.0.1:2181
  40.       session-timeout: 6000
  41.       connect-timeout: 2000
  42.       username:
  43.       password:
  44.       node-path: /seata/seata.properties
  45.     etcd3:
  46.       server-addr: http://localhost:2379
  47.       key: seata.properties
  48.   registry:
  49.     # support: nacos 、 eureka 、 redis 、 zk  、 consul 、 etcd3 、 sofa
  50.     type: file
  51.     preferred-networks: 30.240.*
  52.     nacos:
  53.       application: seata-server
  54.       server-addr: 127.0.0.1:8848
  55.       group: SEATA_GROUP
  56.       namespace:
  57.       cluster: default
  58.       username:
  59.       password:
  60.     eureka:
  61.       service-url: http://localhost:8761/eureka
  62.       application: default
  63.       weight: 1
  64.     redis:
  65.       server-addr: localhost:6379
  66.       db: 0
  67.       password:
  68.       cluster: default
  69.       timeout: 0
  70.     zk:
  71.       cluster: default
  72.       server-addr: 127.0.0.1:2181
  73.       session-timeout: 6000
  74.       connect-timeout: 2000
  75.       username: ""
  76.       password: ""
  77.     consul:
  78.       cluster: default
  79.       server-addr: 127.0.0.1:8500
  80.       acl-token:
  81.     etcd3:
  82.       cluster: default
  83.       server-addr: http://localhost:2379
  84.     sofa:
  85.       server-addr: 127.0.0.1:9603
  86.       application: default
  87.       region: DEFAULT_ZONE
  88.       datacenter: DefaultDataCenter
  89.       cluster: default
  90.       group: SEATA_GROUP
  91.       address-wait-time: 3000
  92.   server:
  93.     service-port: 8091 #If not configured, the default is '${server.port} + 1000'
  94.     max-commit-retry-timeout: -1
  95.     max-rollback-retry-timeout: -1
  96.     rollback-retry-timeout-unlock-enable: false
  97.     enableCheckAuth: true
  98.     retryDeadThreshold: 130000
  99.     recovery:
  100.       committing-retry-period: 1000
  101.       asyn-committing-retry-period: 1000
  102.       rollbacking-retry-period: 1000
  103.       timeout-retry-period: 1000
  104.     undo:
  105.       log-save-days: 7
  106.       log-delete-period: 86400000
  107.   store:
  108.     # support: file 、 db 、 redis
  109.     mode: file
  110.     session:
  111.       mode: file
  112.     lock:
  113.       mode: file
  114.     file:
  115.       dir: sessionStore
  116.       max-branch-session-size: 16384
  117.       max-global-session-size: 512
  118.       file-write-buffer-cache-size: 16384
  119.       session-reload-read-size: 100
  120.       flush-disk-mode: async
  121.     db:
  122.       datasource: druid
  123.       db-type: mysql
  124.       driver-class-name: com.mysql.jdbc.Driver
  125.       url: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true
  126.       user: mysql
  127.       password: mysql
  128.       min-conn: 5
  129.       max-conn: 100
  130.       global-table: global_table
  131.       branch-table: branch_table
  132.       lock-table: lock_table
  133.       distributed-lock-table: distributed_lock
  134.       query-limit: 100
  135.       max-wait: 5000
  136.     redis:
  137.       mode: single
  138.       database: 0
  139.       min-conn: 1
  140.       max-conn: 10
  141.       password:
  142.       max-total: 100
  143.       query-limit: 100
  144.       single:
  145.         host: 127.0.0.1
  146.         port: 6379
  147.       sentinel:
  148.         master-name:
  149.         sentinel-hosts:
  150.   metrics:
  151.     enabled: false
  152.     registry-type: compact
  153.     exporter-list: prometheus
  154.     exporter-prometheus-port: 9898
复制代码
本身更改端口号、nacos地址和数据库地址、暗码即可。将整个seata文件夹拷贝到假造机的/root目次
2.3 Docker摆设

需要注意,要确保nacos、mysql都在同一个Docker网络中。如果某个容器不在Docker网络,可以参考下面的命令将某容器加入指定网络:
  1. docker network connect [网络名] [容器名]
复制代码
可以使用以下命令检查某个容器在哪个网络,
  1. docker inspect [容器名]
复制代码
例如:我使用 docker inspect mysql ,,可以看到该容器在“elk”网络中

在假造机的/root目次执行下面的命令:,将Docker网络和上面配置信息的ip地址改成本身对应的
  1. docker run --name seata \
  2. -p 8099:8099 \
  3. -p 7099:7099 \
  4. -e SEATA_IP=172.0.0.1 \
  5. -v ./seata:/seata-server/resources \
  6. --privileged=true \
  7. --network elk \
  8. -d \
  9. seataio/seata-server:1.5.2
复制代码


安装完成后可以通过欣赏器访问127.0.0.1:1099 进入seata界面,初次登录账号暗码都是admin

进入后可以看到事务的信息和一些锁的信息:

3.微服务集成Seata

3.1 引入依赖

为了方便各个微服务集成seata,我们需要把seata配置共享到nacos,因此模块不仅仅要引入seata依赖,还要引入nacos依赖:
  1. <!--统一配置管理-->
  2.   <dependency>
  3.       <groupId>com.alibaba.cloud</groupId>
  4.       <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  5.   </dependency>
  6.   <!--读取bootstrap文件-->
  7.   <dependency>
  8.       <groupId>org.springframework.cloud</groupId>
  9.       <artifactId>spring-cloud-starter-bootstrap</artifactId>
  10.   </dependency>
  11.   <!--seata-->
  12.   <dependency>
  13.       <groupId>com.alibaba.cloud</groupId>
  14.       <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
  15.   </dependency>
复制代码
3.2 改造配置

在nacos上添加一个共享的seata配置,命名为shared-seata.yaml
将nacos ip地址改成本身的
  1. seata:
  2.   registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
  3.     type: nacos # 注册中心类型 nacos
  4.     nacos:
  5.       server-addr: 127.0.0.1:8848 # nacos地址 ,ip改成自己服务器地址
  6.       namespace: "" # namespace,默认为空
  7.       group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP
  8.       application: seata-server # seata服务名称
  9.       username: nacos
  10.       password: nacos
  11.   tx-service-group: hmall # 事务组名称
  12.   service:
  13.     vgroup-mapping: # 事务组与tc集群的映射关系
  14.       hmall: "default"
复制代码
然后,改造模块,添加bootstrap.yaml
  1. spring:
  2.   application:
  3.     name: trade-service # 服务名称
  4.   profiles:
  5.     active: dev
  6.   cloud:
  7.     nacos:
  8.       server-addr: 172.0.0.1:8848 # nacos地址
  9.       config:
  10.         file-extension: yaml # 文件后缀名
  11.         shared-configs: # 共享配置
  12.           - dataId: shared-jdbc.yaml # 共享mybatis配置
  13.           - dataId: shared-log.yaml # 共享日志配置
  14.           - dataId: shared-swagger.yaml # 共享日志配置
  15.           - dataId: shared-seata.yaml # 共享seata配置
复制代码
再改造application.yaml文件,将重复的部分删掉
3.3添加数据库

在涉及分布式事务的微服务的数据库中运行下面sql语句=>创建undo_log表格
  1. -- for AT mode you must to init this sql for you business database. the seata server not need it.
  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
  13.   AUTO_INCREMENT = 1
  14.   DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';
复制代码
3.4实现方法:

在涉及分布式事务的业务代码上加上Seata提供的@GlobalTransactional注解即可
   @GlobalTransactional
  在配置文件中指定要采用的分布式事务模式。我们可以在Nacos中的共享shared-seata.yaml配置文件中设置:
  1. seata:
  2.   data-source-proxy-mode: XA
复制代码

 JDK17运行报错可以见:JDK17运行seata发生报错Error creating bean with name ‘globalTransactionScanner‘的解决方案-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表