Spring Cloud Alibaba 整合Seata 之概念介绍及Seata-server搭建

这篇具有很好参考价值的文章主要介绍了Spring Cloud Alibaba 整合Seata 之概念介绍及Seata-server搭建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

基础介绍

官方文档

模式分类

角色介绍

Seata Server 部署 -  docker-compose 

数据库

服务器

 nacos配置

docker-compose.yaml

启动

后记


前言

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

主要指讲述 seata服务端的搭建以及与springcloud的集成以实现分布式事务控制的过程 

基础介绍

以下部分来自官网,部分来自个人理解

官方文档

中文文档

Seata 是什么

github项目

GitHub - seata/seata: Seata is an easy-to-use, high-performance, open source distributed transaction solution.


组件

模式分类

  • AT:基于支持本地 ACID 事务的关系型数据库。Java 应用,通过 JDBC 访问数据库。整体机制:二阶段提交。   一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。二阶段:提交异步化,非常快速地完成。回滚通过一阶段的回滚日志进行反向补偿。

  • TCC:不依赖于底层数据资源的事务支持,支持把 自定义 的分支事务纳入到全局事务的管理中。

  • SAGA :Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。

  • XA 

角色介绍

seata主要有下面三种角色

  • 事务协调器(TC):维护全局事务和分支事务的状态,驱动全局提交或回滚。
  • 事务管理器(TM):定义全局事务的范围:开始全局事务,提交或回滚全局事务。
  • 资源管理器(RM):管理分支事务处理的资源,与TC交谈以注册分支事务并报告分支事务的状态,并驱动分支事务提交或回滚。

一个分布式事务流程图:

Spring Cloud Alibaba 整合Seata 之概念介绍及Seata-server搭建

TM要求TC开始新的事务。TC生成一个表示全局事务的XID。

XID是通过微服务的调用链传播的。

RM将本地事务注册为XID到TC的相应全局事务的分支。

TM要求TC提交或回滚XID的相应全局事务。

TC驱动XID对应全局事务下的所有分支事务完成分支提交或回滚。

Seata Server 部署 -  docker-compose 

数据库

新建一个mysql数据库 seata,sql脚本


-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(
    `xid`                       VARCHAR(128) NOT NULL,
    `transaction_id`            BIGINT,
    `status`                    TINYINT      NOT NULL,
    `application_id`            VARCHAR(32),
    `transaction_service_group` VARCHAR(32),
    `transaction_name`          VARCHAR(128),
    `timeout`                   INT,
    `begin_time`                BIGINT,
    `application_data`          VARCHAR(2000),
    `gmt_create`                DATETIME,
    `gmt_modified`              DATETIME,
    PRIMARY KEY (`xid`),
    KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
    `branch_id`         BIGINT       NOT NULL,
    `xid`               VARCHAR(128) NOT NULL,
    `transaction_id`    BIGINT,
    `resource_group_id` VARCHAR(32),
    `resource_id`       VARCHAR(256),
    `branch_type`       VARCHAR(8),
    `status`            TINYINT,
    `client_id`         VARCHAR(64),
    `application_data`  VARCHAR(2000),
    `gmt_create`        DATETIME(6),
    `gmt_modified`      DATETIME(6),
    PRIMARY KEY (`branch_id`),
    KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
    `row_key`        VARCHAR(128) NOT NULL,
    `xid`            VARCHAR(128),
    `transaction_id` BIGINT,
    `branch_id`      BIGINT       NOT NULL,
    `resource_id`    VARCHAR(256),
    `table_name`     VARCHAR(32),
    `pk`             VARCHAR(36),
    `status`         TINYINT      NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_status` (`status`),
    KEY `idx_branch_id` (`branch_id`),
    KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `distributed_lock`
(
    `lock_key`       CHAR(20) NOT NULL,
    `lock_value`     VARCHAR(20) NOT NULL,
    `expire`         BIGINT,
    primary key (`lock_key`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);

服务器

创建目录

mkdir -p /apps/seata/{config,data,logs}

 nacos配置

新建一个命名空间 seata-server

Spring Cloud Alibaba 整合Seata 之概念介绍及Seata-server搭建

 在这个命名空间下新建一个配置文件  seataServer.properties 组为  SEATA_GROUP

Spring Cloud Alibaba 整合Seata 之概念介绍及Seata-server搭建

 内容如下:

store.mode=db
#-----db-----
store.db.datasource=druid
store.db.dbType=mysql
# 需要根据mysql的版本调整driverClassName
# mysql8及以上版本对应的driver:com.mysql.cj.jdbc.Driver
# mysql8以下版本的driver:com.mysql.jdbc.Driver
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://mysql:3306/seata?useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
store.db.user= root
store.db.password=113355
# 数据库初始连接数
store.db.minConn=1
# 数据库最大连接数
store.db.maxConn=20
# 获取连接时最大等待时间 默认5000,单位毫秒
store.db.maxWait=5000
# 全局事务表名 默认global_table
store.db.globalTable=global_table
# 分支事务表名 默认branch_table
store.db.branchTable=branch_table
# 全局锁表名 默认lock_table
store.db.lockTable=lock_table
# 查询全局事务一次的最大条数 默认100
store.db.queryLimit=100


# undo保留天数 默认7天,log_status=1(附录3)和未正常清理的undo
server.undo.logSaveDays=7
# undo清理线程间隔时间 默认86400000,单位毫秒
server.undo.logDeletePeriod=86400000
# 二阶段提交重试超时时长 单位ms,s,m,h,d,对应毫秒,秒,分,小时,天,默认毫秒。默认值-1表示无限重试
# 公式: timeout>=now-globalTransactionBeginTime,true表示超时则不再重试
# 注: 达到超时时间后将不会做任何重试,有数据不一致风险,除非业务自行可校准数据,否者慎用
server.maxCommitRetryTimeout=-1
# 二阶段回滚重试超时时长
server.maxRollbackRetryTimeout=-1
# 二阶段提交未完成状态全局事务重试提交线程间隔时间 默认1000,单位毫秒
server.recovery.committingRetryPeriod=1000
# 二阶段异步提交状态重试提交线程间隔时间 默认1000,单位毫秒
server.recovery.asynCommittingRetryPeriod=1000
# 二阶段回滚状态重试回滚线程间隔时间  默认1000,单位毫秒
server.recovery.rollbackingRetryPeriod=1000
# 超时状态检测重试线程间隔时间 默认1000,单位毫秒,检测出超时将全局事务置入回滚会话管理器
server.recovery.timeoutRetryPeriod=1000

 Spring Cloud Alibaba 整合Seata 之概念介绍及Seata-server搭建

docker-compose.yaml

version: "3.1"
services:
  seata-server:
    image: seataio/seata-server
    container_name: seata
    ports:
      - "7091:7091"
      - "8091:8091"
    environment:
    - SEATA_IP=192.168.1.115
    - SEATA_PORT=8091
    - STORE_MODE=file
    volumes:
      - "/usr/share/zoneinfo/Asia/Shanghai:/etc/localtime"
      - "/usr/share/zoneinfo/Asia/Shanghai:/etc/timezone"
      
    networks:
      - dev
networks:
  dev:
    external: true

先把docker-compose up -d服务起起来,然后copy出来配置文件

sudo docker cp seata:/seata-server/resources/ /apps/seata/config/

文件目录是这样子的

Spring Cloud Alibaba 整合Seata 之概念介绍及Seata-server搭建

修改配置文件

 application.yaml :

主要修改 nacos的地址、组和 namespace ,注意namespace配置的是上面nacos中的 id ,而不是名称 

Spring Cloud Alibaba 整合Seata 之概念介绍及Seata-server搭建

 

server:
  port: 7091

spring:
  application:
    name: seata-server

logging:
  config: classpath:logback-spring.xml
  file:
    path: ${user.home}/logs/seata
  extend:
    logstash-appender:
      destination: 127.0.0.1:4560
    kafka-appender:
      bootstrap-servers: 127.0.0.1:9092
      topic: logback_to_logstash

console:
  user:
    username: seata
    password: seata

seata:
  config:
    nacos:
      server-addr: 192.168.1.115:8108
      namespace: 97a1bb6c-2303-4650-bec2-ae67dc67892c
      group: dev
      username: nacos
      password: nacos
      data-id: seataServer.properties
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos

  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 192.168.1.115:8108
      group: dev
      namespace: 97a1bb6c-2303-4650-bec2-ae67dc67892c
      # tc集群名称
      cluster: default
      username: nacos
      password: nacos
  store:
    # support: file 、 db 、 redis
    mode: db
    db:
      datasource: seata
      dbType: mysql
      # 需要根据mysql的版本调整driverClassName
      # mysql8及以上版本对应的driver:com.mysql.cj.jdbc.Driver
      # mysql8以下版本的driver:com.mysql.jdbc.Driver
      driverClassName: com.mysql.cj.jdbc.Driver
      user: root
      password: 113355
      url: jdbc:mysql://192.168.1.115:3306/seata?rewriteBatchedStatements=true

  #  server:
  #    service-port: 8091 #If not configured, the default is '${server.port} + 1000'
  security:
    secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
    tokenValidityInMilliseconds: 1800000
    ignore:
      urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

启动

docker-compose down

docker-compose up -d重新启动后,效果如下

nacos已经注册上

Spring Cloud Alibaba 整合Seata 之概念介绍及Seata-server搭建

 

控制台

打开控制台,ip:7091,用户名密码都为 seata

效果如下,

Spring Cloud Alibaba 整合Seata 之概念介绍及Seata-server搭建

 

后记

Spring Cloud Alibaba的完整整合,可以查看

(319条消息) Spring Cloud Alibaba 完整使用及与各中间件集成_ricardo.M.Yu的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-470839.html

到了这里,关于Spring Cloud Alibaba 整合Seata 之概念介绍及Seata-server搭建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【springcloud 微服务】Spring Cloud Alibaba整合Sentinel详解

    目录 一、前言 二、环境准备 2.1 部署sentinel管控台 2.1.1 官网下载sentinel的jar包 2.1.2 启动控制台

    2023年04月09日
    浏览(49)
  • 【springcloud微服务】Spring Cloud Alibaba 整合dubbo与openfeign

    dubbo与springcloud都可以单独作为微服务治理框架在生产中进行使用,但使用过springcloud的同学大概了解到,springcloud生态的相关组件这些年已经逐步停更,这就导致在服务架构演进过程中的迭代断层,以至于一些新的技术组件引入困难重重,于是在国内的市场上就有了升级版的

    2024年02月07日
    浏览(49)
  • 【Spring Boot 3】整合nacos + Dubbo3 的Spring cloud Alibaba项目

    【Spring Boot 3】整合nacos + Dubbo3 的Spring cloud Alibaba项目

    在springboot3不再兼容jdk8的时候,随之而来的便是各种框架不兼容引发的bug,虽然各位框架的开发大佬在加班加点的更新适配,但能够创建一个适用并且不报错的项目依旧是一件耗时耗力的事情。 我们都知道在String Cloud项目中默认使用Feign组件进行服务间的通信,REST API的调用

    2024年03月22日
    浏览(20)
  • spring cloud alibaba组件介绍

    1.Spring Cloud Alibaba Nacos 是阿里巴巴集团自主研发的动态服务发现、配置管理和服务管理平台。它可以实现服务之间的注册和发现,提供配置管理、服务治理、流量控制等功能。 2.Spring Cloud Alibaba RocketMQ 是阿里巴巴集团自主研发的高性能、高可用、高扩展的分布式消息中间件。

    2024年02月15日
    浏览(43)
  • Spring Cloud Alibaba-01-微服务介绍

    Spring Cloud Alibaba-01-微服务介绍

    Lison dreamlison@163.com , v1.0.0 , 2023.05.07 架构的演变 随着互联网的发展,网站应用的规模也不断的扩大,进而导致系统架构也在不断的进行变化,从互联网早起到现在,系统架构大体经历了下面几个过程: 单体应用架构: 把所有功能都集中在一个应用中,统一部署,开发成本、

    2024年02月22日
    浏览(147)
  • Spring Cloud Alibaba 介绍与版本映射关系

    Spring Cloud Alibaba 介绍与版本映射关系

    目录 前言 一、Spring Cloud Alibaba 是什么? 二、Spring Cloud Alibaba 版本依赖         Spring Cloud 本身并不是一个拿来即可用的框架,它是一套微服务规范,这套规范共有两代实现。 (子项目): ● 第一代实现: Spring Cloud Netflix, ● 第二代实现: Spring Cloud Alibaba。 2018 年 12 月1

    2024年02月03日
    浏览(14)
  • Spring Cloud Alibaba 最新版本(基于Spring Boot 3.1.0)整合完整使用及与各中间件集成

    Spring Cloud Alibaba 最新版本(基于Spring Boot 3.1.0)整合完整使用及与各中间件集成

    目录 前言 源码地址 官方中文文档 使用版本 spring Spring Boot 3.1.0 中间件 使用到的组件与功能 环境安装 虚拟机 nexus nacos 集成过程 工程搭建 父工程搭建 子工程 服务集成 nacos集成 配置文件 服务注册与发现-discovery 服务注册 启动 服务发现 测试 配置管理-config 新增配置  测试

    2024年02月07日
    浏览(17)
  • springcloud alibaba 整合seata的TCC

    springcloud alibaba 整合seata的TCC

    一、seata服务端搭建同上篇。 二、seata客户端的结构 1.示例DEMO工程 下单,扣余额, 减库存。 2. MAVEN配置。     父工程:由于spring-cloud-starter-alibaba-seata依赖的seata-spring-boot-starter项目版本太低,所以要排除,使用1.4.2的版本。 子模块:只需要引入基本的WEB框架。 3.配置文件

    2024年04月27日
    浏览(13)
  • 微服务之Spring Cloud Alibaba Sentinel介绍与下载(详细方法)

    微服务之Spring Cloud Alibaba Sentinel介绍与下载(详细方法)

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、流量路由、熔断降级、系统自适应过载保护、热点流量防护等多个维度保护服务的稳定性。 2012 年,Sentinel 诞生,主要功能为入口流量控制。 2013-2017 年,Sentinel 在阿里巴巴

    2024年02月11日
    浏览(48)
  • Spring Cloud Alibaba全家桶(六)——微服务组件Sentinel介绍与使用

    Spring Cloud Alibaba全家桶(六)——微服务组件Sentinel介绍与使用

    本文小新为大家带来 微服务组件Sentinel介绍与使用 相关知识,具体内容包括 分布式系统存在的问题 , 分布式系统问题的解决方案 , Sentinel介绍 , Sentinel快速开始 (包括: API实现Sentinel资源保护 , @SentinelResource注解实现资源保护 ), Sentinel控制台 , Spring Cloud Alibaba整合

    2024年01月17日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包