springboot整合seata1.5.2+nacos2.1.1
一、前言
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的更多相关文章
- spring-boot整合mybatis(1)
sprig-boot是一个微服务架构,加快了spring工程快速开发,以及简便了配置.接下来开始spring-boot与mybatis的整合. 1.创建一个maven工程命名为spring-boot- ...
- SpringBoot整合Mybatis之项目结构、数据源
已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...
- springboot整合mq接收消息队列
继上篇springboot整合mq发送消息队列 本篇主要在上篇基础上进行activiemq消息队列的接收springboot整合mq发送消息队列 第一步:新建marven项目,配置pom文件 < ...
- springboot整合mybaits注解开发
springboot整合mybaits注解开发时,返回json或者map对象时,如果一个字段的value为空,需要更改springboot的配置文件 mybatis: configuration: c ...
- SpringBoot整合Redis、ApachSolr和SpringSession
SpringBoot整合Redis.ApachSolr和SpringSession 一.简介 SpringBoot自从问世以来,以其方便的配置受到了广大开发者的青睐.它提供了各种starter简化很多 ...
- SpringBoot整合ElasticSearch实现多版本的兼容
前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...
- SpringBoot整合Kafka和Storm
前言 本篇文章主要介绍的是SpringBoot整合kafka和storm以及在这过程遇到的一些问题和解决方案. kafka和storm的相关知识 如果你对kafka和storm熟悉的话,这一段可以直接 ...
- SpringBoot整合SpringCloud搭建分布式应用
什么是SpringCloud? SpringCloud是一个分布式的整体解决方案.SpringCloud为开发者提供了在分布式系统中快速构建的工具,使用SpringCloud可以快速的启动服务或构建应 ...
- SpringBoot整合RabbitMQ-整合演示
本系列是学习SpringBoot整合RabbitMQ的练手,包含服务安装,RabbitMQ整合SpringBoot2.x,消息可靠性投递实现等三篇博客. 学习路径:https://www.imooc. ...
- SpringBoot整合Swagger2,再也不用维护接口文档了!
前后端分离后,维护接口文档基本上是必不可少的工作.一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了.当然这是一种非常理想的状态,实际开发中却很 ...
随机推荐
- 小程序 Page "pages/posts/post-detail/post-detail" has not been registered yet.
今使用wx.navigateTo进行页面跳转老是提示Page "pages/posts/post-detail/post-detail" has not been register ...
- 代码随想录算法训练营Day27 回溯算法|39. 组合总和 40.组合总和II 131.分割回文串
代码随想录算法训练营 39. 组合总和 题目链接:39. 组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 ta ...
- 如何基于G6进行双树流转绘制?
1. 背景 业务背景:CRM系统随着各业务条线对线索精细化分配的诉求逐渐增加,各个条线的流向规则会越来越复杂,各个条线甚至整个CRM的线索流转规则急需一种树形的可视化的图来表达. 技术背景:在开发之前 ...
- 为什么说 Go 语言字符串是不可变的?
原文链接: 为什么说 Go 语言字符串是不可变的? 最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢? 这个问题本身并不困难,但对于 ...
- Google Code Prettify 代码高亮插件使用小结
Google Code Prettify 是 Google 的一款代码高亮插件,它由 js 代码和 css 代码构成,用来高亮显示 HTML 页面中的源代码. Google Code Prettify ...
- Vue3 之 响应式 API reactive、 effect源码,详细注释
Vue3之响应式 API reactive. effect源码,详细注释 目录 一.实现响应式 API:reactive.shallowReactive.readonly.shallowReadonl ...
- 一文解开主流开源变更数据捕获技术之Flink CDC的入门使用
@ 目录 概述 定义 什么是CDC? CDC的分类 特性 应用场景 支持数据源 实战 Flink DataStream方式代码示例 FlinkSQL方式代码示例 概述 定义 flink-cdc-con ...
- 【笔试实战】LeetCode题单刷题-编程基础 0 到 1【一】
1768. 交替合并字符串 题目链接 1768. 交替合并字符串 题目描述 给你两个字符串 word1 和 word2 .请你从 word1 开始,通过交替添加字母来合并字符串.如果一个字符串比另一个 ...
- 从数据库中读取数据并写入到Excle电子表格之2
//CC_AutoId, CC_LoginId, CC_LoginPassword, CC_UserName, CC_ErrorTimes, CC_LockDateTime, CC_TestInt ...
- 检测到 #include 错误。请更新 includePath。已为此翻译单元 禁用波形曲线
也有可能是VSCode抽风了 重启就好