当前位置: 首页 > news >正文

SpringCloud之Seata(二)

4.Seata如何应用于项目?

安装seata及修改配置

4.1 官网下载Seata安装包

4.2 修改seata/config.txt

4.2.1 修改存储方式

store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://你的IP:3306/seata?useUnicode=true
store.db.user=root
store.db.password=root

4.2.2 添加如下配置

service.vgroupMapping.demo-order=default
service.vgroupMapping.demo-storage=default
service.vgroupMapping.demo-account=default

4.3 修改seata/conf/registry.conf

4.3.1 注册中心改为nacos

registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype = "nacos"nacos {application = "seata-server"serverAddr = "你的IP:8848"group = "SEATA_GROUP"namespace = ""cluster = "default"username = "nacos"password = "nacos"}

4.3.2 配置中心也改为nacos

config {# file、nacos 、apollo、zk、consul、etcd3type = "nacos"nacos {serverAddr = "你的IP:8848"namespace = "在nacos中创建一个命名空间,用来保存seata配置,提前配置好"group = "SEATA_GROUP"username = "nacos"password = "nacos"}

4.4 执行nacos脚本,推送seata配置到nacos

sh nacos-config.sh -h 你的nacos -p 8848 -g SEATA_GROUP -t 上面创建的命名空间 -u nacos -w nacos
创建seata需要用到的表

4.4.1 创建数据库

create database seata;

4.4.2 创建相关表

global_table: 全局事务表,每当有一个全局事务发起后,就会在该表中记录全局事务的ID

branch_table: 分支事务表,记录每一个分支事务的 ID,分支事务操作的哪个数据库等信息

lock_table: 全局锁

CREATE TABLE `branch_table` (`branch_id` bigint(20) NOT NULL,`xid` varchar(128) NOT NULL,`transaction_id` bigint(20) DEFAULT NULL,`resource_group_id` varchar(32) DEFAULT NULL,`resource_id` varchar(256) DEFAULT NULL,`branch_type` varchar(8) DEFAULT NULL,`status` tinyint(4) DEFAULT NULL,`client_id` varchar(64) DEFAULT NULL,`application_data` varchar(2000) DEFAULT NULL,`gmt_create` datetime(6) DEFAULT NULL,`gmt_modified` datetime(6) DEFAULT NULL,PRIMARY KEY (`branch_id`),KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `global_table` (`xid` varchar(128) NOT NULL,`transaction_id` bigint(20) DEFAULT NULL,`status` tinyint(4) NOT NULL,`application_id` varchar(32) DEFAULT NULL,`transaction_service_group` varchar(32) DEFAULT NULL,`transaction_name` varchar(128) DEFAULT NULL,`timeout` int(11) DEFAULT NULL,`begin_time` bigint(20) DEFAULT NULL,`application_data` varchar(2000) DEFAULT NULL,`gmt_create` datetime DEFAULT NULL,`gmt_modified` datetime DEFAULT NULL,PRIMARY KEY (`xid`),KEY `idx_gmt_modified_status` (`gmt_modified`,`status`),KEY `idx_transaction_id` (`transaction_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `lock_table` (`row_key` varchar(128) NOT NULL,`xid` varchar(96) DEFAULT NULL,`transaction_id` bigint(20) DEFAULT NULL,`branch_id` bigint(20) NOT NULL,`resource_id` varchar(256) DEFAULT NULL,`table_name` varchar(32) DEFAULT NULL,`pk` varchar(36) DEFAULT NULL,`gmt_create` datetime DEFAULT NULL,`gmt_modified` datetime DEFAULT NULL,PRIMARY KEY (`row_key`),KEY `idx_branch_id` (`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

启动seata服务

sh seata/bin/seata-server.sh 启动成功后,监听8091端口

在这里插入图片描述

看下nacos中是否注册了此服务: 看到如下内容表示,seata已经安装并注册成功

在这里插入图片描述

项目整合seata

1. 创建父工程
在ams-demo下创建父工程demo-seata,并修改父工程打包方式为pom

2. 添加依赖


<dependencies><!-- 配置读取 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency><!-- 单元测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Spring Cloud & Alibaba --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><!-- 注册中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!-- 配置中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>com.ams</groupId><artifactId>common-mybatis-plus</artifactId><version>1.0.0</version></dependency><dependency><groupId>com.ams</groupId><artifactId>common-base</artifactId><version>${ams.version}</version></dependency><dependency><groupId>com.ams</groupId><artifactId>common-web</artifactId><version>${ams.version}</version></dependency><!-- openfeign依赖 1. http客户端选择okhttp 2. loadbalancer替换ribbon --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId></dependency><!--seata 必备--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency></dependencies>

4.4.3 创建订单子模块(库存、账户子模块类似)

1. 在demo-seata下创建demo-order子模块

2. 添加创建订单的接口

/*** @description:创建订单控接口*/
@RestController
@RequestMapping("/order")
@RequiredArgsConstructor
public class OrderController {private final OrderService orderService;@RequestMapping("/createOrder")public R createOrder() {orderService.createOrder();return R.ok("订单创建成功");}
}

3. 添加创建订单的service


/*** @description:创建订单service*/
@Service
@RequiredArgsConstructor
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {private final AccountFeignService accountFeignService;private final StorageFeignService storageFeignService;@Override@GlobalTransactional(name = "ams-create-order",rollbackFor = Exception.class)public R createOrder() {Order order = Order.builder().count(10).money(100).productId(1L).status(0).userId(1L).build();// 创建订单save(order);// 扣除库存storageFeignService.decrease(order.getProductId(), order.getCount());// 扣余额accountFeignService.decrease(order.getUserId(), order.getMoney());//更新订单状态order.setStatus(1);updateById(order);return R.ok();}
}

4. 添加调用库存接口的feign

/*** Description:调用库存接口的feign*/
@FeignClient(value = "ams-demo-storage")
@RequestMapping("/storage")
public interface StorageFeignService {@RequestMapping("/decrease")public R decrease(@RequestParam("productId") Long productId, @RequestParam("count") Integer count);
}

5. 添加调用账户接口的feign

/*** Description:调用账户接口的feign*/
@FeignClient(value = "ams-demo-account")
@RequestMapping("/account")
public interface AccountFeignService {@RequestMapping("/decrease")public R decrease(@RequestParam("userId") Long userId, @RequestParam("money") Integer money);
}

6. 创建启动类

/*** @description:订单启动类*/
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
@EnableFeignClients
public class DemoOrderApp {public static void main(String[] args) {SpringApplication.run(DemoOrderApp.class, args);}
}

7. 创建bootstrap.yml

server:port: 20003spring:application:name: ams-demo-ordercloud:nacos:# 注册中心discovery:server-addr: http://你的nacos地址:8848# 配置中心config:server-addr: ${spring.cloud.nacos.discovery.server-addr}file-extension: yamlshared-configs[0]:data-id: ams-common.yamlrefresh: truealibaba:seata:tx-service-group: demo-order

8. 新增nacos配置:

在naocs中创建ams-demo-order.yaml配置


spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://${mysql.host}:${mysql.port}/ams_order?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=trueusername: ${mysql.username}password: ${mysql.password}redis:database: 0host: ${redis.host}port: ${redis.port}password: ${redis.password}cache:# 缓存类型type: redis# 缓存时间(单位:ms)redis:time-to-live: 3600000# 缓存null值,防止缓存穿透cache-null-values: true# 允许使用缓存前缀,use-key-prefix: true# 缓存前缀,没有设置使用注解的缓存名称(value)作为前缀,和注解的key用双冒号::拼接组成完整缓存keykey-prefix: 'admin:'mybatis-plus:configuration:# 驼峰下划线转换map-underscore-to-camel-case: true# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 全局参数设置
ribbon:ReadTimeout: 120000ConnectTimeout: 10000SocketTimeout: 10000MaxAutoRetries: 0MaxAutoRetriesNextServer: 1 feign:httpclient:enabled: trueokhttp:enabled: false
#Seata分布式事务配置(AT模式)
seata:enabled: trueapplication-id: ${spring.application.name}#客户端和服务端在同一个事务组tx-service-group: demo-orderenable-auto-data-source-proxy: trueservice:vgroup-mapping:demo-order: defaultconfig:type: nacosnacos:namespace: "填写在安装seata时创建的命名空间"serverAddr: 你的nacos ip:8848group: SEATA_GROUPusername: "nacos"password: "nacos"#服务注册到nacosregistry:type: nacosnacos:application: seata-serverserver-addr: 你的nacos ip:8848group: SEATA_GROUPnamespace: "public"username: "nacos"password: "nacos"cluster: default
logging:level:spring: info

9. 创建回滚表

在每个业务数据库下面创建回滚表


CREATE TABLE `undo_log` (`branch_id` bigint(20) NOT NULL COMMENT 'branch transaction id',`xid` varchar(128) NOT NULL COMMENT 'global transaction id',`context` varchar(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` longblob NOT NULL COMMENT 'rollback info',`log_status` int(11) NOT NULL COMMENT '0:normal status,1:defense status',`log_created` datetime(6) NOT NULL COMMENT 'create datetime',`log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='AT transaction mode undo table';

10. 验证

启动三个服务,请求:http://localhost:20003/order/createOrder,通过设置异常,观察是否全局回滚 ​





上一篇跳转—SpringCloud之Seata(一)



本文主要参考链接:
SpringCloud实战|8.SpringCloud 整合 seata1.3-估计是全网讲的最细的并且一次成功的



随心所往,看见未来。Follow your heart,see light!

欢迎点赞、关注、留言,收藏及转发,一起学习、交流!

相关文章:

SpringCloud之Seata(二)

4.Seata如何应用于项目&#xff1f; 安装seata及修改配置 4.1 官网下载Seata安装包 4.2 修改seata/config.txt 4.2.1 修改存储方式 store.db.dbTypemysql store.db.driverClassNamecom.mysql.jdbc.Driver store.db.urljdbc:mysql://你的IP:3306/seata?useUnicodetrue sto…...

【Redis-入门阶段】基本数据结构

Redis支持多种数据结构&#xff0c;包括字符串、列表、哈希、集合和有序集合。这些数据结构在Redis中被称为键值对&#xff0c;其中键是一个字符串&#xff0c;值可以是一个字符串、列表、哈希、集合或有序集合。接下来&#xff0c;我们将详细介绍这些数据结构的使用方法。字符…...

BACnet协议详解————MS/TP物理层,数据链路层和网络层

文章目录写在前面1 物理层2 数据链路层MSTP的流程如下noteMS/TP帧格式3 网络层写在前面 这周加更一篇&#xff0c;来弥补一下之前落下的进度。简单的说两句&#xff0c;之前讲应用层的时候&#xff0c;只是跟官方的手册来同步一下&#xff0c;但是从个人理解来说&#xff0c;自…...

Tomcat

Tomcat 1 简介 1.1 什么是Web服务器 Web服务器是一个应用程序&#xff08;软件&#xff09;&#xff0c;对HTTP协议的操作进行封装&#xff0c;使得程序员不必直接对协议进行操作&#xff0c;让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。 Web服务器是安…...

创客匠人直播:构建公域到私域的用户增长模型

进入知识付费直播带货时代&#xff0c;很多拥有知识技能经验的老师和培训机构吃到了流量红利。通过知识付费直播&#xff0c;老师们可以轻松实现引流、变现&#xff0c;还可以突破时间、地域的限制&#xff0c;为全国各地的学员带来优质的教学服务&#xff0c;因此越来越受到教…...

机试指南

文章目录零、绪论和IDE安装int取值范围常犯的编程小错误一、枚举和模拟 (暴力求解)(一) 枚举1.Reverse函数 求 反序数2.程序出错的原因1.编译错误 (compile)&#xff1a;基本语法错误2.链接错误 (link)&#xff1a;函数名写错了3.运行错误 (run)&#xff1a;结果与预期不符&…...

Android CTA认证设定首选网络类型

需求 硬件只支持4G,过CTA认证时打网络电话,会出现3G网络的选择,会导致过不了,需要禁用3G网络选择功能。 Android 8.1.0 分析 可adb命令查看当前的网络类型 getprop | grep “network” 打印如下: [gsm.network.type]: [LTE,LTE] [ro.telephony.default_network]: [9] …...

Android 动态切换应用图标方案

经常听到大家讨论类似的需求&#xff0c;怀疑大厂是不是用了此方案&#xff0c;据我个人了解&#xff0c;多数头部 app 其实都是发版来更新节假日的 icon。当然本方案也是一种可选的方案&#xff0c;以前我也调研过&#xff0c;存在问题和作者所述差不多&#xff0c;此外原文链…...

SMART PLC斜坡函数功能块(梯形图代码)

斜坡函数Ramp的具体应用可以参看下面的文章链接: PID优化系列之给定值斜坡函数(PLC代码+Simulink仿真测试)_RXXW_Dor的博客-CSDN博客很多变频器里的工艺PID,都有"PID给定值变化时间"这个参数,这里的给定值变化时间我们可以利用斜坡函数实现,当然也可以利用PT1…...

不那么认真的linux复习

这是个不那么认真的linux总结&#xff0c;可能有一些错误 1、linuxkernel&#xff08;内核&#xff09;shell&#xff08;外壳&#xff09;fs&#xff08;文件系统&#xff09;pro/uti/tol&#xff08;应用程序&#xff09; 2、ls&#xff08;列出文件&#xff09; -a&#xf…...

Redis系列文章总纲

跟着老万学Redis 前言 从事开发工作这么久&#xff0c;很多核心技术其实都还只是局限在满足日常开发工作中的基础使用&#xff0c;并没有完整的总结研究。今年的目标之一是完成几个技术栈的系列博客&#xff0c;系统的总结一下知识体系&#xff0c;目前计划是从Redis开始。 Re…...

更新丨三大模块升级,助力高效交付商业项目!

功能更新&#xff01;本文将介绍最新升级的步进漫游、行业方案、VR漫游三个模块&#xff0c;让您更快更好的了解系统能力&#xff0c;为您带来更加便捷、高效的使用体验。步进漫游 离线导出步进式漫游系统&#xff0c;是基于全景图自动生成三维建模的解决方案&#xff0c;实现大…...

C++回顾(二)——const和引用

2.1 C中的const 2.1.1 C与C中const的比较 &#xff08;1&#xff09;C语言中的const C语言中 const修饰的变量是一个 常变量&#xff0c;本质还是变量&#xff0c;有自己的地址空间。 &#xff08;2&#xff09;C中的const 1、C中 const 变量声明的是一个真正的常量&#xff…...

MXNet中使用双向循环神经网络BiRNN对文本进行情感分类<改进版>

在上一节的情感分类当中&#xff0c;有些评论是负面的&#xff0c;但预测的结果是正面的&#xff0c;比如&#xff0c;"this movie was shit"这部电影是狗屎&#xff0c;很明显就是对这部电影极不友好的评价&#xff0c;属于负类评价&#xff0c;给出的却是positive。…...

DNS 域名解析

介绍域名 网域名称&#xff08;英语&#xff1a;Domain Name&#xff0c;简称&#xff1a;Domain&#xff09;&#xff0c;简称域名、网域。 域名是互联网上某一台计算机或计算机组的名称。 域名可以说是一个 IP 地址的代称&#xff0c;目的是为了便于记忆。例如&#xff0c…...

Spring MVC 源码- ViewResolver 组件

ViewResolver 组件ViewResolver 组件&#xff0c;视图解析器&#xff0c;根据视图名和国际化&#xff0c;获得最终的视图 View 对象回顾先来回顾一下在 DispatcherServlet 中处理请求的过程中哪里使用到 ViewResolver 组件&#xff0c;可以回到《一个请求响应的旅行过程》中的 …...

【Hello Linux】初识冯诺伊曼体系

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;简单介绍冯诺伊曼体系 冯诺伊曼体系 冯诺伊曼体系结构的合理性 我们在Linux的第一篇博客中讲解了第一台计算机的发明是为了解决导弹的…...

mysql索引,主从多个核心主题去探索问题。

网上收集不错的优化方案 事务 mvcc 详讲 详讲 索引 索引概念 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据 库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数 据…...

前端一面必会面试题(边面边更)

哪些情况会导致内存泄漏 以下四种情况会造成内存的泄漏&#xff1a; 意外的全局变量&#xff1a; 由于使用未声明的变量&#xff0c;而意外的创建了一个全局变量&#xff0c;而使这个变量一直留在内存中无法被回收。被遗忘的计时器或回调函数&#xff1a; 设置了 setInterval…...

【Hello Linux】初识操作系统

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;简单介绍下操作系统的概念 操作系统 操作系统是什么&#xff1f; 操作系统是管理软硬件资源的软件 为什么要设计操作系统 为什么要设…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...