SpringBoot+Dubbo+MybatisPlus整合Seata分布式事务
本文作者:FUNKYE(陈健斌),杭州某互联网公司主程。
前言
事务:事务是由一组操作构成的可靠的独立的工作单元,事务具备ACID的特性,即原子性、一致性、隔离性和持久性。
分布式事务:当一个操作牵涉到多个服务,多台数据库协力完成时(比如分表分库后,业务拆分),多个服务中,本地的Transaction已经无法应对这个情况了,为了保证数据一致性,就需要用到分布式事务。
Seata :是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
本文目的:现如今微服务越来越流行,而市面上的分布式事务的方案可谓不少,参差不齐,比较流行的以MQ代表的保证的是消息最终一致性的解决方案(消费确认,消息回查,消息补偿机制等),以及TX-LCN的LCN模式协调本地事务来保证事务统一提交或回滚(已经停止更新,对Dubbo2.7不兼容)。而MQ的分布式事务太过复杂,TX-LCN断更,这时候需要一个高效可靠及易上手的分布式事务解决方案,Seata脱颖而出,本文要介绍的就是如何快速搭建一个整合Seata的Demo项目,一起来吧!
准备工作
1.首先安装mysql,eclipse之类常用的工具,这不展开了.
2.访问seata下载中心地址我们使用的0.9.0版本
3.下载并解压seata-server
建库建表
1.首先我们链接mysql创建一个名为seata的数据库,然后运行一下建表sql,这个在seata-server的conf文件夹内的db_store.sql就是我的所需要使用的sql了.
1 | /* |
2.运行完上面的seata所需要的数据库后,我们进行搭建我们所需要写的demo的库,创建一个名为test的数据库,然后执行以下sql代码:
1 | /* |
3.我们找到seata-server/conf 文件夹内的file编辑它:
4.再次找到其中的db配置方法块,更改方法如下图:
好了,可以到bin目录去./seata-server.bat 运行看看了
创建项目
首先我们使用的是eclipse,当然你也可以用idea之类的工具,详细请按下面步骤来运行
1.创建一个新的maven项目,并删除多余文件夹:
2.打开项目的pom.xml,加入以下依赖:
1 | <properties> |
3.再切换父项目为pom模式,还是pom文件,切换为 overview ,做如图操作:
4.创建我们的demo子项目,test-service:
目录如下:
创建EmbeddedZooKeeper.java文件,跟 ProviderApplication.java,代码如下:
1 | package org.test; |
1 | package org.test; |
创建实体包 org.test.entity以及创建实体类Test 用到了lombok,详细百度一下,eclipse装lombok插件
1 | package org.test.entity; |
创建service,service.impl,mapper等包,依次创建ITestservice,以及实现类,mapper
1 | package org.test.service; |
1 | package org.test.service.impl; |
1 | package org.test.mapper; |
创建org.test.config包,创建SeataAutoConfig.java,配置信息都在此处,主要作用为代理数据,连接事务服务分组
1 | package org.test.config; |
再创建mybatisplus所需的配置文件MybatisPlusConfig
1 | package org.test.config; |
再创建resources目录,创建mapper文件夹,application.yml等文件
1 | server: |
创建file.conf,此处的service 内的vgroup_mapping.你的事务分组,比如上面SeataAutoConfig内配置了test-group,那么这里也要改为test-group,然后下面ip端口都是seata运行的ip跟端口就行了
1 | transport { |
创建registry.conf,来指定file,zk的ip端口之类的配置
1 | registry { |
大功告成,可以直接运行啦,这时候观察seata-server
接下来我们创建test-client项目项目,这里就不赘述了,跟上面的test-service一样的创建方式
接下来我们复制test-service内的service跟实体过去,当然你嫌麻烦,可以单独搞个子项目放通用的service跟实体,一些工具类等等,我这边为了快速搭建这个demo,就选择复制黏贴的方式了.
目录结构:
然后我们创建ClientApplication:
1 | package org.test; |
再到config包内创建SwaggerConfig :
1 | package org.test.config; |
再创建SpringMvcConfigure,再里面放入seata的配置,我为了偷懒直接集成在mvc配置的类里了,大家规范点可以另外创建个配置seata的类,大家可以发现下面还是有个组名称,我把两个项目都分配到一个组去,貌似另外取一个也没事的.
1 | package org.test.config; |
再创建controller包,再包下创建TestController :
1 | package org.test.controller; |
再到service去创建需要依赖的DemoService
1 | package org.test.service; |
一样创建resources文件夹,先创建常用的application.yml
1 | spring: |
再把之前service配置好的file跟registry文件复制来,如果你的client组名称再配置类里修改了,那么这里的file文件内的组名称一样需要更改.
完整的目录结构如上,这时候可以启动test-service后,再启动test-client,到swagger里测试咯
4.访问127.0.0.1:28888/swagger-ui.html做最后的收尾
这里数据我已经存了一条记录了,我们看看会不会成功回滚:
刷新数据库,发现还是只有一条数据:
再查看日志:
显示已经回滚,我们再看看seata-server的日志:
显示回滚成功,事务id也是一致的,这下我们的分布式事务就跑通咯,通过打断点方式,大家可以查看undo_log,会发现再事务提交前,会存入一条事务信息的数据,如果回滚成功,该信息就会被删除.
总结
seata的整合还是比较简单易入手,稍微用心一些你肯定写的比我更好!
欢迎大家也多去阅读seata,dubbo之类的源代码,能解决业务中遇到的大量的坑哦!