本项目演示如何使用 Seata Starter 完成 Spring Cloud 应用的分布式事务接入。
Seata 是 阿里巴巴 开源的 分布式事务中间件,以 高效 并且对业务 0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题。
在运行此示例之前,你需要先完成如下几步准备工作:
配置数据库
创建 UNDO_LOG 表
创建 示例中 业务所需要的数据库表
启动 Seata Server
首先,你需要有一个支持 InnoDB 引擎的 MySQL 数据库。
注意: 实际上,Seata 支持不同的应用使用完全不相干的数据库,但是这里为了简单地演示一个原理,所以我们选择了只使用一个数据库。
将 seata-order
、seata-product
这两个应用中的 resources 目录下的 application.yml
文件中的如下配置修改成你运行环境中的实际配置。
seata-order
server:
port: 8085
spring:
datasource:
url: jdbc:mysql://localhost:3306/db_order
driver-class-name: com.mysql.cj.jdbc.Driver
username: seata
password: seata
cloud:
alibaba:
seata:
tx-service-group: seata-order
application:
name: seata-order
seata:
service:
vgroup-mapping:
seata-order: default
grouplist:
default: 127.0.0.1:8091
seata-product
server:
port: 8086
spring:
datasource:
url: jdbc:mysql://localhost:3306/db_product
driver-class-name: com.mysql.cj.jdbc.Driver
username: seata
password: seata
cloud:
alibaba:
seata:
tx-service-group: seata-product
application:
name: seata-product
Seata AT 模式 需要使用到 undo_log 表。
-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
db_product
CREATE TABLE `t_product` (
`product_id` bigint(20) unsigned NOT NULL,
`count` int(11) DEFAULT NULL,
PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
点击这个页面 https://github.com/seata/seata/releases,下载最新版本的 Seata Server 端.
进入解压之后的 bin 目录,执行如下命令来启动, 所有启动参数为可选项。
sh seata-server.sh -p $LISTEN_PORT -m $MODE(file or db) -h $HOST -e $ENV
-p seata-server 监听服务端口号
-m 存储模式,可选值:file、db。file 用于单点模式,db用于ha模式,当使用db存储模式,需要修改配置中store配置节点的数据库配置,同时在数据库中初始化global_table、branch_table和
lock_table
-h 用于解决seata-server和业务侧跨网络问题,其配置的host值直接显示到注册中心的服务可用地址host,当跨网络时这里需要配置为公网IP或NATIP,若都在同一局域网则无需配置
-e 用于解决多环境配置中心隔离问题
在这个示例中,采用如下命令来启动 Seata Server
sh seata-server.sh -p 8091 -m file
注意 如果你修改了endpoint且注册中心使用默认file类型,那么记得需要在各个示例工程中的 file.conf
文件中,修改 grouplist 的值(当registry.conf 中registry.type 或 config.type 为file 时会读取内部的file节点中的文件名,若type不为file将直接从配置类型的对应元数据的注册配置中心读取数据),推荐大家使用 nacos 作为配置注册中心。
分别运行 seata-order
、seata-product
这两个应用的,启动示例。
启动示例后,通过 HTTP 的 GET 方法访问如下两个 URL,可以分别验证在订单创建失败的情况下,库存的扣减情况。
http://127.0.0.1:8805/create
Release Train | Boot version |
---|---|
2020.0.x aka Ilford | 2.4.x, 2.5.x (Starting with 2020.0.3) |
Hoxton | 2.2.x, 2.3.x (Starting with SR5) |
Greenwich | 2.1.x |
Finchley | 2.0.x |
Edgware | 1.5.x |
Dalston | 1.5.x |
通过 Spring MVC 提供服务的服务提供者,在收到 header 中含有 Seata 信息的 HTTP 请求时,可以自动还原 Seata 上下文。
支持服务调用者通过 RestTemplate 调用时,自动传递 Seata 上下文。
支持服务调用者通过 FeignClient 调用时,自动传递 Seata 上下文。
支持 SeataClient 和 Hystrix 同时使用的场景。
支持 SeataClient 和 Sentinel 同时使用的场景。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。