保姆级教程:Spring Cloud 集成 Seata 分布式事务

点击关注公众号,Java干货及时送达👇

环境搭建

Nacos搭建

最新版本快速搭建 使用Mysql模式

Nacos直接启动即可。控制台默认账号密码是nacos/nacos,Mysql账户密码有两个 root/rootnacos/nacos

6a1b997283721c4566cc9704f7be416a.png

Seata搭建

Seata版本1.5.0 快速搭建

Seata1.5.0版本直接是一个SpringBoot项目,下载后修改application.yml 文件中注册中心、配置中心、存储模式配置。参考resources/application.example.yml 文件 ,修改后如下

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:# support: nacos, consul, apollo, zk, etcd3type: fileregistry:# support: nacos, eureka, redis, zk, consul, etcd3, sofatype: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848namespace:group: SEATA_GROUPcluster: defaultusername: nacospassword: nacos##if use MSE Nacos with auth, mutex with username/password attribute#access-key: ""#secret-key: ""store:# support: file 、 db 、 redismode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=trueuser: rootpassword: rootmin-conn: 5max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 100max-wait: 5000
#  server:
#    service-port: 8091 #If not configured, the default is '${server.port} + 1000'security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

创建seata数据库,执行脚本建表

-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(`xid`                       VARCHAR(128) NOT NULL,`transaction_id`            BIGINT,`status`                    TINYINT      NOT 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 = InnoDBDEFAULT CHARSET = utf8mb4;-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(`branch_id`         BIGINT       NOT 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 = InnoDBDEFAULT CHARSET = utf8mb4;-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(`row_key`        VARCHAR(128) NOT NULL,`xid`            VARCHAR(128),`transaction_id` BIGINT,`branch_id`      BIGINT       NOT NULL,`resource_id`    VARCHAR(256),`table_name`     VARCHAR(32),`pk`             VARCHAR(36),`status`         TINYINT      NOT 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` (`xid`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;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 = InnoDBDEFAULT 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);

启动seata-server,控制台登录页面如下,账号密码为seata/seata

4c9ba921fb6ffe4549f17408c52e0e4f.png

项目搭建

业务背景

用户购买商品的业务逻辑。整个业务逻辑由3个微服务提供支持:

  • 仓储服务: 对给定的商品扣除仓储数量。

  • 订单服务: 根据采购需求创建订单。

  • 帐户服务: 从用户帐户中扣除余额。

架构

ed180b8593a186ebe46c9d7682cb4c5b.png

业务表创建

-- ----------------------------
-- Table structure for t_account
-- ----------------------------
DROP TABLE IF EXISTS `t_account`;
CREATE TABLE `t_account`
(`id`      int(11) NOT NULL AUTO_INCREMENT,`user_id` varchar(255) DEFAULT NULL,`amount`  double(14, 2
) DEFAULT '0.00',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of t_account
-- ----------------------------
INSERT INTO `t_account`
VALUES ('1', '1', '4000.00');-- ----------------------------
-- Table structure for t_order
-- ----------------------------
DROP TABLE IF EXISTS `t_order`;
CREATE TABLE `t_order`
(`id`             int(11) NOT NULL AUTO_INCREMENT,`order_no`       varchar(255) DEFAULT NULL,`user_id`        varchar(255) DEFAULT NULL,`commodity_code` varchar(255) DEFAULT NULL,`count`          int(11) DEFAULT '0',`amount`         double(14, 2
) DEFAULT '0.00',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of t_order
-- ------------------------------ ----------------------------
-- Table structure for t_stock
-- ----------------------------
DROP TABLE IF EXISTS `t_stock`;
CREATE TABLE `t_stock`
(`id`             int(11) NOT NULL AUTO_INCREMENT,`commodity_code` varchar(255) DEFAULT NULL,`name`           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;-- ----------------------------
-- Records of t_stock
-- ----------------------------
INSERT INTO `t_stock`
VALUES ('1', 'C201901140001', '水杯', '1000');-- ----------------------------
-- Table structure for undo_log
-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
-- ----------------------------
DROP TABLE IF EXISTS `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,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of undo_log
-- ----------------------------
SET
FOREIGN_KEY_CHECKS=1;

服务创建

业务服务

以order服务为例,引入依赖、配置参数、提供创建订单接口。

pom.xml文件中引入依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
</dependencies>

application.properties配置参数

server.port=81
spring.application.name=order
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/seata_samples?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root
mybatis-plus.mapper-locations=classpath:mapper/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

提供创建订单接口

@RequestMapping("/add")public void add(String userId, String commodityCode, Integer count, BigDecimal amount) {Order order = new Order();order.setOrderNo(UUID.randomUUID().toString());order.setUserId(userId);order.setAmount(amount);order.setCommodityCode(commodityCode);order.setCount(count);orderService.save(order);}
聚合服务

business服务远程调用仓储、订单、帐户服务,完成下单流程。

1.pom.xml文件中引入依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
</dependencies>

2.application.properties配置参数

server.port=80
spring.application.name=business
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/seata_samples?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root
service.disableGlobalTransaction=false
# 连接超时时间
ribbon.ConnectTimeout=3000
# 响应超时时间
ribbon.ReadTimeout=5000

3.声明account、stock、order的feign接口。

@FeignClient(value = "account")
public interface AccountFeign {@RequestMapping("/account/reduce")public void reduce(@RequestParam("userId") String userId, @RequestParam("amount") BigDecimal amount);}
@FeignClient(value = "order")
public interface OrderFeign {@RequestMapping("/order/add")public void add(@RequestParam("userId") String userId, @RequestParam("commodityCode") String commodityCode, @RequestParam("count") Integer count, @RequestParam("amount") BigDecimal amount);}
@FeignClient(value = "stock")
public interface StockFeign {@RequestMapping("/stock/deduct")public void deduct(@RequestParam("commodityCode") String commodityCode, @RequestParam("count") Integer count);}

4.全局事务开启,调用feign接口

@Autowired
private OrderFeign orderFeign;@Autowired
private StockFeign stockFeign;@Autowired
private AccountFeign accountFeign;@GlobalTransactional
@RequestMapping("/toOrder")
public void toOrder(String userId, String commodityCode, Integer count, BigDecimal amount) {accountFeign.reduce(userId, amount);stockFeign.deduct(commodityCode, count);orderFeign.add(userId, commodityCode, count, amount);
}

测试验证

当前资金账户4000,库存1000,模拟用户购买商品2000个,消费4000,业务调用后,数据库数据状态应该如下:

  • 用户资金满足4000,数据库更新用户资金为0。

  • 商品库存不满足2000个,异常。

  • business服务提交全局回滚。

  • 资金服务回滚操作,更新资金为4000。

验证:

1.浏览器输入地址请求访问

  • http://127.0.0.1/business/toOrder?userId=1&commodityCode=C201901140001&count=2000&amount=4000

2.account、stock服务日志观察。

2882c72670be718c8b99213a5da0f578.png 7fe797a63b74015abb2a91a822935863.png

3.数据库数据依然为原始状态。

85b5d586ef0a20be367f9a3fbe0244df.png

注意事项

1.Seata1.5版本的mysql驱动是5.7,需要为8,在libs文件夹删除mysql-connector-java-5.xx.jar,替换mysql-connector-java-8.xx.jar即可

2.Spring Boot &Spring Cloud&Spring Cloud Alibaba版本兼容问题

Spring Cloud Alibaba版本说明

1df37a7bce62c7ad8ad852eb5b5d3812.png

3.druid和数据驱动版本兼容

通过druid仓库版本查看各依赖版本说明

3db36c3ba16d74e8efcfefb1ad9f1eb2.png

代码仓库

  • https://gitee.com/codeWBG/springcloud_alibaba

来源:wangbinguang.blog.csdn.net/

article/details/128935863

热门内容:
Controller层代码就该这么写,简洁又优雅!
  • 面试官:一千万的数据,你是怎么查询的?

  • 公司入职一个阿里大佬,把 Spring Boot 系统启动时间从 7 分钟降到了 40 秒!

  • 简化 Hello World:Java 新写法要来了!!

  • 一款 IntelliJ IDEA 神级插件,由 ChatGPT 团队开发,堪称辅助神器!

 

f779b52b76155075312d377fb6da1a79.jpeg

 
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58609.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《AI绘画工具保姆级指南手册--以Midjourney为例【含国内中文版】》

大家下午好&#xff0c;近期陆陆续续有很多饱子私信我&#xff0c;表达出非常热切的心情&#xff0c;想要学习关于AIGC领域的AI绘画&#xff0c;毕竟AI绘画工具真的很火&#xff1b;这是前一阵给大家分享了《AIGC之文本生成指南手册 --以ChatGPT为例》&#xff0c;感兴趣饱子可…

Ai口播几天涨粉20w项目拆解(保姆级教程)

这几天看老妈在刷某音&#xff0c;看到她总是刷到一些小朋友的视频。声音很可爱&#xff0c;凑过去一看原来是一个小和尚在说一些祝福话。仔细一看其实是一个Ai人物在口播。然后到某书上一搜索。好家伙&#xff01;整屏幕都是。而且不乏一二十万粉丝账号的。每个账号发布的视频…

史上最详细使用copliot AI保姆级教程来了

目录 概述 第一步:注册 第二步:使用 第三步:copliot基本用法 第四步:copliot成功案列 概述 Copilot 是一款由 OpenAI 推出的人工智能代码自动补全AI工具&#xff0c;它可以帮助程序员更快、更准确地编写代码。Copilot 的核心技术基于 GPT-3 模型&#xff0c;但是在编码方…

公司入职一个阿里大佬,把SpringBoot项目启动从420秒优化到了40秒!

大家好&#xff0c;我是老赵 0.背景 公司 SpringBoot 项目在日常开发过程中发现服务启动过程异常缓慢&#xff0c;常常需要6-7分钟才能暴露端口&#xff0c;严重降低开发效率。通过 SpringBoot 的 SpringApplicationRunListener 、BeanPostProcessor 原理和源码调试等手段排查发…

SpringBoot 统一功能处理

大家好&#xff0c;我是老赵 前言 接下来是 Spring Boot 统⼀功能处理模块了&#xff0c;也是 AOP 的实战环节&#xff0c;要实现的课程⽬标有以下 3 个&#xff1a; 统⼀⽤户登录权限验证统⼀数据格式返回统⼀异常处理 接下我们⼀个⼀个来看。 一、用户登录权限效验 ⽤户登录权…

目标检测算法——YOLOv5/YOLOv7改进结合轻量型Ghost模块

>>>深度学习Tricks&#xff0c;第一时间送达<<< 论文题目&#xff1a;《GhostNet&#xff1a;More Features from Cheap Operations》论文地址&#xff1a; https://arxiv.org/pdf/1911.11907v1.pdf 由于内存和计算资源有限&#xff0c;在嵌入式设备上部署…

苹果最新动态 苹果推送 iOS 14 正式版发布

苹果发布会此次虽然没有公布新手机&#xff0c;预计是在国庆期间吧&#xff0c;不过发布会上还是公布了一些信息&#xff0c;下面给大家整理下苹果的最新动态&#xff0c;一起来看看&#xff01; 苹果推送 iOS 14 正式版 9 月 17 日&#xff0c;苹果正式推送了 iOS 14、iPadOS…

彩票走势图xcode源码

#源码介绍 此份彩票走势图源码是用xcode写的&#xff0c;需要的小伙伴自取哦。 #效果展示 #源码已上传阿里云oss&#xff0c;彩票走势图传送门 来自&#xff1a;https://12580code.com/631.html

iOS 14 大改还有神秘硬件登场,苹果 WWDC20 今夜线上发布

来源 | 网易科技 头图 | CSDN付费下载自视觉中国 受全球疫情影响&#xff0c;科技数码行业元气大伤&#xff0c;当工厂停工、发布会转线上、产品推迟上市成为常态&#xff0c;我们也渐渐习惯了在电脑前默默的等待&#xff0c;享受云上狂欢。此前苹果已经公布&#xff0c;今年 W…

IOS开发之——彩票-帮助(11)

一 概述 设置页面点击帮助&#xff0c;跳转帮助TableViewController页面点击帮助列表中的每一项&#xff0c;打开WebView显示具体信息 二 设置页面点击帮助&#xff0c;跳转帮助TableViewController页面 2.1 页面结构及功能分析 帮助页面是一个列表&#xff0c;构建ILHelpVi…

苹果 iOS 16.0.3 正式版发布:修复 iPhone 14 Pro / Max 通知延迟、相机启动慢等问题

IT之家 10 月 11 日消息&#xff0c;苹果今日面向 iPhone 用户推送了 iOS 16.0.3 正式版更新&#xff08;内部版本号 20A392&#xff09;&#xff0c;距离上个正式版隔了 17 天。iOS 16.0.3 正式版更新大小达到了 1.21GB&#xff0c;带来了多项修复内容。 iPhone 14 Pro 和 iPh…

IOS开发之——彩票-检查更新(7)

一 概述 初始化SettingItem时&#xff0c;指定跳转页面地址或执行动作检查更新——MBProgressHUD用法检查更新——UIAlertController用法 二 初始化SettingItem时&#xff0c;指定跳转页面地址或执行动作 2.1 destVcClass跳转页面(ILSettingArrowItem) (instancetype)itemWi…

苹果回应巴西政府禁止销售不附赠充电器的iPhone;TikTok否认用户数据源代码泄露|极客头条

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&…

苹果于近日推送了 iOS 14.5 开发者预览版 Beta

导读近日&#xff0c;苹果推送了 iOS 14.5 开发者预览版 Beta 5 。除日常修修补补外&#xff0c;引入了多项重要的新功能&#xff0c;包括&#xff0c;这也是 iOS 14 迄今为止最大的一次更新。此外&#xff0c;iPadOS 14.5 与watchOS 7.4 开发者预览版 Beta 5 也已发布。 iOS 1…

iPhone 14连夜跌至4800元,现在应该直接入手14,还是等15?

自从进入2023年&#xff0c;苹果就玩起了降价的套路&#xff0c;企图拉高iPhone 14系列的销量。最近&#xff0c;iPhone 14的价格普遍来到了5000元出头&#xff0c;而PDD最低价格已经跌到了4800元&#xff0c;相比原价少了1000元。那么&#xff0c;到底是现在入手14更划算&…

苹果测试软件testflight游戏,苹果内测工具TestFlight的使用

通常App开发中会使用测试与生产两套环境,苹果有两套对应的development和distribution证书.使用development开发证书打包的测试版app我们可以发布到蒲公英,fir等第三方托管平台,但若要打包正式版app供测试则必须发布到testFlight.由于不同证书打包的app远程推送通知是区分开的,有…

代码显示苹果 iOS 16.2 将允许 iPhone 更频繁刷新“实时活动”,但也更加耗电

10 月 26 日消息&#xff0c;随着本周 iOS 16.1 正式版的发布&#xff0c;苹果推出了实时活动 —— 更多第三方应用程序可提供有用的信息。有了“实时活动”功能&#xff0c;用户可以随时获知常用 App 的最新信息。无需解锁设备&#xff0c;即可在锁定屏幕上关注出租车的到达时…

iOS16.1RC版发布后 iPhone14 Pro系列机型可以在灵动岛显示球赛比分

灵动岛是苹果在 iPhone 14 Pro 系列机型推出的新功能&#xff0c;不过该功能目前尚未得到软件支持&#xff0c;苹果计划在 11 月前推出 iOS 更新支持这个新功能。 目前苹果已经推出 iOS 16.1 RC 即候选预览版&#xff0c;这次更新后部分已经积极进行适配的第三方软件开始支持灵…

苹果今天发布了 iOS 14.5 的第一个开发者预览版

苹果今天发布了 iOS 14.5 的第一个开发者预览版&#xff0c;其中一个重要的新功能是 iPhone 12 机型在双 SIM 卡模式下对 5G 的全球支持&#xff0c;此前该功能仅在中国大陆地区提供。 海外 iPhone 12 机型同时配备了物理 SIM 卡槽和数字 eSIM 卡&#xff0c;可以实现双卡双待的…

使用了 iOS 14 发布的翻译工具,觉得还差点儿意思

By 超神经 内容概要&#xff1a;Apple 在 WWDC 2020 上发布了一款全新的 APP--Translate&#xff0c;官方表示该 APP 会成为最好用的翻译软件&#xff0c;试用后我们发现&#xff0c;Translate 的进步空间还很大。 关键词&#xff1a;WWDC2020 翻译软件 机器学习 北京时间 6 …