Seata概述和使用

Seata概述和使用

下载Seata

https://github.com/seata/seata/releases

https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip

什么是Seata

Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务

也是Spring Cloud Alibaba提供的组件

Seata官方文档

https://seata.io/zh-cn/

更多信息可以通过官方文档获取

为什么需要Seata

使用的技术叫Spring声明式事务

能够保证一个业务中所有对数据库的操作要么都成功,要么都失败,来保证数据库的数据完整性

但是在微服务的项目中,业务逻辑层涉及远程调用,当前模块发生异常,无法操作远程服务器回滚

这时要想让远程调用也支持事务功能,就需要使用分布式事务组件Seata

事务的4个特性:ACID特性

  • 原子性
  • 一致性
  • 隔离性
  • 永久性

Seata保证微服务远程调用业务的原子性

Seata将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

seata的启动

seata也是java开发的,启动方式和nacos很像

只是启动命令不同

它要求配置环境变量中Path属性值有java的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

配置Seata

模块时需要Seata支持进行事务管理的模块

这三个模块都需要添加下面pom依赖和配置

<!--   Seata和SpringBoot整合依赖     -->
<dependency>
	<groupId>io.seata</groupId>
	<artifactId>seata-spring-boot-starter</artifactId>
</dependency>
<!--  Seata 完成分布式事务的两个相关依赖(Seata会自动使用其中的资源)  -->
<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
</dependency>

下面修改模块的application-dev.yml

代码如下

seata:
  tx-service-group: csmall_group # 定义事务分组名称,一般是以项目为单位的,可以与其他项目区分
  service:
    vgroup-mapping:
      csmall_group: default      # csmall_group分组使用Seata默认的配置完成事务
    grouplist:
      default: localhost:8091    # 配置Seata服务器的地址和端口号信息(8091是默认端口号)

注意同一个事务必须在同一个tx-service-group中

同时指定相同的seata地址和端口

business模块作为当前分布式事务模型的触发者

它应该是事务的起点,但是它不连接数据库,所以配置稍有不同

pom文件seata依赖仍然需要,但是只需要seata依赖

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
</dependency>

application-dev.yml是一样的

    seata:
  tx-service-group: csmall_group  # 定义分组名称,为了与其它项目区分
  service:
    vgroup-mapping:
      csmall_group: default       # csmall_group分组使用Seata的默认配置完成事务  
    grouplist: 
      default: localhost:8091     # 配置seata的地址和端口号(8091是默认端口号)

添加完必要的配置之后

要想启动Seata非常简单,只要在起点业务的业务逻辑方法上添加专用的注解即可

添加这个注解的模块就是模型中的TM

他调用的所有远程模块都是RM

business模块添加订单的业务逻辑层开始的方法

@Service
@Slf4j
public class BusinessServiceImpl implements IBusinessService {

    // Dubbo调用Order模块的新增订单功能
    // Business是单纯的消费者,不需要在类上编写@DubboService
    @DubboReference
    private IOrderService dubboOrderService;

    // Global全局,Transactional事务
    // 一旦一个方法上标记的@GlobalTransactional注解
    // 就相当于设置了分布式事务的起点,当前模块就是分布式事务模型中的TM
    // 最终效果就是当前方法开始,之后所有的远程调用操作数据库的结果就会实现事务的特征
    // 也就是说要么都执行,要么都不执行
    @GlobalTransactional
    @Override
    public void buy() {
		 //  代码略...
    }
}

先启动Nacos,在seata不关闭的前提下

再启动所有服务

利用knife4j访问business模块,否则无法触发事务效果,business模块是seata事务的起点

在windows系统中运行seata可能出现不稳定的情况,重启seata即可解决

如果seata启动时发送内存不足的错误,可以参考下面的文章解决

https://blog.csdn.net/he_lei/article/details/116229467

业务逻辑层接口添加 @GlobalTransactional注解的效果我们可以自己去尝试

启动服务时,经常见到Dubbo报错

Dubbo报错处理

报错信息特别长的(RpcException)

  • 删除nacos配置列表中的所有信息(可以先选每页显示100条,在执行全删)

    然后停掉所有服务重启

  • consumer:
      # 当本项目启动时,是否检查当前项目需要的所有Dubbo服务是否是可用状态
      # 我们设置它的值为false,表示项目启动时不检查,所需的服务是否可用
      check: false``
      timeout: 50000
    
  • 报错信息特别长,但是不影响运行的

    是因为当前计算机wifi网卡配置或防火墙软件导致的,可以无视

    consumer:

    当本项目启动时,是否检查当前项目需要的所有Dubbo服务是否是可用状态

    我们设置它的值为false,表示项目启动时不检查,所需的服务是否可用

    check: false``
    timeout: 50000

    
    
  • 报错信息特别长,但是不影响运行的

    是因为当前计算机wifi网卡配置或防火墙软件导致的,可以无视

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值