阅读提醒:
- 本文面向的是有一定springboot基础者
- 本次教程使用的Spring Cloud Hoxton RELEASE版本
- 本文依赖上一篇的工程,请查看上一篇文章以做到无缝衔接,或者直接下载源码:github.com/WinterChenS…
两个月没有更新了,这次趁着刷技术文章的机会,把目前比较热门的分布式事务框架seata整合一下,分布式事务的出现是因为微服务导致业务分部在不同的服务中,不能像本地事务一样使用事务。
前情概要
- SpringCloud系列教程(一)开篇
- SpringCloud系列教程(二)之Nacos | 8月更文挑战
- SpringCloud系列教程(三)之Open Feign | 8月更文挑战
- SpringCloud系列教程(四)之SpringCloud Gateway | 8月更文挑战
- SpringCloud系列教程(五)之SpringCloud Gateway 网关聚合开发文档 swagger knife4j 和登录权限统一验证
- SpringCloud系列教程(六)之SpringCloud 使用sentinel作为熔断器
- SpringCloud系列教程(七)之使用Spring Cloud Sleuth+Zipkin实现链路追踪
什么是seata?
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
关于更多的原理可以参考官方文档,这里就不赘述了:Seata 是什么
下载安装seata-server
下载
下载地址:Releases · seata/seata (github.com)
window下载zip,linux/mac下载tar.gz
注意:如何安装nacos请看这:Nacos 快速入门,建议查看前面的文章以做到丝滑入戏。
安装
解压之后修改配置文件registry.conf(这里主要是配置nacos作为配置中心):
1 | protobuf复制代码config { |
然后继续修改注册中心(nacos作为注册中心):
1 | protobuf复制代码registry { |
本文是以nacos作为注册中心和配置中心的,如果需要其它的方式可以查看官方文档。
上传配置
在上传之前先下载对应的配置文件模板
- 首先下载config.txt文件:seata/script/config-center at develop · seata/seata (github.com) ,将其放入到seata的解压目录下;见图例1
- 然后在目录下找到对应的配置中心的目录下的shell脚本,这里使用的是nacos-config.sh seata/script/config-center/nacos at develop · seata/seata (github.com),将其放入到
${SEATA_DIR}/script/config-center/nacos/nacos-config.sh
注意:${SEATA_DIR}
是seata的根目录;见图例2 - 到seata的解压根目录下运行
sh script/config-center/nacos/nacos-config.sh -h 127.0.0.1 -p 8848 -g SEATA_GROUP -u nacos -w nacos
注意:nacos-config.sh是第2步下载的脚本文件,见图例3
图例1:
图例2:
图例3:
图例4:
在nacos控制台(localhost:8848/nacos,账密:nacos/nacos):
可以看到配置已经成功上传
具体的配置请查看:seata/config.txt at develop · seata/seata (github.com)
配置参数官方对照表:Seata 参数配置
注意修改对应数据库的配置,可以直接在nacos中修改配置。
有一个比较关键的点,也是很容易出错的点,有一个配置参数单独拿出来讲一下,
service.vgroupMapping.<你的服务名称>-group=default
这个分组需要seata-server和client都保持一致,当然,seata是可以存在多个事务分组的,比如我们订单业务涉及到库存等等逻辑,那么将这些在同一个事务的服务加入到同一个事务分组内,就如默认的配置文件中设置为:service.vgroupMapping.my_test_tx_group=default
那么我们需要在服务的application.yml中配置该组:
1 | yaml复制代码seata: |
启动seata-server:
windows:打开控制台:./seata-server.bat -h 127.0.0.1
linux/macos: sh [seata-server.sh](http://seata-server.sh) -h 127.0.0.1
成功启动:
nacos注册中心:
多种部署方式:
新增seata的数据表:
对应的sql文件请查看:seata/script/server/db at 1.4.0 · seata/seata (github.com)
下载之后在数据库中新建库:seata,然后将建库脚本导入。
工程改造
1.复制工程
将工程:spring-cloud-nacos-consumer 复制一份,改为:order-server
将工程:spring-cloud-nacos-provider 复制一份,改为:stock-server
注意:复制之后需要修改部分pom配置才可以(改为对应的名称):
1 | xml复制代码<artifactId>order-server</artifactId> |
并且在父pom中加入:
1 | xml复制代码<modules> |
然后重新导入依赖即可
如果还存在异常,请将.imi文件删除
2.增加依赖
在两个工程模块的pom中增加依赖:
1 | xml复制代码<!-- seata --> |
3.修改工程的application.yml配置
order-server
1 | yaml复制代码logging: |
stock-server
1 | yaml复制代码logging: |
4.数据库初始化
1 | sql复制代码-- 创建 order库、业务表、undo_log表 |
5.引入mybatis plus
父pom引入依赖:
1 | xml复制代码<!-- mybatis plus --> |
两个工程分别引入依赖:
1 | xml复制代码<!-- mybatis plus --> |
6.order-server业务修改
新增部分类
1 | java复制代码@Data |
1 | java复制代码@Mapper |
mapperxml:
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
service:
1 | java复制代码public interface OrderTblService extends IService<Order> { |
1 | java复制代码@Service |
StockFeignClient
1 | java复制代码@FeignClient(name = "stock-server") |
1 | java复制代码@Api(tags="订单API") |
7.stock-server业务修改
entity:
1 | java复制代码@Data |
mapper:
1 | java复制代码@Mapper |
mapperxml:
1 | java复制代码<?xml version="1.0" encoding="UTF-8"?> |
service:
1 | java复制代码public interface StockTblService extends IService<Stock> { |
1 | java复制代码@Service |
controller:
1 | java复制代码@Api(tags="库存API") |
8. 修改gateway:
修改GatewayConfiguration
initCustomizedApis
新增对order-server
和stock-server
的初始化
1 | java复制代码ApiDefinition api3 = new ApiDefinition("order") |
initGatewayRules
新增规则
1 | java复制代码rules.add(new GatewayFlowRule("order") |
appilcation.yml
新增对order-server
和stock-server
的路由配置:
1 | yaml复制代码 |
测试:
首先启动对应的服务:
- spring-cloud-gateway
- spring-cloud-auth
- order-server
- stock-server
然后打开swagger进行测试: consumer服务
测试提交:
订单创建成功:
库存扣减成功:
测试回滚:
此时数据库里面都正常回滚。
总结
以上就是本教程的全部内容了,seata是一款非常好用的分布式事务框架,为开发人员提供了比较简单的API,seata默认使用的是AT模式的事务,当然,可以结合自身的业务选择比较合适的分布式事务模式,具体的配置可以参考官方文档。
本项目的源码地址为:WinterChenS/spring-cloud-hoxton-study: spring cloud hoxton release study (github.com)
参考文献:
Seata(Fescar)分布式事务 整合 Spring Cloud
本文转载自: 掘金