SpringCloud-Alibaba整合Nacos+Seata+Mybatis-Plus

2023-11-11

Seata Example

项目说明

本项目演示如何使用 Seata Starter 完成 Spring Cloud 应用的分布式事务接入。

Seata 是 阿里巴巴 开源的 分布式事务中间件,以 高效 并且对业务 0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题。

准备工作

如果要用注册中心和配置中心,推荐Nacos,目前最新版本1.2.0,在此之前,确保Nacos已成功启动。

在运行此示例之前,你需要先完成如下几步准备工作:

  1. 配置数据库

  2. 创建 UNDO_LOG 表

  3. 创建 示例中 业务所需要的数据库表

  4. 启动 Seata Server

配置数据库

首先,你需要有一个支持 InnoDB 引擎的 MySQL 数据库。

注意: 实际上,Seata 支持不同的应用使用完全不相干的数据库,但是这里为了简单地演示一个原理,所以我们选择了只使用一个数据库。

hszsd-account-serverhszsd-order-serverhszsd-product-server 这三个应用中的 resources 目录下的 application.yml 文件中的如下配置修改成你运行环境中的实际配置。

mysql.server.ip=your mysql server ip address
mysql.server.port=your mysql server listening port
mysql.db.name=your database name for test

mysql.user.name=your mysql server username
mysql.user.password=your mysql server password

创建 undo_log 表

Seata AT 模式 需要使用到 undo_log 表。

-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  `ext` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

创建 示例中 业务所需要的数据库表

创建数据库表文件在工程sql目录下。

启动 Seata Server

点击这个页面 https://github.com/seata/seata/releases,下载最新版本的 Seata Server 端,我这里使用的版本是1.2.0

进入解压之后的 bin 目录,执行如下命令来启动, 所有启动参数为可选项。

sh seata-server.sh -p $LISTEN_PORT -m $MODE(file or db) -h $HOST -e $ENV

-p seata-server 监听服务端口号
-m 存储模式,可选值:file、db。file 用于单点模式,db用于ha模式,当使用db存储模式,需要修改配置中store配置节点的数据库配置,同时在数据库中初始化global_table、branch_table和
lock_table

-h 用于解决seata-server和业务侧跨网络问题,其配置的host值直接显示到注册中心的服务可用地址host,当跨网络时这里需要配置为公网IP或NATIP,若都在同一局域网则无需配置
-e 用于解决多环境配置中心隔离问题
在这个示例中,采用如下命令来启动 Seata Server

sh seata-server.sh -p 8091 -m file

注意 如果你修改了endpoint且注册中心使用默认file类型,那么记得需要在各个示例工程中的 file.conf 文件中,修改 grouplist 的值(当registry.conf 中registry.type 或 config.type 为file 时会读取内部的file节点中的文件名,若type不为file将直接从配置类型的对应元数据的注册配置中心读取数据),推荐大家使用 nacos 作为配置注册中心。

运行示例

分别运行 hszsd-account-serverhszsd-order-serverhszsd-product-serverhszsd-business-server 这三个应用的 Main 函数,启动示例。

启动示例后,通过 HTTP 的 GET 方法访问client服务,执行如下请求url:

http://127.0.0.1:8081/test/testCommit

如何验证分布式事务成功?

Xid 信息是否成功传递

hszsd-account-serverhszsd-order-serverhszsd-product-server 三个 服务的 Controller 中,第一个执行的逻辑都是输出 RootContext 中的 Xid 信息,如果看到都输出了正确的 Xid 信息,即每次都发生变化,且同一次调用中所有服务的 Xid 都一致。则表明 Seata 的 Xid 的传递和还原是正常的。

数据库中数据是否一致

在本示例中,我们模拟了一个用户购买货物的场景,ProductService 负责扣减库存数量,OrderService 负责保存订单,AccountService 负责扣减用户账户余额。

为了演示样例,我们在 OrderService 和 AccountService 中 使用 Random.nextBoolean() 的方式来随机抛出异常(详情见工程hszsd-business-server),模拟了在服务调用时随机发生异常的场景。

如果分布式事务生效的话, 那么以下等式应该成立

  • 用户原始金额(600) = 用户现存的金额 + 货物单价 (2) * 订单数量 * 每单的货物数量(2)

  • 货物的初始数量(10) = 货物的现存数量 + 订单数量 * 每单的货物数量(2)

对 Spring Cloud 支持点

  • 通过 Spring MVC 提供服务的服务提供者,在收到 header 中含有 Seata 信息的 HTTP 请求时,可以自动还原 Seata 上下文。

  • 支持服务调用者通过 RestTemplate 调用时,自动传递 Seata 上下文。

  • 支持服务调用者通过 FeignClient 调用时,自动传递 Seata 上下文。

  • 支持 SeataClient 和 Hystrix 同时使用的场景。

  • 支持 SeataClient 和 Sentinel 同时使用的场景。

Seata 服务端配置

  • 解压seata包,进入conf目录。
  • 修改file.conf文件
## transaction log store, only used in seata-server
store {
  ## store mode: file、db
  mode = "db"

  ## file store property
  file {
    ## store location dir
    dir = "sessionStore"
    # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
    maxBranchSessionSize = 16384
    # globe session size , if exceeded throws exceptions
    maxGlobalSessionSize = 512
    # file buffer size , if exceeded allocate new buffer
    fileWriteBufferCacheSize = 16384
    # when recover batch read size
    sessionReloadReadSize = 100
    # async, sync
    flushDiskMode = async
  }

  ## database store property
  db {
    ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.
    datasource = "druid"
    ## mysql/oracle/postgresql/h2/oceanbase etc.
    dbType = "mysql"
    driverClassName = "com.mysql.jdbc.Driver"
    url = "jdbc:mysql://127.0.0.1:3306/h_seata"
    user = "root"
    password = "123456"
    minConn = 5
    maxConn = 30
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }
}
  • 修改registry.conf
registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"

  nacos {
    application = "seata-server"
    serverAddr = "192.168.0.248:8848"
    namespace = ""
    cluster = "hejr-tx-group"
    username = "nacos"
    password = "nacos"
  }
  eureka {
    serviceUrl = "http://localhost:8761/eureka"
    application = "default"
    weight = "1"
  }
  redis {
    serverAddr = "localhost:6379"
    db = 0
    password = ""
    cluster = "default"
    timeout = 0
  }
  zk {
    cluster = "default"
    serverAddr = "127.0.0.1:2181"
    sessionTimeout = 6000
    connectTimeout = 2000
    username = ""
    password = ""
  }
  consul {
    cluster = "default"
    serverAddr = "127.0.0.1:8500"
  }
  etcd3 {
    cluster = "default"
    serverAddr = "http://localhost:2379"
  }
  sofa {
    serverAddr = "127.0.0.1:9603"
    application = "default"
    region = "DEFAULT_ZONE"
    datacenter = "DefaultDataCenter"
    cluster = "default"
    group = "SEATA_GROUP"
    addressWaitTime = "3000"
  }
  file {
    name = "file.conf"
  }
}

config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"

  nacos {
    serverAddr = "192.168.0.248:8848"
    namespace = ""
    group = "SEATA_GROUP"
    username = "nacos"
    password = "nacos"
  }
  consul {
    serverAddr = "127.0.0.1:8500"
  }
  apollo {
    appId = "seata-server"
    apolloMeta = "http://192.168.1.204:8801"
    namespace = "application"
  }
  zk {
    serverAddr = "127.0.0.1:2181"
    sessionTimeout = 6000
    connectTimeout = 2000
    username = ""
    password = ""
  }
  etcd3 {
    serverAddr = "http://localhost:2379"
  }
  file {
    name = "file.conf"
  }
}
  • 启动seata,配置中心使用file,根据环境运行不同的脚本,这里演示windows。
./bin/seata-server.bat -h 127.0.0.1 -p 8091 -m file

Nacos启动配置

  • 解压Nacos压缩包,进入conf目录
  • 新建数据库(我本地名称为h_nacos),执行nacos-mysql.sql脚本
  • 修改application.properties,我只贴出修改的部分
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/h_nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
  • 进入bin目录,双击startup.cmdsql
  • 浏览器访问:localhost:8848/nacos,默认用户名和密码均为nacos

Seata之配置中心Nacos

  • 进入seata官网下载对应版本的config.txtnacos-config.shnacos-config.py
  • 修改config.txt(只贴出修改部分,h_seata脚本在sql目录下)
store.mode=file
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/h_seata?useUnicode=true
store.db.user=root
store.db.password=123456
  • 把上面3个文件放到seata目录下,执行如下脚本
sh ./nacos-config.sh -h 192.168.0.248 -p 8848 -g SEATA_GROUP -u nacos -w nacos
  • 如果成功,在Nacos配置管理下能查看到,失败的话,自己看下报错信息
    在这里插入图片描述

  • 启动 Seata-server

./bin/seata-server.sh -h 192.168.1.180 -p 8091 -m db
  • Client端配置见Demo工程中

Demo工程地址

Demo工程地址:https://gitee.com/hejr.cn.com/hszsd-cloud-seata-demo.git
如果链接失效,点这里:
链接: https://pan.baidu.com/s/1LTWgbI2mCAj7BgKw_tMmtg 提取码: tqie

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringCloud-Alibaba整合Nacos+Seata+Mybatis-Plus 的相关文章

随机推荐

  • Java图形化界面编程一

    目录 一 介绍 二 AWT编程 2 1AWT介绍 2 2 AWT继承体系 2 3 Container容器 2 3 1 Container继承体系 2 3 2 常见API 2 3 3 容器演示 2 4 LayoutManager布局管理器 2
  • Keras使用VGG16模型预测自己的图片

    Keras使用VGG16模型预测自己的图片 环境 Win10 Miniconda3 Pycharm2018 02 代码如下 from keras applications vgg16 import VGG16 from keras prep
  • 计算机视觉课程设计:基于Mediapipe的体感游戏设计

    演示视频 计算机视觉课程设计 基于Mediapipe的体感游戏设计 哔哩哔哩 bilibili
  • SpringCloud微服务架构标准版本拓扑图

    本图是公司需要 自己整理的SpringCloud微服务架构标准版本拓扑图 有 eddx格式 需要请私信 为了方便截了个jpg 希望对你有所帮助 喜欢的朋友点赞收藏转发
  • Cow Marathon(树的直径)(最长路)

    Cow Marathon Time Limit 2000MS Memory Limit 30000KB 64bit IO Format lld llu Submit Status Description After hearing abou
  • 【树莓派】利用tesseract进行汉字识别

    树莓派 利用tesseract进行汉字识别 安装tesseract库 识别图像中的汉字 安装tesseract库 安装tesseract库和它的python封装 sudo apt install tesseract ocr fix miss
  • Python学习-----文件操作(读写定位篇)

    目录 前言 1 打开文件 open 关闭文件 close 2 文件的读取 文件变量名 f 1 整体读取 read 2 读取一行 readline 3 读取多行 readlines 3 文件的写入 文件变量名f write 4 判断文件的可读
  • 稀疏矩阵的存储格式(Sparse Matrix Formats)

    稀疏矩阵的存储格式 Sparse Matrix Storage Formats 1 Coordinate Format COO 这种存储方式的主要优点是灵活 简单 仅存储非零元素以及每个非零元素的坐标 使用3个数组进行存储 values r
  • 解决使用OpenCV-Python外接摄像头打不开问题 re_MSMF::grabFrame videoio(MSMF): can‘t grab frame. Error: -1072873822

    记录在学习django opencv做人脸识别时遇到了以下错误 re MSMF grabFrame videoio MSMF can t grab frame Error 1072873822 直接在 py文件运行 能使用本机的摄像头 放到
  • java Image转byte

    public static byte getImageToByteArr Image src throws IOException int width int src getWidth null int height int src get
  • Flink学习19:算子介绍keyBy

    1 keyBy简介 主要作用 把相同的数据 汇总到相同的分区中 数据本来是分布在不同的slot中 keyBy会把相同的数据拉到相同的slot中 2 keyBy的使用 在使用keyBy时候 需要向keyBy传递一个参数 告诉其按照哪个字段进行
  • 2022-01-12 网工基础(二十)GRE原理与配置 VRRP原理与配置

    一 GRE原理与配置 IPSec VPN 用于在两个端点之间提供安全的 IP 通信 但只能加密并传播单播数据无法加密和传输语音 视频 动态路由协议信息等组播数据流量 通用路由封装协议 GRE Generic Routing Encapsul
  • ​路由器是如何工作的?

    什么叫路由 路由器的英文是 Router 也就是 找路的工具 找什么路 寻找各个网络节点之间的路 换句话说 路由器就像是快递中转站 包裹会经过一个个的中转站 从遥远的地方寄到你家附近 数据包也是一样 路由器是连接两个网络的硬件设备 承担寻路
  • Linux部署东方通TongWeb

    Linux部署东方通TongWeb TongWeb 一 软件版本 二 东方通TongWeb7部署流程 2 1 安装JDK 2 1 1 下载文件 2 1 2 查看当前JDK版本 2 1 3 卸载JDK 2 3 1 卸载JDK 需root权限
  • mmsegmentation 训练自己的数据集

    一 MMSegmentation是什么 MMSegmentation 是一个基于 PyTorch 的语义分割开源工具箱 它是 OpenMMLab 项目的一部分 他与MMDetection类似 集成了各种语义分割算法 可以快速验证语义分割效果
  • 关于HTML5中表单提交的几种验证方法介绍

    转自 微点阅读 https www weidianyuedu com 一 自动验证 我们可以通过元素的属性设置 进行表单提交的验证 required属性 此属性可以应用在大多数输入元素上 除了隐藏元素 图片元素按钮上 提交时 如果元素为空
  • MVVM和MVC有什么区别?

    前言 模型 视图 视图模型 Model View ViewModel MVVM 本质上是MVC 模型 视图 控制器 的改进版 其最重要的特性是数据绑定 data binding 此外还包括依赖注入 路由配置 数据模板等一些特性 从MVC到M
  • Python+Neo4j构建时光网TOP100电影知识图谱

    Python Neo4j构建时光网TOP100电影知识图谱 环境 1 Neo4j 3 5 6 2019年6月25日 2 Java 1 8 0 181 3 Annaconda 3 一 准备工作 Neo4j安装 https blog csdn
  • 随机森林详解

    原文链接 机器学习之随机森林 RF 详解 文章目录 一 bagging算法 1 简介 2 bagging算法流程 二 随机森林 1 简介 2 CART分类树的生成 3 总结 常用集成学习包括Bagging Boosting Stacking
  • SpringCloud-Alibaba整合Nacos+Seata+Mybatis-Plus

    SpringCloud Alibaba整合Nacos Seata Mybatis Plus Seata Example 项目说明 准备工作 配置数据库 创建 undo log 表 创建 示例中 业务所需要的数据库表 启动 Seata Ser