一、前言

  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. spring-boot整合mybatis(1)

    sprig-boot是一个微服务架构,加快了spring工程快速开发,以及简便了配置.接下来开始spring-boot与mybatis的整合. 1.创建一个maven工程命名为spring-boot- ...

  2. SpringBoot整合Mybatis之项目结构、数据源

    已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...

  3. springboot整合mq接收消息队列

    继上篇springboot整合mq发送消息队列 本篇主要在上篇基础上进行activiemq消息队列的接收springboot整合mq发送消息队列 第一步:新建marven项目,配置pom文件 < ...

  4. springboot整合mybaits注解开发

    springboot整合mybaits注解开发时,返回json或者map对象时,如果一个字段的value为空,需要更改springboot的配置文件 mybatis: configuration: c ...

  5. SpringBoot整合Redis、ApachSolr和SpringSession

    SpringBoot整合Redis.ApachSolr和SpringSession 一.简介 SpringBoot自从问世以来,以其方便的配置受到了广大开发者的青睐.它提供了各种starter简化很多 ...

  6. SpringBoot整合ElasticSearch实现多版本的兼容

    前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...

  7. SpringBoot整合Kafka和Storm

    前言 本篇文章主要介绍的是SpringBoot整合kafka和storm以及在这过程遇到的一些问题和解决方案. kafka和storm的相关知识 如果你对kafka和storm熟悉的话,这一段可以直接 ...

  8. SpringBoot整合SpringCloud搭建分布式应用

    什么是SpringCloud? SpringCloud是一个分布式的整体解决方案.SpringCloud为开发者提供了在分布式系统中快速构建的工具,使用SpringCloud可以快速的启动服务或构建应 ...

  9. SpringBoot整合RabbitMQ-整合演示

    本系列是学习SpringBoot整合RabbitMQ的练手,包含服务安装,RabbitMQ整合SpringBoot2.x,消息可靠性投递实现等三篇博客. 学习路径:https://www.imooc. ...

  10. SpringBoot整合Swagger2,再也不用维护接口文档了!

    前后端分离后,维护接口文档基本上是必不可少的工作.一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了.当然这是一种非常理想的状态,实际开发中却很 ...

随机推荐

  1. Java的CAS操作

    介绍 CAS 技术是为了解决问题而生的,通过 CAS 我们可以以无锁的方式,保证对共享数据进行 "读取 - 修改 - 写回" 操作序列的正确性. CAS 是乐观锁设计思想的实现.C ...

  2. 7-8 估值一亿的AI核心代码

    题目描述: 以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多余空格:把相邻单词间的多个空格 ...

  3. SQL注入原理及利用方式

    前言 在Web表单递交或输入域名或页面请求的查询字符串,通过后端语言连接数据库并查询数据,攻击者可利用此漏洞拼接恶意语句获取大量数据. SQL注入漏洞 在表单页面或者存在参数传递的地方可能存在SQL注 ...

  4. 在 VS Code 里逛知乎、发文章?Zhihu on VSCode 来啦!重新定义内容创作!

    本文为 牛岱 的原创文章 在2020年2月10日首发于"玩转VS Code"知乎专栏 你是否已经厌倦了知乎 Web 端文本编辑器糟糕的使用体验和时而出现的奇怪 Bug? 身为程序员 ...

  5. WPF在win10/11上启用模糊特效 适配Dark/Light Mode

    先看效果图 win11: win10: 大佬们已经总结了许多在WPF上开启亚克力效果的方法,本文只是做一些填坑和适配工作. 正文开始 先来看看部分版本Windows的模糊效果和我的适配方案: 1).早 ...

  6. Devexpress如何获取RadioGroup选中项的值和显示值

    分享一个小技巧,如题目所示,DEV控件如何获取RadioGroup选中项的值和显示值.也是在网上找了很久,看了大家都是通过SelectIndex的值定位选中的按钮,并没有说取选中项的值,所以自己研究了 ...

  7. httpx的两个坑(httpx.ReadTimeout; SSL: CERTIFICATE_VERIFY_FAILED)

    关于python异步网络请求库httpx的两个坑 其一:httpx.ReadTimeout 实测发现,网络不稳定的情况下,极其容易出现该错误. 相对于requests库, httpx库是有默认的超时时 ...

  8. Net 编译器平台 --- Roslyn

    引言 最近做一个功能想要动态执行C#脚本,就是预先写好代码片段,在程序运行时去执行代码段,比如像这样(以下代码为伪代码): string scriptText = "int a = 1;in ...

  9. 初识常量变量、字符串、ASCII编码表、转义字符表

    一.常量.变量 1.枚举常量(enum) 枚举常量不能更改,枚举常量所创造出的变量可以更改 正确 错误 2.常变量 3.#define定义的标示变量 二.数组 "abc"--'a' ...

  10. ChatGPT帮助工程师写代码:从功能模块完善到成功执行,实现需求

    在软件开发过程中,经常会遇到需要完善功能模块.调试代码和解决问题的情况.为了提高效率,我们可以借助人工智能技术,例如OpenAI的ChatGPT语言模型,来协助我们进行代码编写和调试.本文将介绍一个案 ...