一、前言

  Seata出现前,大部分公司使用的都是TCC或者MQ(RocketMq)等来解决分布式事务的问题,TCC代码编写复杂,每个业务均需要实现三个入口,侵入性强,RocketMQ保证的是最终一致性。

二、环境准备

1、nacos:(这里采用最新版本2.1.1)

  下载地址:https://github.com/alibaba/nacos/releases

  官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html

2、seata:(这里采用最新版本1.5.2)

  下载地址:https://github.com/seata/seata/releases

  官方文档:http://seata.io/zh-cn/docs/overview/what-is-seata.html

3、其它:

  redis、maven、mysql等(自行安装)

三、项目搭建(这里仅作本地测试,均采用单机模式)

1、mysql 自行下载、安装,创建数据库seata、nacos、seata-user、seata-order(后面两个是接入seata的微服务的数据库)

2、nacos

  ①解压压缩包,进入nacos目录

  ②进入conf目录,拷贝nacos-mysql.sql到数据库nacos初始化

  ③打开application.properties,找到如下配置,放开注释,修改为本地连接

### If use MySQL as datasource:
spring.datasource.platform=mysql ### Count of DB:
db.num=1 ### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos

  ④进入bin目录,执行cmd命令," .\startup.cmd -m standalone",观察到如下日志,无报错,即启动成功

  ⑤上图标出的即为nacos管理界面的地址,账号密码均为nacos,登录成功

  ⑥新建命令空间,我这里加的"yhc",大家可以自定义,不过后面seata和server的配置需要对应上,后文也会提到。

  ⑦新建配置"seata.yml",这个配置可以从seata官网demo中找到,注意只用修改db连接即可。

metrics:
enabled: false
exporterList: prometheus
exporterPrometheusPort: 9898
registryType: compact
server:
maxCommitRetryTimeout: -1
maxRollbackRetryTimeout: -1
recovery:
asynCommittingRetryPeriod: 1000
committingRetryPeriod: 1000
rollbackingRetryPeriod: 1000
timeoutRetryPeriod: 1000
rollbackRetryTimeoutUnlockEnable: false
undo:
logDeletePeriod: 86400000
logSaveDays: 7
store:
db:
branchTable: branch_table
datasource: druid
dbType: mysql
driverClassName: com.mysql.cj.jdbc.Driver
globalTable: global_table
lockTable: lock_table
maxConn: 30
maxWait: 5000
minConn: 5
password: root
queryLimit: 100
url: jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true&useSSL=false
user: root
mode: db
transport:
compressor: none
serialization: seata

3、seata

  ①解压压缩包,进入seata目录

  ②进入/script/server/db目录,拷贝mysql.sql到数据库seata初始化

  ③进入/conf目录,修改application.yml配置文件,配置中心和注册中心改为nacos

seata:
config:
# support: nacos, consul, apollo, zk, etcd3
type: nacos
nacos:
server-addr: localhost:8848
namespace: c23f9030-953e-46bb-8c6e-0bf4a8227a8c
group: yhc
username: nacos
password: nacos
data-id: seata.yml
registry:
# support: nacos, eureka, redis, zk, consul, etcd3, sofa
type: nacos
nacos:
application: seata-server
server-addr: localhost:8848
namespace: c23f9030-953e-46bb-8c6e-0bf4a8227a8c
group: yhc
username: nacos
password: nacos

  ④进入/bin目录,双击执行seata-server.bat启动

  ⑤打开nacos列表,观察seata服务注册成功

4、服务接入

  ①引入依赖

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

  ②添加seata配置(注意替换nacos配置)

seata:
enabled: true
# Seata 应用编号,默认为 ${spring.application.name}
application-id: ${spring.application.name}
# Seata 事务组编号,用于 TC 集群名
tx-service-group: ${spring.application.name}-group
# 关闭自动代理
enable-auto-data-source-proxy: true
# 服务配置项
service:
# 虚拟组和分组的映射
vgroup-mapping:
seata-user-group: default # config:
# # support: nacos, consul, apollo, zk, etcd3
# type: nacos
# nacos:
# server-addr: localhost:8848
# namespace: c23f9030-953e-46bb-8c6e-0bf4a8227a8c
# group: yhc
# username: nacos
# password: nacos
registry:
# support: nacos, eureka, redis, zk, consul, etcd3, sofa
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
namespace: 1238c7de-5821-452d-8586-639ccca55768
group: yhc
# username: nacos
# password: nacos
# cluster: default

  ③在需要事务管理的地方添加seata注解@GlobalTransactional

  ④在seata-user数据库初始化undo_log表

  ⑤另一个微服务seata-order也按如上操作配置,源码地址:https://gitee.com/yhc910/seata-demo.git

  ⑥启动redis服务、seata-user服务、seata-order服务

四、测试

UserServiceImpl类里,修改如下判断值,验证事务回滚。

1、数据正常提交

结果:账户余额减少,交易记录正常保存

 2、修改判断值为true,抛出异常

结果:账户不动,无交易记录,说明事务已回滚

 3、修改判断值为false,重复操作1

结果:发现id有间隔(注意:我们的业务表的主键id是自增),是因为seata是先将数据插入后,事务回滚做的删除,所以该删除数据的id无记录。

此次接入有比较多的注意点,这里我列下:

1、nacos单机启动命令,需添加 -m standalone 指定模式

2、接入seata的配置,tx-service-group的值与vgroup-mapping需保持一致

3、A服务调用B服务,B服务获取xid为null,是因为xid没被透传,需自定义Feign的RequestInterceptor处理。

String xid = RootContext.getXID();
template.header(RootContext.KEY_XID, xid);

下篇会整合shardingpshere,有兴趣的可以先看看这篇文章:https://www.cnblogs.com/yhc-910/p/16543293.html

springboot集成seata1.5.2+nacos2.1.1的更多相关文章

  1. 【springBoot】springBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  2. SpringBoot集成security

    本文就SpringBoot集成Security的使用步骤做出解释说明.

  3. springboot集成Actuator

    Actuator监控端点,主要用来监控与管理. 原生端点主要分为三大类:应用配置类.度量指标类.操作控制类. 应用配置类:获取应用程序中加载的配置.环境变量.自动化配置报告等与SpringBoot应用 ...

  4. SpringBoot集成Shiro并用MongoDB做Session存储

    之前项目鉴权一直使用的Shiro,那是在Spring MVC里面使用的比较多,而且都是用XML来配置,用Shiro来做权限控制相对比较简单而且成熟,而且我一直都把Shiro的session放在mong ...

  5. SpringBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  6. springboot集成mybatis(二)

    上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...

  7. springboot集成mybatis(一)

    MyBatis简介 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyB ...

  8. springboot集成redis(mybatis、分布式session)

    安装Redis请参考:<CentOS快速安装Redis> 一.springboot集成redis并实现DB与缓存同步 1.添加redis及数据库相关依赖(pom.xml) <depe ...

  9. SpringBoot集成jsp

    一.springBoot集成jsp: 1.修改pom文件 <!--集成jsp所需jar包--> <!--jsp页面使用jstl标签--> <dependency> ...

  10. springboot集成schedule(深度理解)

    背景 在项目开发过程中,我们经常需要执行具有周期性的任务.通过定时任务可以很好的帮助我们实现. 我们拿常用的几种定时任务框架做一个比较: 从以上表格可以看出,Spring Schedule框架功能完善 ...

随机推荐

  1. 文心一言 VS 讯飞星火 VS chatgpt (28)-- 算法导论5.1 3题

    三.假设你希望以1/2的概率输出0与 1.你可以自由使用一个输出0或1的过程 BIASED-RANDOM.它以某概率 p 输出1,概率 1-p 输出0,其中 0<p<1 ,但是 p 的值未 ...

  2. 一分钟学一个 Linux 命令 - mv 和 cp

    前言 大家好,我是god23bin.欢迎来到<一分钟学一个 Linux 命令>系列,今天需要你花两分钟时间来学习下,因为今天要讲的是两个命令,mv 和 cp 命令. mv 什么是 mv 命 ...

  3. 4大数据实战系列-hive安装配置优化

    1 基础环境 1.1 版本预览 Cnetos 6.5 已安装 Hadoop 2.8 已安装集群 Hive 2.3 待安装 Mysql 5.6 已安装 Spark 2.1.1 已安装 1.2 机器环境 ...

  4. uniapp微信小程序转支付宝小程序踩坑(持续更新)

    首先第一个,真有被折磨到! // 微信正常使用,支付宝不行 <image src="https://static.dabapiao.com/images/coupon-index.pn ...

  5. 从2PC和容错共识算法讨论zookeeper中的Create请求

    最近在读<数据密集型应用系统设计>,其中谈到了zookeeper对容错共识算法的应用.这让我想到之前参考的zookeeper学习资料中,误将容错共识算法写成了2PC(两阶段提交协议),所以 ...

  6. 写博文之必备技能MarkDown

    前言 Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版.它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML.PDF 以及本身的 .md 格式的文 ...

  7. PHP file_put_contents()写入配置文件

    php把提交的数据写入到配置文件中 在后台可以设置网站的基本信息,例如:title,keywords,copyright.等信息,这些信息只是一条数据,存入数据库耗费资源,直接写入到php文件中. 创 ...

  8. Oracle sql 错误 : ORA-01861: 文字与格式字符串不匹配和日期与字符串互转问题解决

    正确的要这样的: public int update(String ceratedate); <update id="update" parameterType=" ...

  9. docker ps --no-trunc 与 docker ps

    转载请注明出处: docker ps --no-trunc与docker ps之间的区别在于输出结果的格式. docker ps: 默认情况下,docker ps命令以截断的方式显示结果.这意味着容器 ...

  10. 【EF Core】主从实体关系与常见实体关系的区别

    上次老周扯了有关主.从实体的话题,本篇咱们再挖一下,主.从实体之间建立的关系,跟咱们常用的一对一.一对多这些关系之间有什么不同. 先看看咱们从学习数据库开始就特熟悉的常用关系--多对多.一对一.一对多 ...