Spring-Cloud-Alibaba-Seata 组件学习使用

近期学习Spring-Cloud-Alibaba框架,对Seata这个分布式事务管理这个组件的学习和使用做个总结和记录
首先说明使用版本,目前Alibaba 顺利冲Spring-Cloud毕业,发布了首个稳定版本2.1.0 RELEASE,项目肯定是使用这个来进行搭建的。其他框架版本如下:
Spring Boot (2.1.6 RELEASE)这个很重要!!
Feign (2.1.2 RELEASE)
Nacos (2.1.0.RELEASE)
Seata (0.8.0)

工程结构如下:

业务流程:
一个简单的微服务后台,从account_users 服务接收数据,并保存入库,同时请求account_bill 对数据进行入库,并返回处理结果。其间如果某一个服务出错,整个流程的数据都将回滚。(Seata 分布式事务管理)

接下来说说怎么使用Spring-Cloud-Alibaba-Seata 这个组件(阿里已经封装好了,直接使用就可以了)
要想使用Spring-Cloud-Alibaba-Seata 这个组件,工程必须引入Spring-Cloud-Alibaba框架,具体可自行百度。
在调用方微服务的pom.xml 文件中加入Spring-Cloud-Alibaba-Seata 组件依赖(根据业务流程说明的,我这里在account_users工程的pom.xml 文件中加入)

<!-- seata  -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

引入后,拷贝Seata Server目录中conf文件夹下的registry.conf和file.conf 文件,至工程的resources目录下。
Seata Server 下载地址:https://github.com/seata/seata/releases
file.conf 文件如果是使用Nacos 配置中心启动的话就不需要拷贝了。
Seata Server 解压后的conf 目录:Seata Server 解压后的conf 目录:
拷贝至工程的resources目录下:
在这里插入图片描述
拷贝完成后修改工程目录下的registry.conf文件(如果是file.conf 进行配置的话,Seata Server 配置不改动),查看registry.conf文件中registry.type是否为file 和config.type 是否为file,如果不是则修改为file,如果是使用Nacos 则改为nacos,同时修改nacos 地址(nacos 配置中心进行配置的话,Seata Server 也要改动)。
在这里插入图片描述在这里插入图片描述
修改完registry.conf文件,再修改file.conf 文件,如果是Nacos匹配中心进行配置的话,则修改Seata Server中的nacos-config.txt 文件,根据Spring-cloud-alibaba-seata 中GlobalTransactionAutoConfiguration这个类的设计,如果服务没有设置服务组,则会使用application配置文件中的spring.application.name的值加上"-fescar-service-group"作为服务组。
在这里插入图片描述
所以,要想工程能启动,则需要再file.conf文件中加上服务组配置,在service 节点下添加

# ${artifactId}为application 配置文件中的spring.application.name 的值,须自行替换
vgroup_mapping.${artifactId}-fescar-service-group = "default"

如果Seata Server运行地址不是本机地址,则自行修改default.grouplist的IP和端口号。
在这里插入图片描述
以上步骤在被请求方同样操作一遍,根据业务流程(在account_bill 工程再操作一遍)
①加依赖、②拷配置、③改配置

完成后,在调用方的业务代码上加上注解(被调用方不需要添加)

 @GlobalTransactional(timeoutMills = 300000, name = "自定义")

在这里插入图片描述
以上seata客户端就已经改造完成了,服务端如果是使用file.conf 配置的话,无需改造,直接启动即可。
如果是使用Nacos配置的话,上述修改file.conf 则修改为修改seata Server 中的nacos-config.txt
有几个服务使用seata 就在文件中添加几行配置

# ${artifactId}为application 配置文件中的spring.application.name 的值,须自行替换
service.vgroup_mapping.${artifactId}-fescar-service-group = "default"

在这里插入图片描述
修改完Nacos 配置后,修改Seata Server 中的registry.conf 文件,将配置类型改为nacos ,同时修改nacos 的地址和命名空间
在这里插入图片描述
在这里插入图片描述
修改完成后,执行

 sh nacos-config.sh

将配置导入nacos 中,在启动seata server ,打开nacos 页面即可看到配置信息已经配置到Nacos 上了
在这里插入图片描述
最后在数据库中创建undo_log表,执行语句在seata Server 中有,可以直接拷贝出来执行即可。

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,
  `ext` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

以上就是整合spring-cloud-alibaba-seata 的全部内容。这时候就可以启动工程,测试在出错的时候是不是会所有事务都回滚了。(说明下,在seata 官方的示例中,是需要自己写配置,进行数据源代理等操作的,在Spring-cloud-alibaba-seata 中不需要,阿里已经封装好了)。
可以通过打印RootContext.getXID()查看Seata 是否生效。
这些说明下遇到的坑:
本人一开始使用Spring-Boot 2.1.7 RELEASE 配置完后进行调试,在被调用方(account_bill)中怎么都打印不出RootContext.getXID(),执行抛异常时,调用方显示rollback status:Rollbacked,找了半天,最后在被调用方做了拦截器打印了header中的参数后,才找到,RootContext.getXID()已经跟着Header 传递过来了,但是Seata 中的拦截器SeataHandlerInterceptor没有生效!T^T心好累。。。如果你使用Spring-Boot 2.1.7 RELEASE 那么对不起,无论你怎么绑定都绑不上这个拦截器,唯一的办法就是在自定义的拦截器中,获取RootContext.getXID()的值,在绑定到RootContext上,一样可以进行事务回滚!
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值