Spring Cloud 使用 Seata 实现分布式事务,Nacos 作为 Seata 配置中心

至于对Nacos和Seata的介绍,请移步GitHub官网:



Nacos:https://nacos.io/zh-cn/docs/quick-start.html



Seata:https://github.com/seata/seata/wiki/Home_Chinese



Nacos Server下载地址:https://github.com/alibaba/nacos/releases

Seata Server下载地址:https://github.com/seata/seata/releases


文章中的源码在GitHub

环境准备
创建数据库及表(在官方demo中的all_in_one.sql)
要求:带有InnoDB引擎的MySQL。
注意:实际上,示例用例中的3个服务应该有3个数据库。但是,我们只需创建一个数据库并配置3个数据源即可。

业务表
create schema db_account;
use db_account;
 
CREATE TABLE `account_tbl` (
       `id` int(11) NOT NULL AUTO_INCREMENT,
       `user_id` varchar(255) DEFAULT NULL,
       `money` int(11) DEFAULT 0,
       PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
INSERT INTO account_tbl (id, user_id, money) VALUES (1, '1001', 10000);
INSERT INTO account_tbl (id, user_id, money) VALUES (2, '1002', 10000);
 
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) 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=9 DEFAULT CHARSET=utf8;
 
create schema db_order;
 
use db_order;
 
CREATE TABLE `order_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) DEFAULT NULL,
  `commodity_code` varchar(255) DEFAULT NULL,
  `count` int(11) DEFAULT '0',
  `money` int(11) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
 
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) 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=9 DEFAULT CHARSET=utf8;
 
create schema db_storage;
 
use db_storage;
 
CREATE TABLE `storage_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `commodity_code` varchar(255) DEFAULT NULL,
  `count` int(11) DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `commodity_code` (`commodity_code`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 
 
INSERT INTO storage_tbl (id, commodity_code, count) VALUES (1, '2001', 1000);
 
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) 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=9 DEFAULT CHARSET=utf8;
 

启动 Nacos
这里的 Nacos 配置使用的是本地启动的,nacos.config 的 Group, namespace 都是默认的,如果需要可以修改成自己对应的,可以参考官方文档:https://nacos.io/zh-cn/docs/quick-start.html

sh startup.sh -m standalone

启动 Seata Server
在 Seata Release 下载最新版的 Seata Server 并解压得到如下目录:
.
├──bin
├──conf
├──file_store
└──lib
修改 conf/registry.conf 配置,将 type 改为 nacos
registry {
  type = "nacos"
 
  nacos {
    serverAddr = "localhost"
    namespace = "public"
    cluster = "default"
  }
}
 
config {
  type = "nacos"
 
  nacos {
    serverAddr = "localhost"
    namespace = "public"
    cluster = "default"
  }
}
修改 conf/nacos-config.txt配置
修改 service.vgroup_mapping为自己应用对应的名称;如果有多个服务,添加相应的配置(service.vgroup_mapping后面的值要与spring.cloud.alibaba.seata.tx-service-group对应的值匹配)如:

service.vgroup_mapping.my_test_tx_group=default
 
//改为 
 
service.vgroup_mapping.storage-service-fescar-service-group=default
service.vgroup_mapping.order-service-fescar-service-group=default
service.vgroup_mapping.business-service-fescar-service-group=default
service.vgroup_mapping.account-service-fescar-service-group=default
也可以在 Nacos 配置页面添加,data-id 为 service.vgroup_mapping.${YOUR_SERVICE_NAME}-fescar-service-group, group 为 SEATA_GROUP, 如果不添加该配置,启动后会提示no available server to connect

注意配置文件末尾有空行,需要删除,否则会提示失败,尽管实际上是成功的

将 Seata 配置添加到 Nacos 中
cd conf
sh nacos-config.sh localhost
成功后会提示

init nacos config finished, please start seata-server


在 Nacos 管理页面应该可以看到有 47 个 Group 为SEATA_GROUP的配置

启动 Seata Server
cd ..
sh ./bin/seata-server.sh 8091 file


启动后在 Nacos 的服务列表下面可以看到一个名为serverAddr的服务

用例
参考官网中用户购买商品的业务逻辑。整个业务逻辑由3个微服务提供支持:

存储服务:扣除给定商品的存储数量。
订单服务:根据购买请求创建订单。
帐户服务:借记用户帐户的余额。
请求逻辑


分别启动:

ExampleBusinessApplication
ExampleAccountApplication
ExampleOrderApplication
ExampleStorageApplication
其中ExampleBusinessApplication服务中暴露了两个主要测试接口

http://127.0.0.1:8084/purchase/commit接口是可以正常执行完成的方法

http://127.0.0.1:8084/purchase/rollback接口是会发生异常并正常回滚的方法

 

需要修改的文件:

1、各个服务中的application.properties的spring.cloud.alibaba.seata.tx-service-group

2、各个服务中的registry.conf的type

 

3、seata-server中的conf/nacos-config.txt的service.vgroup_mapping

文章参考:

https://github.com/helloworlde/spring-cloud-alibaba-component/tree/master/cloud-seata-nacos
————————————————
版权声明:本文为CSDN博主「qq_27376871」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27376871/article/details/91570779

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值