赞
踩
Seata 服务器与传统服务器的使用方式不太一样,首先 Seata 服务器端先向注册中心(可以是 Nacos、Eureka、Etcd3、Consul、Zookeeper 等注册中心)注册。注册成功之后,客户端采用相同的配置去注册中心寻找 Seata 服务,从而实现 Java 客户端连接 Seata 服务器端。这与微服务注册服务拉取服务的思维方式相同。
下载 seata-server-2.0.0 并解压到一个指定位置
进入 seata/script/config-center
目录找到 config.txt 文件配置 nacos 的脚本
#Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional. # 因为我们使用的是数据库的方式,所以这里要改成 db store.mode=db store.lock.mode=file store.session.mode=file #Used for password encryption store.publicKey= #These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block. store.db.datasource=druid store.db.dbType=mysql store.db.driverClassName=com.mysql.jdbc.Driver store.db.url=jdbc:mysql://localhost:3306/seata?useUnicode=true&rewriteBatchedStatements=true store.db.user=username store.db.password=password store.db.minConn=5 store.db.maxConn=30 store.db.globalTable=global_table store.db.branchTable=branch_table store.db.distributedLockTable=distributed_lock store.db.queryLimit=100 store.db.lockTable=lock_table store.db.maxWait=5000 #Transaction routing rules configuration, only for the client # 这行很重要影响到客户端,如果不知道就是用默认配置 service.vgroupMapping.default_tx_group=default
创建对应的数据库,可根据自身情况进行选择
进入 seata/script/server/db
找到对应的数据库脚本,初始化数据库
进入 seata/conf
目录找到 application.yml 文件,进行如下配置
seata: config: # support: nacos, consul, apollo, zk, etcd3 type: nacos nacos: server-addr: 127.0.0.1:8848 # 该命令空间,是 Nacos 注册中心已经存在的哟 namespace: 28d63531-feeb-4692-8b5e-f2b2d684b9e3 group: SEATA_GROUP username: nacos password: nacos registry: # support: nacos, eureka, redis, zk, consul, etcd3, sofa type: nacos nacos: application: seata-server server-addr: 127.0.0.1:8848 group: SEATA_GROUP # 该命令空间,是 Nacos 注册中心已经存在的哟 namespace: 28d63531-feeb-4692-8b5e-f2b2d684b9e3 cluster: default username: nacos password: nacos
确保 Nacos 服务器已经启动,然后进入 seata/script/config-center/nacos
目录执行以下脚本(该脚本是向 nacos 配置中心注册 seata 所需的一些配置)
# 如果使用的是 linux 直接执行即可,如果使用的是 windows ,可使用 git-bash 终端执行该命令
# -h nacos ip 主机
# -p nacos 所在端口
# -g group 与上面配置保持一致
# -t namespace 与上面配置保持一致
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t ded91f4b-04df-4c19-8006-755505a27c5e
# 如果 windows 中安装了 python 也可使用 python 代替 bash 命令
进入 seata/bin
目录找到对应的操作系统脚本执行,运行 seata 服务器(在这之前需保证 nacos 服务器已经启动)
# windows 操作系统
./seata-server.bat
# linux 操作系统
sh seata-server.sh
引入对应依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.6</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2021.0.5.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!--seata starter--> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!--dubbo starter--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.2.10</version> </dependency> <!--注册中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>
application.yml 配置文件配置对应信息
# 微服务&注册中心&配置中心 spring: application: # 获取 pom 文件中的项目名称 name: @project.artifactId@ cloud: nacos: discovery: server-addr: 127.0.0.1:8848 password: nacos username: nacos config: server-addr: ${spring.cloud.nacos.discovery.server-addr} config: import: - optional:nacos:test.yml # 服务器端口配置 server: port: 8081 # dubbo 配置 dubbo: application: name: @project.artifactId@ qos-enable: true qos-port: 3333 protocol: name: dubbo port: -1 registry: address: nacos://localhost:8848 use-as-metadata-center: false use-as-config-center: false # seata 配置 # 以下配置一个都不能少,可以先完全按照这个配置来,之后测试没问题之后可根据需求增删 seata: # 在 seata/script/config-center/config.txt 文件中有一个 # service.vgroupMapping.default_tx_group=default 配置,需要和此处保持一致 tx-service-group: default_tx_group service: vgroup-mapping: default_tx_group: SH registry: type: nacos nacos: server-addr: ${spring.cloud.nacos.discovery.server-addr} # 命令空间需要与之前的服务器端,以及 nacos 的命令空间三者保持一致 namespace: 28d63531-feeb-4692-8b5e-f2b2d684b9e3 # 注册到注册中心的微服务名称 application: seata-server group: SEATA_GROUP # 如果 nacos 不存在用户密码,可以没有下面两项配置 username: nacos password: nacos config: type: nacos nacos: server-addr: ${spring.cloud.nacos.discovery.server-addr} namespace: ${seata.registry.nacos.namespace} group: SEATA_GROUP disable-global-transaction: false client: rm: report-success-enable: true
seata 客户端默认采用的是 AT 模式,需要在对应的数据库初始化 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;
如果存在多个微服务,每个微服务所使用的数据库都需要有 undo_log 表
/** * 以下示例需要对应的服务以及数据库都配置好才行哟 */ @Service public class OrderServiceImpl implements OrderService { // 引入下游服务 @DubboReference private UserService userService; @Resource private OrderMapper orderMapper; @Override // 使用该注解开启全局事务 @GlobalTransactional(rollbackFor = Exception.class) public void addOrder() { // 添加订单 orderMapper.save(order); // 查询用户 userService.queryOne(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。