一、准备阶段
示例项目使用了阿里系的框架套餐:
- SpringCloud Alibaba
2.2.8.RELEASE - Spring Boot
2.3.12.RELEASE - Nacos
2.1.0 - Seata
1.5.1 - Dubbo
2.7.15(seata1.5.1与dubbo3.0.9不兼容,降级dubbo2.7.15) - MySQL驱动
8.0.18
Seata体系中的角色定义
官方直通车:seata.io/zh-cn/docs/…
人话补充:
TC(Server端)单独服务端部署,安装包seata-server从官方下载。
TM和RM(Client端)由业务系统集成。TM为发起服务调用的微服务,理解为聚合服务方。RM为服务被调用方的微服务,理解为下级服务提供方。
事务分组和集群
自我分析:分组和集群用于资源的归类和隔离,与全局事务的提交和回滚没有直接的关系。不论如何分组和集群,应保证业务微服务(TM和RM)在同一个seata-server集群内,即使用相同数据库下的lock_table表。
项目集成的大致步骤如下:
- 准备Seata-Server端环境(Windows单机)
- 业务数据库增补表
- 编写样例服务验证(来源官方sample)
二、搭建Server端环境
一)下载最新版的压缩包,并解压到任意路径
下载地址:github.com/seata/seata… 。本文讲解在windows环境,下载文件为seata-server-1.5.1.zip。(Linux环境请下载seata-server-1.5.1.tar.gz)
二)修改配置文件
配置文件:seata-server-1.5.1\seata\conf\application.yml。(同目录下的application.example.yml用于参考全配置项的样例文件)
seata:
config:
# support: nacos, consul, apollo, zk, etcd3
# type: file
type: nacos
nacos:
# 指定注册到nacos的命名空间ID,按实际情况修改
namespace: 31b2a597-6609-4627-9e24-c2a8a1e4aab6
# nacos的ip和端口号,按实际情况修改
server-addr: dev.yc.com:8858
# 加载nacos配置文件的默认组名
group: DEFAULT_GROUP
# 如果nacos登录和密码有变更,按实际环境修改
# username: nacos
# password: nacos
# 指定seata server和client端从naocs加载的更多配置项,文件名按实际情况修改,这里采用中间件名 + 集群名(区域)
dataId: seata-server-dg.yml
registry:
# support: nacos, eureka, redis, zk, consul, etcd3, sofa
# type: file
type: nacos
nacos:
# seata注册到nacos的服务名,可以按实际情况修改
application: seata-server
# nacos的ip和端口号,按实际情况修改
server-addr: dev.da.com:8858
# seata注册到nacos的分组名称
group: DEFAULT_GROUP
# seata注册到nacos的命名空间ID
namespace: 31b2a597-6609-4627-9e24-c2a8a1e4aab6
# seata-server的集群名称,这里使用了区域名,按实际情况修改
cluster: dg
# 注释掉下面配置项,该信息从nacos中seata-server-dg.yml获取
# store:
# support: file 、 db 、 redis
# mode: file
其它可以关注的配置项
server:
# springboot应用的端口号,http://127.0.0.1:7091
port: 7091
seata:
server:
# 注册到nacos的rpc端口号(netty server port)
service-port: 8091 #If not configured, the default is '${server.port} + 1000'
三)nacos新建seata配置文件
可以忽略通过界面创建的步骤,建议直接使用示例项目中的nacos-seata.sql脚本来代替,在您的nacos数据库中执行。
-
本演示项目把微服务和中间件的配置文件都放到了一个新的命名空间。大家请按实际情况使用已存在的命名空间,或者新建一个命名空间。(不同命名空间之间无法共用配置文件,同命名空间不同组名之间可以共用配置文件)
-
在seata命名空间下新建配置文件seata-server-dg.yml。
配置内容如下:
store:
# seata-server端选择数据库存储模式
mode: db
db:
# 阿里druid连接池
datasource: druid
# mysql数据库
dbType: mysql
# mysql8驱动类
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://dev.yc.com:3306/seata_server?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&rewriteBatchedStatements=true&autoReconnect=true&failOverReadOnly=false
user: root
# 密码需要前后加单引号
password: '123456'
minConn : 20
maxConn : 50
globalTable : global_table
branchTable : branch_table
lockTable : lock_table
# queryLimit : 100
maxWait : 5000
service:
vgroupMapping:
# 指定组名和集群名的绑定关系。组名可以按应用名称分组,该应用中所有的微服务都使用相同的组名。
demoGroup: dg
# 这里不同的组使用了相同的集群名,可以按实际情况指定seata-server端不同的集群名。
# demoGroup2: dg
其它更多的配置项,请参考官方地址:github.com/seata/seata…
本文采用手工方式,将所有配置项写到一个配置文件。也可以采用官方的脚本推送方式,但每一条配置项生成一个配置文件,感觉有些杂乱。(seata.io/zh-cn/docs/…)
Properties转换为YAML的方法:
- IDEA插件:Convert YAML and Properties File
- 在线网址:www.toyaml.com/index.html
四)新建seata_server数据库和表
CREATE DATABASE `seata_server` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
USE `seata_server`;
官方Server端SQL脚本地址(注意使用最新版本的脚本):github.com/seata/seata…
使用db/mysql.sql,在seata_server数据库中创建表。
五)启动seata-server(TC)
双击运行seata-server.bat(seata-server-1.5.1\seata\bin\seata-server.bat)
启动成功后,可以打开浏览器进入console界面。网址:http://127.0.0.1:7091,账户/密码:seata/seata
三、业务数据库增补表
官方Client端SQL脚本地址:github.com/seata/seata…
使用db/mysql.sql,在业务数据库中创建表。
本示例项目使用了两个数据库seata_order和seata_stock,初始化脚本为seata-demo-db.sql。
四、编写样例验证
本文示例使用了四个微服务,参考自官方示例:github.com/seata/seata…
示例项目地址:github.com/YuanChilde/…
下载后的操作步骤:
- 创建业务demo数据库,执行脚本seata-demo-db.sql
- 创建nacos配置文件,在您的nacos数据库中执行脚本nacos-seata.sql,并按实际情况修改application.yml、dubbo.yml和seata-server-dg.yml等文件中的数据库和nacos的连接信息
- 按实际情况修改seata-account-service、seata-order-service、seata-stock-service和seata-business项目里bootstrap.yml的nacos的连接信息
- 启动seata-account-service、seata-order-service、seata-stock-service和seata-business四个微服务
- 入口项目seata-business
API http://127.0.0.1:7010/business/dubbo/buy
POST
{
"userId": 1,
"commodityCode": "C201901140001",
"count": 2,
"amount": 4
}