Chao's Blog Chao's Blog
首页
  • vue

    • vue路由
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • java
  • spring
  • springboot
  • springcloud
  • git
  • maven
  • nginx
  • tomcat
  • springmvc
  • jvm
  • 图数据库
  • mysql数据库
  • redis数据库
  • windows下docker安装nginx并挂载目录
  • linux命令
  • linux安装软件
  • linux脚本
  • idea
  • vscode
  • 归档
  • 综合项目

    • 若依项目
    • mall项目
  • java
  • mybatis
  • xxl-job
  • mybatis
GitHub (opens new window)

~chao

永远菜鸟,不断努力~
首页
  • vue

    • vue路由
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • java
  • spring
  • springboot
  • springcloud
  • git
  • maven
  • nginx
  • tomcat
  • springmvc
  • jvm
  • 图数据库
  • mysql数据库
  • redis数据库
  • windows下docker安装nginx并挂载目录
  • linux命令
  • linux安装软件
  • linux脚本
  • idea
  • vscode
  • 归档
  • 综合项目

    • 若依项目
    • mall项目
  • java
  • mybatis
  • xxl-job
  • mybatis
GitHub (opens new window)
  • java

  • spring

  • springboot

    • springboot注解
    • aop低版本方法内调用方法捕获不到的解决办法
    • springboot 后端解决跨域问题
    • springboot 整合seata
    • springboot的核心注解
    • Spring boot admin 安全配置(非注册中心模式)
    • Nacos和Email整合Spring Boot Admin
    • springboot通过接口重新加载某个bean
  • springcloud

  • git

  • maven

  • nginx

  • tomcat

  • springmvc

  • jvm

  • 正则表达式

  • 消息中间件

  • python

  • 后端
  • springboot
~chao
2022-11-14

springboot 整合seata

参考文章:https://www.cnblogs.com/yhc-910/p/16735445.html (opens new window)
(完全copy)
一、前言
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",观察到如下日志,无报错,即启动成功
image.png
⑤上图标出的即为nacos管理界面的地址,账号密码均为nacos,登录成功
image.png
⑥新建命令空间,我这里加的"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启动
image.png
⑤打开nacos列表,观察seata服务注册成功
image.png
4、服务接入
①引入依赖
io.seata seata-spring-boot-starter 1.5.2
②添加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
image.png
④在seata-user数据库初始化undo_log表
⑤另一个微服务seata-order也按如上操作配置,源码地址:https://gitee.com/yhc910/seata-demo.git
⑥启动redis服务、seata-user服务、seata-order服务
四、测试
UserServiceImpl类里,修改如下判断值,验证事务回滚。
image.png
1、数据正常提交
结果:账户余额减少,交易记录正常保存
image.png
image.png
2、修改判断值为true,抛出异常
结果:账户不动,无交易记录,说明事务已回滚
image.png
3、修改判断值为false,重复操作1
结果:发现id有间隔(注意:我们的业务表的主键id是自增),是因为seata是先将数据插入后,事务回滚做的删除,所以该删除数据的id无记录。
image.png

此次接入有比较多的注意点,这里我列下:
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);

编辑 (opens new window)
上次更新: 2024/01/26, 05:03:22
springboot 后端解决跨域问题
springboot的核心注解

← springboot 后端解决跨域问题 springboot的核心注解→

最近更新
01
python使用生成器读取大文件-500g
09-24
02
Windows环境下 Docker Desktop 安装 Nginx
04-10
03
使用nginx部署多个前端项目(三种方式)
04-10
更多文章>
Theme by Vdoing | Copyright © 2022-2024 chaos | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式