首页 > 其他分享 >springboot集成seata1.5.2+nacos2.1.1

springboot集成seata1.5.2+nacos2.1.1

时间:2023-08-07 17:45:17浏览次数:51  
标签:group seata nacos2.1 seata1.5 db nacos server mysql springboot

一、前言

  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

标签:group,seata,nacos2.1,seata1.5,db,nacos,server,mysql,springboot
From: https://www.cnblogs.com/yhc-910/p/17612025.html

相关文章

  • springboot智能3D导诊系统源码,基于规则模板的开发原理
    互联网智慧3D导诊系统源码通过智能导诊,进行自助问询及挂号服务,减轻导诊台护士压力,挂号更加方便快捷。技术架构:springboot+redis+mybatisplus+mysql+RocketMQ  智慧导诊系统开发原理导诊系统从原理上大致可分为基于规则模板和基于数据模型两类。1、基于规则推理的方法通过人工建......
  • Springboot-Mybatis(idea)-自学笔记
    Spring-boot-Mybaties快速入门使用Mybatis查询所有用户数据准备工作(创建springboot工程,数据库表格user,实体类User)引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)编写SQL语句(注解/XML)单元测试packagecom.example;importcom.example.mapper.UserMapper;impo......
  • SpringBoot3基础用法
    技术和工具「!喜新厌旧」一、背景最近在一个轻量级的服务中,尝试了最新的技术和工具选型;即SpringBoot3,JDK17,IDEA2023,Navicat16,虽然新的技术和工具都更加强大和高效,但是适应采坑的过程总是枯燥的;【环境一览】首先框架主体从SpringBoot2升级到SpringBoot3,Java基础环境从JDK8升......
  • SpringBoot3基础用法
    目录一、背景二、环境搭建1、工程结构2、框架依赖3、环境配置三、入门案例1、测试接口2、全局异常3、日志打印3.1日志配置3.2日志打印四、打包运行五、参考源码技术和工具「!喜新厌旧」一、背景最近在一个轻量级的服务中,尝试了最新的技术和工具选型;即SpringBoot3,JDK17,IDEA......
  • SpringBoot Netty socket使用
    SpringBootNettysocket使用Netty是由JBOSS提供的一个java开源框架,现为Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。这里springBoot整合起来使用测试,性能怎么的不怎么了解,至少能用maven引用依......
  • Docker部署SpringBoot项目微服务
     登录linux服务器,进入目录  usr/local目录,创建两个文件夹使用alt+p快捷键,将windows目录中生成的jar包,拖到linux桌面使用cp命令,将linux桌面中jar包,复制到指定目录cplesson01-0.0.1-SNAPSHOT.jar/usr/local/docker/lesson01使用vi命令,编辑dockerfile,制作镜......
  • Docker部署SpringBoot项目准备
     创建一个SpringBoot项目测试程序,在Windows中执行java  -jar  xxx.jar查看效果java-jarlesson01-0.0.1-SNAPSHOT.jar主要代码1、pom.xml文件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0&q......
  • Springboot - mybatis
    目录入门入门1.准备工作(创建springboot工程,数据库表user,实体类user)2.引入Mybatis的相关依赖,配置Mybatis3.编写SQL语句(注解/xml)创建工程时直接引入mybatis依赖:dao层编写mapper:packagecom.chuangzhou.dao;importcom.chuangzhou.pojo.User;importorg.apache.ibati......
  • 一种SpringBoot下Scheduler定时任务优雅退出方案
    背景近期业务中有一个定时任务发现每次服务部署时,偶发性的会触发问题,这里记录一下问题的跟进解决。分析现象该定时任务每2分钟执行一次,完成数据的更新处理。同时服务部署了多个服务器节点,为保证每次只有一个服务器节点上的任务在跑,引入了基于Redis缓存的分布式锁。示例源码@Schedu......
  • 【springBoot】搭建多模块项目指南
    二、多环境配置内容①在reources目录下建立多个配置文件②在pom.xml配置profile节点③mvn命令行打包命令,基于参数进行打包替换占位符mvn-Ucleaninstall-Dmaven.test.skip=true-Pprod④将target目录下的jar包copy出来,执行命令启动,使用的就是不同环境的配置进行启动的......