分布式事務框架 Seata 入門案例

1.  Seata Server 部署
Seata分TC、TM和RM三個角色,TC(Server端)為單獨服務端部署 , TM和RM(Client端)由業務系統集成 。
首先,下載最新的安裝包

分布式事務框架 Seata 入門案例

文章插圖
也可以下載源碼,然后本地編譯 。最新的版本是1.5.2

分布式事務框架 Seata 入門案例

文章插圖
下載后的啟動包(或者源碼)中有個scripts目錄,里面有各種我們所需的腳本
分布式事務框架 Seata 入門案例

文章插圖
Server端存儲模式(store.mode)現有file、db、redis三種:
  • file模式為單機模式,全局事務會話信息內存中讀寫并持久化本地文件root.data,性能較高;(不推薦)
  • db模式為高可用模式,全局事務會話信息通過db共享 , 相應性能差些;
  • redis模式Seata-Server 1.3及以上版本支持,性能較高,存在事務信息丟失風險,請提前配置合適當前場景的redis持久化配置;
修改配置文件
  • 啟動包:seata-->conf-->application.yml
  • 源碼包:根目錄-->seata-server-->resources-->application.yml
主要修改的點是:
  • 修改store.mode="db或者redis"
  • 修改seata.config、seata.registry
  • 修改數據庫連接|redis屬性配置
在資源目錄還有一個application.example.yml文件 , application.example.yml中附帶額外配置,可以將其db|redis相關配置復制至application.yml , 進行修改store.db或store.redis相關屬性 。
分布式事務框架 Seata 入門案例

文章插圖
如果不使用外部配置中心,直接使用本地文件配置的話 , 那么最簡單的配置可能是這樣的:
server:port: 7091spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${user.home}/logs/seataextend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstashconsole:user:username: seatapassword: seataseata:config:type: fileregistry:type: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848group: SEATA_GROUPnamespace:cluster: defaultstore:mode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true&useUnicode=true&serverTimezone=Asia/Shanghaiuser: rootpassword: 123456min-conn: 5max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 100max-wait: 5000security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login更多配置請參見 https://seata.io/zh-cn/docs/user/configurations.html
這里面哪些是Server端需要配置的,哪些是Client端需要配置的,以及每個參數的含義都解釋得非常詳細,強烈建議看一下,這里就不在贅述 。
此處注冊中心用nacos
https://nacos.io/zh-cn/index.html
分布式事務框架 Seata 入門案例

文章插圖
建表(默認數據庫是seata)
USE `seata`;-- -------------------------------- The script used when storeMode is 'db' ---------------------------------- the table to store GlobalSession dataCREATE TABLE IF NOT EXISTS `global_table`(`xid`VARCHAR(128) NOT NULL,`transaction_id`BIGINT,`status`TINYINTNOT NULL,`application_id`VARCHAR(32),`transaction_service_group` VARCHAR(32),`transaction_name`VARCHAR(128),`timeout`INT,`begin_time`BIGINT,`application_data`VARCHAR(2000),`gmt_create`DATETIME,`gmt_modified`DATETIME,PRIMARY KEY (`xid`),KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),KEY `idx_transaction_id` (`transaction_id`)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '全局事務表';-- the table to store BranchSession dataCREATE TABLE IF NOT EXISTS `branch_table`(`branch_id`BIGINTNOT NULL,`xid`VARCHAR(128) NOT NULL,`transaction_id`BIGINT,`resource_group_id` VARCHAR(32),`resource_id`VARCHAR(256),`branch_type`VARCHAR(8),`status`TINYINT,`client_id`VARCHAR(64),`application_data`VARCHAR(2000),`gmt_create`DATETIME(6),`gmt_modified`DATETIME(6),PRIMARY KEY (`branch_id`),KEY `idx_xid` (`xid`)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '分支事務表';-- the table to store lock dataCREATE TABLE IF NOT EXISTS `lock_table`(`row_key`VARCHAR(128) NOT NULL,`xid`VARCHAR(128),`transaction_id` BIGINT,`branch_id`BIGINTNOT NULL,`resource_id`VARCHAR(256),`table_name`VARCHAR(32),`pk`VARCHAR(36),`status`TINYINTNOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',`gmt_create`DATETIME,`gmt_modified`DATETIME,PRIMARY KEY (`row_key`),KEY `idx_status` (`status`),KEY `idx_branch_id` (`branch_id`),KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '全局鎖表';CREATE TABLE IF NOT EXISTS `distributed_lock`(`lock_key`CHAR(20) NOT NULL,`lock_value`VARCHAR(20) NOT NULL,`expire`BIGINT,primary key (`lock_key`)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);

推薦閱讀