栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringCloud Alibaba - Seata分布式事务搭建及应用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringCloud Alibaba - Seata分布式事务搭建及应用

SpringCloud Alibaba系列篇
  • SpringCloud Alibaba - Nacos搭建及服务注册发现
  • SpringCloud Alibaba - openfeign服务间相互调用
  • SpringCloud Alibaba - Seata分布式事务搭建及应用
  • SpringCloud Alibaba - 整合gateway服务网关
  • SpringCloud Alibaba - 搭建Sentinel监控流量控制
一分钟了解Seata

官网:http://seata.io
官方介绍

Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳的度过历年的双11,对各BU业务进行了有力的支撑。
经过多年沉淀与积累,商业化产品先后在阿里云、金融云进行售卖。
2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备。


Seata主要应用于:分布式中事务控制,在多个独立事务之上建立全局事务逻辑,利用undo_log表进行数据回滚

资料下载

CSDN下载:seata-1.3.0.zip seata-server-1.3.0.zip seata-server-1.3.0.tar.gz
GitHub下载:seata-1.3.0.zip seata-server-1.3.0.zip seata-server-1.3.0.tar.gz

Windows下搭建 1. 创建seata数据库
  • 新建seata数据库(库名自定义)
  • 导入sql文件:seata-1.3.0/script/server/db/mysql.sql
2. 修改配置注册至Nacos

seata-server-1.3.0/seata/conf/registry.conf

registry {
  type = "nacos"

  nacos {
    application = "seata-server"
    serverAddr = "127.0.0.1:8848"
    group = "SEATA_GROUP"
    namespace = ""
    cluster = "default"
    username = ""
    password = ""
  }
  file {
    name = "file.conf"
  }
}

config {
  type = "nacos"

  nacos {
    serverAddr = "127.0.0.1:8848"
    namespace = ""
    group = "SEATA_GROUP"
    username = ""
    password = ""
  }
  
  file {
    name = "file.conf"
  }
}
3. 配置数据库连接相关

复制txt文件至服务端的conf下
txt文件路径(源码):seata-1.3.0/script/config-center/config.txt
复制至(server端) -> seata-server-1.3.0/seata/conf/config.txt

# 修改为db模式
store.mode=db
# 如mysql8.0+,则修改为:com.mysql.cj.jdbc.Driver
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true
store.db.user=username
store.db.password=password
4. 配置sh脚本,将seata配置推送至nacos
  • 复制sh执行文件至服务端的conf下
  • sh文件路径(源码):seata-1.3.0/script/config-center/nacos/nacos-config.sh
  • 复制至(server端) -> seata-server-1.3.0/seata/conf/nacos-config.sh
  • 86行添加conf:cat ( d i r n a m e " (dirname " (dirname"PWD")/conf/config.txt
  • 在conf目录下执行:sh nacos-config.sh -h 127.0.0.1 -p 8848

注:参数ip端口为nacos服务端地址,windows可安装git来执行sh命令

5. 修改conf/file.conf
store {
  mode = "db"

  db {
    datasource = "druid"
    dbType = "mysql"
    # 如mysql8.0+,则修改为:com.mysql.cj.jdbc.Driver
    driverClassName = "com.mysql.jdbc.Driver"
    url = "jdbc:mysql://127.0.0.1:3306/seata"
    user = "mysql"
    password = "mysql"
    minConn = 5
    maxConn = 30
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }

}
Linux下搭建

单机或集群搭建,无特定区别,仅在其他机器同样配置即可

1. 准备工作
# 配置并启动Nacos注册中心...此处省略

# 创建seata目录
[hyuser@jsvm-hynode-011 /]$ sudo mkdir /data/seata && cd /data/seata

# 下载seata源码及server端压缩包;参考上文【资料下载】,如已下载可上传
[hyuser@jsvm-hynode-011 seata]$ wget https://github.com/seata/seata/archive/refs/tags/v1.3.0.zip
[hyuser@jsvm-hynode-011 seata]$ wget https://github.com/seata/seata/releases/download/v1.3.0/seata-server-1.3.0.tar.gz

# 安装zip解压工具
[hyuser@jsvm-hynode-011 seata]$ sudo yum install zip unzip -y
# 解压
[hyuser@jsvm-hynode-011 seata]$ sudo unzip seata-1.3.0.zip
[hyuser@jsvm-hynode-011 seata]$ sudo tar -zxvf seata-server-1.3.0.tar.gz

# 进入mysql并导入sql文件
[hyuser@jsvm-hynode-011 seata]$ mysql -useatau -p
mysql> use seatadata;
Database changed
mysql> source /data/seata/seata-1.3.0/script/server/db/mysql.sql
2. 配置nacos注册中心
# 修改配置文件
[hyuser@jsvm-hynode-011 seata]$ sudo vim seata/conf/registry.conf


registry {
  type = "nacos"

  nacos {
    application = "seata-server"
    serverAddr = "10.2.1.122:880"
    group = "SEATA_GROUP"
    namespace = ""
    cluster = "default"
    username = ""
    password = ""
  }
  file {
    name = "file.conf"
  }
}

config {
  type = "nacos"

  nacos {
    serverAddr = "10.2.1.122:880"
    namespace = ""
    group = "SEATA_GROUP"
    username = ""
    password = ""
  }
  file {
    name = "file.conf"
  }
}

serverAddr地址说明:本文10.2.1.122:880指向nginx且分发至不同服务器的nacos服务。
如单机nacos或未配置naginx负载均衡则指向具体nacos服务器地址

3. 配置数据库连接相关
# 复制config.txt文件至server端
[hyuser@jsvm-hynode-011 seata]$ sudo cp seata-1.3.0/script/config-center/config.txt ./seata/conf/
# 修改数据库配置信息
[hyuser@jsvm-hynode-011 seata]$ sudo vim seata/conf/config.txt

# 修改为db模式
store.mode=db
# 如mysql8.0+,则修改为:com.mysql.cj.jdbc.Driver
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true
store.db.user=username
store.db.password=password
4. 将seata的配置推送至nacos统一配置中心
# 复制config.sh脚本至server端下
[hyuser@jsvm-hynode-011 seata]$ sudo cp seata-1.3.0/script/config-center/nacos/nacos-config.sh ./seata/conf/
# 编辑config.sh脚本修改config.txt地址
[hyuser@jsvm-hynode-011 seata]$ sudo vim ./seata/conf/nacos-config.sh

# 86行处,修改为:/conf/config.txt
for line in $(cat $(dirname "$PWD")/conf/config.txt | sed s/[[:space:]]//g); do

# 添加sh可执行权限
[hyuser@jsvm-hynode-011 seata]$ sudo chmod +x seata/conf/nacos-config.sh
# 推送至nacos配置中心
[hyuser@jsvm-hynode-011 conf]$ cd seata/conf/
# -h nacos服务ip地址    -p nacos服务端口
[hyuser@jsvm-hynode-011 conf]$ sh nacos-config.sh -h 10.2.1.122 -p 880
5. 修改file.conf
[hyuser@jsvm-hynode-011 conf]$ sudo vim file.conf

store {
  mode = "db"
  
  db {
    datasource = "druid"
    dbType = "mysql"
    driverClassName = "com.mysql.jdbc.Driver"
    url = "jdbc:mysql://127.0.0.1:3306/seata"
    user = "mysql"
    password = "mysql"
    minConn = 5
    maxConn = 30
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  } 
  
}
6. 启动SeataServer
# 创建log目录
[hyuser@jsvm-hynode-011 conf]$ sudo mkdir ../logs && cd ../logs
[hyuser@jsvm-hynode-011 logs]$ sudo touch seata.log
# 赋予所有人可读写权限
[hyuser@jsvm-hynode-011 logs]$ sudo chmod 666 seata.log
[hyuser@jsvm-hynode-011 logs]$ nohup ../bin/seata-server.sh -p 8091 -n 1 > seata.log 2>&1 &
# 查看控制台日志
[hyuser@jsvm-hynode-011 logs]$ tail -f seata.log

-p 8091:修改seata监听端口。默认端口:8091
-n 1:server node;在多个 TC Server 时,需区分各自节点,用于生成不同区间的 transactionId 事务编号,以免冲突

7. 搭建seata集群

按上述步骤依次搭建,下列操作无需在其他节点操作

  • 创建并导入seata数据库
  • 将seata的配置推送至nacos统一配置中心
8. 启动其他节点seata
# 节点2
[hyuser@jsvm-hynode-012 logs]$ nohup ../bin/seata-server.sh -p 8091 -n 2 > seata.log 2>&1 &
# 节点3
[hyuser@jsvm-hynode-013 logs]$ nohup ../bin/seata-server.sh -p 8091 -n 3 > seata.log 2>&1 &

Coding如何使用

所有微服务业务数据库均需要导入事务表
sql文件路径(源码):seata-1.3.0/script/client/at/db/mysql.sql
pom.xml


    com.alibaba.cloud
    spring-cloud-starter-alibaba-seata

application.yml

seata:
  enabled: true
  tx-service-group: ${spring.application.name}
  enable-auto-data-source-proxy: true
  config:
    type: nacos
    nacos:
      namespace:
      server-addr: 127.0.0.1:8848
      group: SEATA_GROUP
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 127.0.0.1:8848

Java Demo

@GlobalTransactional
@PostMapping("account/save")
public Object accountSave() {
    accountService.save2(new Account(954L, "123"));
    accountServiceFeign.save();
    return "SUCCESS";
}

@GlobalTransactional:添加此注解即可创建全局事务,遇到异常时可实现回滚

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351051.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号