首页 > 其他分享 >Seata安装与使用

Seata安装与使用

时间:2023-02-26 23:55:16浏览次数:46  
标签:Seata db nacos server client 使用 安装 store seata

seata版本: 1.6.1

官网

官方文档

下载链接

seata server安装事项

seata server即seata术语中的TC(事务协调者),用于维护全局和分支事务的状态,驱动全局事务提交或回滚。

搭建seata server总体上注意下面这些点

  • 注册中心,registry.type,支持file(本地文件,默认)、redis、nacos、euraka、consul等注册中心
  • 配置中心,config.type,支持file(本地文件,默认)、redis、nacos、apollo、consul等配置中心
  • 事务会话信息存储方式,store.mode,支持file、db、redis,一般都会使用db方式,需要初始化一些表

搭建时可以参考官网文档中运维指南->部署章节,资源目录介绍

在下载的资源包中script中存在以下目录

  • client

    存放client端sql脚本 (包含 undo_log表) ,参数配置,1.6.1版本没看到该目录

  • config-center

    各个配置中心参数导入脚本,config.txt(包含server和client,原名nacos-config.txt)为通用参数文件

  • server

    server端数据库脚本 (包含 lock_table、branch_table 与 global_table) 及各个容器配置

seata server启动

存储模式使用db,注册中心、配置中心都使用nacos

  1. 建表

    将server目录下的数据库文件执行,主要是global_table、branch_table、lock_table、distributed_lock四张表。

    在mysql中先创建seatadb数据库,然后建表。该版本的建表语句需要使用mysql 8.0以上版本

  2. 修改存储模式store.mode为db

    seata server就是一个spring boot应用,配置可在application.yml文件进行修改。启动脚本修改了程序的application.yml文件位置,不需要到jar包内部去改,路径为conf/application.yml,此外同目录下application.example.yml中附带额外配置,可以进行复制。修改配置如下所示

    seata:
      store:
        # support: file 、 db 、 redis
        mode: db
        # 这些属性可以从nacos配置中心读取(可不写)
        db:
          datasource: druid
          db-type: mysql
          driver-class-name: com.mysql.cj.jdbc.Driver
          # 数据库名使用第一步的数据库
          url: jdbc:mysql://127.0.0.1:3306/seatadb?rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
          user: root
          password: 123456
          min-conn: 10
          max-conn: 100
          global-table: global_table
          branch-table: branch_table
          lock-table: lock_table
          distributed-lock-table: distributed_lock
          query-limit: 1000
          max-wait: 5000
    
  3. 修改注册中心registry.type为nacos

    配置文件同上面

    seata:
      registry:
        # support: nacos, eureka, redis, zk, consul, etcd3, sofa
        type: nacos
          nacos:
            application: seata-server
            server-addr: 127.0.0.1:8848
            group: SEATA_GROUP
            namespace: c7123a1e-d438-412c-af72-cdf3ab18a547
            cluster: default
    
  4. 修改配置中心config.type为nacos

    配置文件同上面

    seata:
      config:
        # support: nacos, consul, apollo, zk, etcd3
        type: nacos
        nacos:
          server-addr: 127.0.0.1:8848
          namespace: c7123a1e-d438-412c-af72-cdf3ab18a547
          group: SEATA_GROUP
          data-id: seata.properties
    
  5. 同步配置到nacos配置中心

    上面将配置中心修改成了nacos,因此要将配置推送到nacos配置中心去,下载的资源包已经提供了同步脚本,路径是/script/config-center,配置文件为config.txt。进入nacos目录,执行脚本即可。

    修改文件中store.db相关属性,如上面第二点所示,修改后的如下所示

    #For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html
    #Transport configuration, for client and server
    transport.type=TCP
    transport.server=NIO
    transport.heartbeat=true
    transport.enableTmClientBatchSendRequest=false
    transport.enableRmClientBatchSendRequest=true
    transport.enableTcServerBatchSendResponse=false
    transport.rpcRmRequestTimeout=30000
    transport.rpcTmRequestTimeout=30000
    transport.rpcTcRequestTimeout=30000
    transport.threadFactory.bossThreadPrefix=NettyBoss
    transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
    transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
    transport.threadFactory.shareBossWorker=false
    transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
    transport.threadFactory.clientSelectorThreadSize=1
    transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
    transport.threadFactory.bossThreadSize=1
    transport.threadFactory.workerThreadSize=default
    transport.shutdown.wait=3
    transport.serialization=seata
    transport.compressor=none
    
    #Transaction routing rules configuration, only for the client
    service.vgroupMapping.default_tx_group=default
    
    service.enableDegrade=false
    service.disableGlobalTransaction=false
    
    #Transaction rule configuration, only for the client
    client.rm.asyncCommitBufferLimit=10000
    client.rm.lock.retryInterval=10
    client.rm.lock.retryTimes=30
    client.rm.lock.retryPolicyBranchRollbackOnConflict=true
    client.rm.reportRetryCount=5
    client.rm.tableMetaCheckEnable=true
    client.rm.tableMetaCheckerInterval=60000
    client.rm.sqlParserType=druid
    client.rm.reportSuccessEnable=false
    client.rm.sagaBranchRegisterEnable=false
    client.rm.sagaJsonParser=fastjson
    client.rm.tccActionInterceptorOrder=-2147482648
    client.tm.commitRetryCount=5
    client.tm.rollbackRetryCount=5
    client.tm.defaultGlobalTransactionTimeout=60000
    client.tm.degradeCheck=false
    client.tm.degradeCheckAllowTimes=10
    client.tm.degradeCheckPeriod=2000
    client.tm.interceptorOrder=-2147482648
    client.undo.dataValidation=true
    client.undo.logSerialization=jackson
    client.undo.onlyCareUpdateColumns=true
    server.undo.logSaveDays=7
    server.undo.logDeletePeriod=86400000
    client.undo.logTable=undo_log
    client.undo.compress.enable=true
    client.undo.compress.type=zip
    client.undo.compress.threshold=64k
    #For TCC transaction mode
    tcc.fence.logTableName=tcc_fence_log
    tcc.fence.cleanPeriod=1h
    
    #Log rule configuration, for client and server
    log.exceptionRate=100
    
    #Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional.
    store.mode=db
    #Used for password encryption
    #store.publicKey=
    
    
    #These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block.
    store.db.datasource=druid
    store.db.dbType=mysql
    store.db.driverClassName=com.mysql.cj.jdbc.Driver
    store.db.url=jdbc:mysql://127.0.0.1:3306/seatadb?rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
    store.db.user=root
    store.db.password=123456
    store.db.minConn=5
    store.db.maxConn=30
    store.db.globalTable=global_table
    store.db.branchTable=branch_table
    store.db.distributedLockTable=distributed_lock
    store.db.queryLimit=100
    store.db.lockTable=lock_table
    store.db.maxWait=5000
    
    
    #Transaction rule configuration, only for the server
    server.recovery.committingRetryPeriod=1000
    server.recovery.asynCommittingRetryPeriod=1000
    server.recovery.rollbackingRetryPeriod=1000
    server.recovery.timeoutRetryPeriod=1000
    server.maxCommitRetryTimeout=-1
    server.maxRollbackRetryTimeout=-1
    server.rollbackRetryTimeoutUnlockEnable=false
    server.distributedLockExpireTime=10000
    server.xaerNotaRetryTimeout=60000
    server.session.branchAsyncQueueSize=5000
    server.session.enableBranchAsyncRemove=false
    server.enableParallelRequestHandle=false
    
    #Metrics configuration, only for the server
    metrics.enabled=false
    metrics.registryType=compact
    metrics.exporterList=prometheus
    metrics.exporterPrometheusPort=9898
    

    执行脚本

    sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t c7123a1e-d438-412c-af72-cdf3ab18a547
    

    执行完发现在nacos配置中心,每一项属性key作为一个dataId存在,但是1.6.1版本的seata已经支持从一个dataId中读取所有属性了,因此手动在nacos中新建一个data-id=seata.propertiesgroup=SEATA_GROUPnamespace=c7123a1e-d438-412c-af72-cdf3ab18a547的配置文件,然后将config.txt文件里的内容复制进去就好了。

  6. 启动seata server

    ./seata-server.sh
    

​ 启动日志在seata安装目录/logs下

客户端整合

  1. 每个客户端数据库新建以下表

    CREATE TABLE `undo_log`
    (
        `id`            bigint       NOT NULL AUTO_INCREMENT,
        `branch_id`     bigint       NOT NULL,
        `xid`           varchar(100) NOT NULL,
        `context`       varchar(128) NOT NULL,
        `rollback_info` longblob     NOT NULL,
        `log_status`    int          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;
    
  2. 每个客户端应用引入依赖

    <!-- 此版本和seata服务端保持一致 -->
    <dependency>
      <groupId>io.seata</groupId>
      <artifactId>seata-spring-boot-starter</artifactId>
      <version>1.6.1</version>
    </dependency>
    
    <!-- 和Spring-Cloud-Alibaba版本保持一致即可 -->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
      <version>${spring-cloud-alibaba.version}</version>
      <exclusions>
        <exclusion>
          <groupId>io.seata</groupId>
          <artifactId>seata-spring-boot-starter</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    
  3. 每一个客户端bootstrap.yml文件增加seata配置

    # seata服务注册信息, 用于下面引用, 避免重复粘贴
    meta:
      seata:
        nacos:
          server-addr: 127.0.0.1:8848
          namespace: c7123a1e-d438-412c-af72-cdf3ab18a547
          group: SEATA_GROUP
    
    seata:
      enabled: true
      application-id: ${spring.application.name}
      # 事务分组, 后面细讲
      tx-service-group: default_tx_group
      registry:
        type: nacos
        nacos:
          # 应与seata-server实际注册的服务名一致
          application: seata-server
          server-addr: ${meta.seata.nacos.server-addr}
          namespace: ${meta.seata.nacos.namespace}
          group: ${meta.seata.nacos.group}
      config:
        type: nacos
        nacos:
          server-addr: ${meta.seata.nacos.server-addr}
          namespace: ${meta.seata.nacos.namespace}
          group: ${meta.seata.nacos.group}
          data-id: seata.properties
    
  4. 使用

    只需要在需要分布式事务的方法前加上注解即可@GlobalTransactional

事务分组概念

参照官方文档事务分组

这里简单描述下,为了方便理解,详细可以看官方文档

seata-server(即事物协调者TC)可以向nacos注册中心注册多个实例,当然服务名肯定是一样,但是有一个cluster属性可以不同,相同cluster的是一个集群。即多个实例可以构成多个集群,但是服务名是一样的。那么相应的客户端便是事务分组这么一个概念,一个事务分组可以访问一个集群,客户端的事务分组和TC集群建立一个映射关系。

举例:

TC有两个集群clusterA、clusterB,服务名为seata-server

客户端应用有A、B、C 3个微服务,事务分组分别为group1、group2

然后事务分组与TC集群映射关系为group1 -> clusterA、group2 -> clusterB

那么微服务A、B只能拿到TC clusterA集群下的节点信息,微服务C只能拿到TC clusterB集群下的节点信息。

  • TC cluster注册配置(服务端注册中心配置)
seata:
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
      nacos:
        application: seata-server
        server-addr: 127.0.0.1:8848
        group: SEATA_GROUP
        namespace: c7123a1e-d438-412c-af72-cdf3ab18a547
        # 集群名称
        cluster: clusterA
  • 客户端事务分组指定
seata:
  tx-service-group: group1
  • 事务分组与TC cluster映射关系

    通过用户配置的配置中心去寻找service.vgroupMapping .[事务分组名]=[TC cluster name]或者直接通过bootstrap.yml文件配置seata.service.vgroup-mapping.事务分组名=集群名称

service.vgroupMapping.group1=clusterA

客户端代码

分为3个微服务seata-business、seata-order、seata-storage。

其中seata-order用于下单,seata-storage用于扣减库存、seata-business通过open feign调用这两个服务完成购买商品过程。

为了简单起见只用了一个数据库(seatadb)。

项目地址

标签:Seata,db,nacos,server,client,使用,安装,store,seata
From: https://www.cnblogs.com/wt20/p/17158267.html

相关文章

  • Kafka简单介绍和安装
    1.什么是KafkaKafka传统定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(MessageQueue),主要应用于大数据实时处理领域。**Kafka最新定义**:Kafka是一个开源的分布......
  • Linux - yum 使用方法
    Centos和RedHat都使用yum做为它们的默认软件包管理器yumsearchnmap#搜索软件包yuminfonmap#显示这个软件包的详细信息yuminstall-ynmap#安装软件包,......
  • 刷刷刷 Day 38 | 746. 使用最小花费爬楼梯
    746.使用最小花费爬楼梯LeetCode题目要求给你一个整数数组cost,其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个......
  • 在python中使用ChatGPT
    首先,安装HuggingFaceTransformers库和PyTorch库。在终端中运行以下命令:pipinstalltransformerspipinstalltorch然后,使用以下代码来初始化ChatGPT模型并生成......
  • vue3异步组件(defineAsyncComponent、Suspense的使用)
    异步组件按需引入,用到的时候再加载,异步组件的引入需要用​​defineAsyncComponent​​进行注册。​​defineAsyncComponent​​工厂函数需要返回一个Promise对象,接收对象类......
  • c++中sort使用
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>usingnamespacestd;#include<algorithm>inta[100010],n;intmain(){scanf("%d",&n);for(inti=0;i<......
  • ChatGPT API使用介绍
    1.概述随着人工智能技术的不断发展,越来越多的AI产品被应用到各个领域,其中最具代表性的莫过于人工智能语言模型。语言模型是一种可以通过学习大量语言数据来预测文本或语音......
  • Vue | css如何使用js中的变量
    如在Vue中,我们可以绑定在style上面变量,然后使用css来使用该变量,如下:<divclass="layersBoxunselect"v-move:style="`--color:${theme}`">.layersBox{color:var......
  • 使用Kyuubi 解锁 Spark SQL on CDH 6
    背景CDH最后一个免费版6.3.2发布一年有余,离线计算核心组件版本停在了Hadoop3.0.0,Hive2.1.1,Spark2.4.0。随着Spark3.0的重磅发布,在性能方面又迎来了一次飞跃,本文......
  • 函数的基本使用
    一、引入基于前一部分的学习,我们已经能够开发一些功能简单的小程序了,但随着程序功能的增多,代码量随之增大,此时仍不加区分地把所有功能的实现代码放到一起,将会使得程序的组......