扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Releases · seata/seata · GitHub
创新互联主营雨山网站建设的网络公司,主营网站建设方案,成都APP应用开发,雨山h5小程序设计搭建,雨山网站营销推广欢迎雨山等地区企业咨询https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip
什么是SeataSeata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务
也是Spring Cloud Alibaba提供的组件
Seata官方文档
SeataSeata官网https://seata.io/zh-cn/
更多信息可以通过官方文档获取
为什么需要Seata我们之前学习了单体项目中的事务
使用的技术叫Spring声明式事务
能够保证一个业务中所有对数据库的操作要么都成功,要么都失败,来保证数据库的数据完整性
但是在微服务的项目中,业务逻辑层涉及远程调用,当前模块发生异常,无法操作远程服务器回滚
这时要想让远程调用也支持事务功能,就需要使用分布式事务组件Seata
Seata保证微服务远程调用业务的原子性
Seata将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
Seata的运行原理观察下面事务模型
上面结构是比较典型的远程调用结构
如果account操作数据库失败需要让order模块和storage模块撤销(回滚)操作
声明式事务不能完成这个操作
需要使用Seata来解决
Seata构成部分包含
我们项目使用AT(自动)模式完成分布式事务的解决
AT模式运行过程
1.事务的发起方(TM)会向事务协调器(TC)申请一个全局事务id,并保存
2.Seata会管理事务中所有相关的参与方的数据源,将数据操作之前和之后的镜像都保存在undo_log表中,这个表是seata组件规定的表,没有它就不能实现效果,依靠它来实现提交(commit)或回滚(roll back)的操作
3.事务的发起方(TM)会连同全局id一起通过远程调用,运行资源管理器(RM)中的方法
4.RM接收到全局id,去运行指定方法,并将运行结果的状态发送给TC
5.如果所有分支运行都正常,TC会通知所有分支进行提交,真正的影响数据库内容,
反之如果所有分支中有任何一个分支发生异常,TC会通知所有分支进行回滚,数据库数据恢复为运行之前的内容
seata的启动seata也是java开发的,启动方式和nacos很像
只是启动命令不同
它要求配置环境变量中Path属性值有jdk的bin目录路径
解压后路径不要用中文,不要用空格
也是解压之后的bin目录下
在路径上输入cmd进入dos窗口
mac系统同学直接参考启动nacos的命令
D:\tools\seata\seata-server-1.4.2\bin>seata-server.bat -h 127.0.0.1 -m file
输入后,最后出现8091端口的提示即可!
如果想使用idea启动seata,和之前nacos启动相似
如果seata启动时发送内存不足的错误
解决方法:可以看看机器的系统内存目前还剩下多少,保证足够启动Java时设定的-Xmx512M -Xms512M -XX:MaxPermSize=256M
修改一下seata-servver.bat里面的启动内存即可
保证当前seata的环境变量是java1.8
在windows系统中运行seata可能出现不稳定的情况,重启seata即可解决
使用Seata 配置Seatacart\stock\order三个模块是需要Seata支持进行事务管理的模块(也就是RM)
这三个模块都需要添加下面pom依赖和配置
io.seata seata-spring-boot-startercom.github.pagehelper pagehelper-spring-boot-startercom.alibaba fastjson
下面修改cart\stock\order模块的application-dev.yml
代码如下
seata:
# 定义事务的分组名称,一般是以项目为单位,用于区分其他不同项目用的
tx-service-group: csmall_group
service:
vgroup-mapping:
# 设置csmall_group分组使用seata默认(default)的配置内容
csmall_group: default
grouplist:
# 设置seata的ip地址和端口号
default: localhost:8091
注意同一个事务必须在同一个tx-service-group中
同时指定相同的seata地址和端口
business模块的配置
business模块作为当前分布式事务模型的触发者
它应该是事务的起点,但是它不连接数据库,所以配置稍有不同
pom文件seata依赖仍然需要,但是只需要seata依赖
io.seata seata-spring-boot-starter
application-dev.yml是一样的
添加完必要的配置之后
要想激活Seata功能非常简单,只要在起点业务的业务逻辑方法上添加专用的注解即可
添加这个注解的模块就是模型中的TM
他调用的所有远程模块都是RM
business模块添加订单的业务逻辑层开始的方法
@Service
@Slf4j
public class BusinessServiceImpl implements IBusinessService {
// Dubbo调用order模块的新增订单的功能
// business是单纯的消费者,不需要在类上添加@DubboService注解
@DubboReference
private IOrderService dubboOrderService;
// Global:全局 Transactional:事务
// 一旦这个方法标记为@GlobalTransactional
// 就相当于设置了分布式事务的起点,相当于AT事务模型中TM(事务管理器)
// 最终效果就是当前方法开始运行后,所有远程调用操作数据库和本模块操作数据库的业务
// 会被管理在同一个事务中,也就是这些数据库操作要么都执行要么都不执行
@GlobalTransactional
@Override
public void buy() {
// 代码略....
}
}
先启动nacos,再启动seata
然后按顺序启动四个服务 cart\stock\order\business
利用knife4j进行访问,
business模块 localhost:20000/doc.html
Seata效果要想seata出现效果,我们要有一个发生异常的情况
当发生异常时,去观察是否会回滚
我们可以编写代码随机的抛出异常,来根据是否有异常,是否回滚,判断seata是否有效
OrderServiceImpl在新增订单方法前添加随机发送异常的方法
@Override
public void orderAdd(OrderAddDTO orderAddDTO) {
// 1.先减去订单中商品的库存数(调用Stock模块减少库存的方法)
// 库存减少方法需要参数类型是StockReduceCountDTO,我们需要先实例化它
StockReduceCountDTO countDTO=new StockReduceCountDTO();
countDTO.setCommodityCode(orderAddDTO.getCommodityCode());
countDTO.setReduceCount(orderAddDTO.getCount());
// 利用Dubbo调用stock模块减少库存的业务逻辑层方法实现功能
stockService.reduceCommodityCount(countDTO);
// 2.从购物车中删除用户选中的商品(调用Cart模块删除购物车中商品的方法)
// 利用dubbo调用cart模块删除购物车中商品的方法实现功能
cartService.deleteUserCart(orderAddDTO.getUserId(),
orderAddDTO.getCommodityCode());
// 3.新增当前订单信息
Order order=new Order();
BeanUtils.copyProperties(orderAddDTO,order);
// 下面执行新增
orderMapper.insertOrder(order);
log.info("新增订单信息为:{}",order);
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 为了实现Seata的回滚效果,在这里随机抛出异常
if( Math.random()<0.5){
// 抛出异常
throw new CoolSharkServiceException(
ResponseCode.INTERNAL_SERVER_ERROR,"发送随机异常");
}
}
重启order模块
再次测试localhost:20000/doc.html
点击触发购买业务的功能,观察是否发生异常
以及发生异常时数据库是否没有变化
正常运行时,数据库数据是否正常变化
Seata其他模式介绍上次课我们讲解了Seata软件AT模式的运行流程
AT模式的运行有一个非常明显的前提条件,这个条件不满足,就无法使用AT模式
这个条件就是事务分支都必须是操作关系型数据库(Mysql\MariaDB\Oracle)
因为关系型数据库才支持提交和回滚,其它非关系型数据库都是直接影响数据(例如Redis)
所以如果我们在业务过程中有一个节点操作的是Redis或其它非关系型数据库时,就无法使用AT模式
除了AT模式之外还有TCC、SAGA 和 XA 事务模式
TCC模式简单来说,TCC模式就是自己编写代码完成事务的提交和回滚
在TCC模式下,我们需要为参与事务的业务逻辑编写一组共3个方法
(prepare\commit\rollback)
prepare:准备
commit:提交
rollback:回滚
这样的话所有提交或回滚代码都由自己编写
优点:虽然代码是自己写的,但是事务整体提交或回滚的机制仍然可用(仍然由TC来调度)
缺点:每个业务都要编写3个方法来对应,代码冗余,而且业务入侵量大
SAGA模式SAGA模式的思想是对应每个业务逻辑层编写一个新的类,可以设置指定的业务逻辑层方法发生异常时,运行当新编写的类中的代码
相当于将TCC模式中的rollback方法定义在了一个新的类中
这样编写代码不影响已经编写好的业务逻辑代码
一般用于修改已经编写完成的老代码
缺点是每个事务分支都要编写一个类来回滚业务,
会造成类的数量较多,开发量比较大
XA模式支持XA协议的数据库分布式事务,使用比较少
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Copyright © 2002-2023 www.kswjz.com 快上网建站品牌 QQ:244261566 版权所有 备案号:蜀ICP备19037934号
微信二维码
移动版官网