SEATA 配置

使用 nacos 做为配置中心配置 SEATA

当前 SEATA 版本: 1.4.1

TC (Transaction Coordinator) - 事务协调者

维护全局和分支事务的状态,驱动全局事务提交或回滚。

配置参数

参数文档

config.txt
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableClientBatchSendRequest=false
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
service.vgroupMapping.app-server-tx-group=default
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
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=false
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
store.mode=db
store.file.dir=file_store/data
store.file.maxBranchSessionSize=16384
store.file.maxGlobalSessionSize=512
store.file.fileWriteBufferCacheSize=16384
store.file.flushDiskMode=async
store.file.sessionReloadReadSize=100
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=url
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.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
store.redis.host=127.0.0.1
store.redis.port=6379
store.redis.maxConn=10
store.redis.minConn=1
store.redis.database=10
store.redis.password=null
store.redis.queryLimit=100
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
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.log.exceptionRate=100
transport.serialization=seata
transport.compressor=none
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

nacos bash 脚本

参考 SEATA github 配置说明

nacos-config.sh

while getopts ":h:p:g:t:u:w:" opt
do
case $opt in
h)
host=$OPTARG
;;
p)
port=$OPTARG
;;
g)
group=$OPTARG
;;
t)
tenant=$OPTARG
;;
u)
username=$OPTARG
;;
w)
password=$OPTARG
;;
?)
echo " USAGE OPTION: $0 [-h host] [-p port] [-g group] [-t tenant] [-u username] [-w password] "
exit 1
;;
esac
done if [[ -z ${host} ]]; then
host=localhost
fi
if [[ -z ${port} ]]; then
port=8848
fi
if [[ -z ${group} ]]; then
group="SEATA_GROUP"
fi
if [[ -z ${tenant} ]]; then
tenant=""
fi
if [[ -z ${username} ]]; then
username=""
fi
if [[ -z ${password} ]]; then
password=""
fi nacosAddr=$host:$port
contentType="content-type:application/json;charset=UTF-8" echo "set nacosAddr=$nacosAddr"
echo "set group=$group" failCount=0
tempLog=$(mktemp -u)
function addConfig() {
curl -X POST -H "${contentType}" "http://$nacosAddr/nacos/v1/cs/configs?dataId=$1&group=$group&content=$2&tenant=$tenant&username=$username&password=$password" >"${tempLog}" 2>/dev/null
if [[ -z $(cat "${tempLog}") ]]; then
echo " Please check the cluster status. "
exit 1
fi
if [[ $(cat "${tempLog}") =~ "true" ]]; then
echo "Set $1=$2 successfully "
else
echo "Set $1=$2 failure "
(( failCount++ ))
fi
} count=0
for line in $(cat config.txt | sed s/[[:space:]]//g); do
(( count++ ))
key=${line%%=*}
value=${line#*=}
addConfig "${key}" "${value}"
done echo "========================================================================="
echo " Complete initialization parameters, total-count:$count , failure-count:$failCount "
echo "=========================================================================" if [[ ${failCount} -eq 0 ]]; then
echo " Init nacos config finished, please start seata-server. "
else
echo " init nacos config fail. "
fi

同步 config 配置到 nacos

进入 TC 服务器

  • 新建文件夹 seata-config

  • 进入 seata-config

  • 新建 config.txt 文件并复制配置参数到 config.txt 文件中

  • 新建 nacos-config.sh 文件,同时复制 nacos bash 脚本到 nacos-config.sh 中

  • 使用以下命令同步配置参数到 nacos

    bash nacos-config.sh -h 127.0.0.1 -p 8848 -g SEATA_GROUP -t 3a2aea46-07c6-4e21-9a1e-8946cde9e2b3 -u nacos -w nacos

    得到输出

    set nacosAddr=127.0.0.1:8848
    set group=SEATA_GROUP
    Set transport.type=TCP successfully
    Set transport.server=NIO successfully
    .
    .
    .
    =========================================================================
    Complete initialization parameters, total-count:80 , failure-count:0
    =========================================================================
    Init nacos config finished, please start seata-server.

使用 docker 部署 SEATA

Docker 部署 SEATA 官方文档

进入 TC 服务器,并进入 seat-config 文件夹

  • 新建 registry.conf 文件,并添加以下内容,registry 配置参考

    registry.conf
    registry {
    # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
    type = "nacos" nacos {
    application = "seata-server"
    group = "SEATA_GROUP"
    serverAddr = "127.0.0.1"
    namespace = "3a2aea46-07c6-4e21-9a1e-8946cde9e2b3"
    cluster = "default"
    }
    } config {
    # file、nacos 、apollo、zk、consul、etcd3、springCloudConfig
    type = "nacos" nacos {
    serverAddr = "127.0.0.1"
    namespace = "3a2aea46-07c6-4e21-9a1e-8946cde9e2b3"
    group = "SEATA_GROUP"
    username = "nacos"
    password = "nacos"
    }
    }
  • 新建 file.conf 文件并添加以下内容(可选,可通过 nacos 读取)

    file.conf
    transport {
    # tcp udt unix-domain-socket
    type = "TCP"
    #NIO NATIVE
    server = "NIO"
    #enable heartbeat
    heartbeat = true
    # the client batch send request enable
    enableClientBatchSendRequest = true
    #thread factory for netty
    threadFactory {
    bossThreadPrefix = "NettyBoss"
    workerThreadPrefix = "NettyServerNIOWorker"
    serverExecutorThread-prefix = "NettyServerBizHandler"
    shareBossWorker = false
    clientSelectorThreadPrefix = "NettyClientSelector"
    clientSelectorThreadSize = 1
    clientWorkerThreadPrefix = "NettyClientWorkerThread"
    # netty boss thread size,will not be used for UDT
    bossThreadSize = 1
    #auto default pin or 8
    workerThreadSize = "default"
    }
    shutdown {
    # when destroy server, wait seconds
    wait = 3
    }
    serialization = "seata"
    compressor = "none"
    }
    service {
    #transaction service group mapping
    vgroupMapping.my_test_tx_group = "default"
    #only support when registry.type=file, please don't set multiple addresses
    default.grouplist = "127.0.0.1:8091"
    #degrade, current not support
    enableDegrade = false
    #disable seata
    disableGlobalTransaction = false
    } client {
    rm {
    asyncCommitBufferLimit = 10000
    lock {
    retryInterval = 10
    retryTimes = 30
    retryPolicyBranchRollbackOnConflict = true
    }
    reportRetryCount = 5
    tableMetaCheckEnable = false
    reportSuccessEnable = false
    }
    tm {
    commitRetryCount = 5
    rollbackRetryCount = 5
    }
    undo {
    dataValidation = true
    logSerialization = "jackson"
    logTable = "undo_log"
    }
    log {
    exceptionRate = 100
    }
    }
  • 运行 docker 命令

    • 注意: 当在 config.txt 中配置 store.mode=db 时,需要在配置的数据库连接中初始化表 global_tablebranch_tablelock_tablesql 传送门
    docker run -d --name seata-server \
    --net=host \
    -p 8091:8091 \
    -e SEATA_CONFIG_NAME=file:/root/seata-config/registry \
    -v /root/seata-config:/root/seata-config \
    seataio/seata-server:1.4.1

    挂载目录为 TC 服务器配置目录。

TM (Transaction Manager) - 事务管理器

定义全局事务的范围:开始全局事务、提交或回滚全局事务。

例子:业务聚合服务

  • SEATA 包引入。pom 配置如下,当使用 spring-cloud-starter-openfeign 包时,需要移除 spring-cloud-starter-openfeign 包,spring-cloud-starter-alibaba-seata 中已经包含了 spring-cloud-starter-openfeign ,再次引入可能导致包冲突。

    pom.xml
    <dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.4.1</version>
    </dependency>
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    <version>2.2.1.RELEASE</version>
    <exclusions>
    <exclusion>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    </exclusion>
    <exclusion>
    <groupId>io.seata</groupId>
    <artifactId>seata-all</artifactId>
    </exclusion>
    </exclusions>
    </dependency>
  • 添加 registry.conf。在工程中 resource 目录下添加如下内容

    registry.conf
    registry {
    # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
    type = "nacos" nacos {
    application = "seata-server"
    serverAddr = "127.0.0.1:8848"
    namespace = "3a2aea46-07c6-4e21-9a1e-8946cde9e2b3"
    cluster = "default"
    username = "nacos"
    password = "nacos"
    }
    } config {
    # file、nacos 、apollo、zk、consul、etcd3、springCloudConfig
    type = "nacos" nacos {
    serverAddr = "127.0.0.1:8848"
    namespace = "3a2aea46-07c6-4e21-9a1e-8946cde9e2b3"
    group = "SEATA_GROUP"
    username = "nacos"
    password = "nacos"
    }
    }
  • 配置 bootstrap.properties,添加配置,内容如下,seata.tx-service-groupnamespace 改为对应的值

    bootstrap.properties
      ...
    seata.tx-service-group=app-server-tx-group
    seata.config.type=nacos
    seata.config.nacos.server-addr=127.0.0.1:8848
    seata.config.nacos.namespace=3a2aea46-07c6-4e21-9a1e-8946cde9e2b3
    seata.config.nacos.group=SEATA_GROUP

在 TM 中通过 @GlobalTransactional 开启全局异常,示例代码:


@GlobalTransactional
@GetMapping({"create"})
public String create(String name,Integer age) {
...
return "创建成功";
}

RM (Resource Manager) - 资源管理器

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

例子:被调用服务。

  • 配置 bootstrap.properties,添加配置,内容如下,seata.tx-service-groupnamespace 改为对应的值

    bootstrap.properties
      ...
    seata.tx-service-group=app-server-tx-group
    seata.config.type=nacos
    seata.config.nacos.server-addr=127.0.0.1:8848
    seata.config.nacos.namespace=3a2aea46-07c6-4e21-9a1e-8946cde9e2b3
    seata.config.nacos.group=SEATA_GROUP
  • 对需要做回滚的业务标记 @Transactional(rollbackFor = Exception.class)

  • 如果配置了全局异常处理,使用 SEATA API 发起事务回滚

      @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public String exceptionHandler(Exception e) {
    ...
    try {
    String xid = RootContext.getXID();
    if (StringUtils.isNotEmpty(xid)) {
    GlobalTransactionContext.reload(RootContext.getXID()).rollback();
    }
    } catch (TransactionException transactionException) {
    transactionException.printStackTrace();
    log.error("===TransactionException==={}", transactionException.getMessage());
    }
    return e.getMessage();
    }

    或者通过 AOP 全局处理回滚


    /**
    * @author Zhang_Xiang
    * @since 2021/2/22 17:36:16
    */
    @Aspect
    @Component
    @Slf4j
    public class TxAspect { @Pointcut("execution(public * *(..))")
    public void publicMethod() {
    } @Pointcut("within(com.*.service.impl..*)")
    private void services() {
    } @Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
    private void transactional() {
    } @Pointcut("within(com.*.webapi.controller..*)")
    private void actions() {
    } @Pointcut("@annotation(org.springframework.web.bind.annotation.ExceptionHandler))")
    private void validatedException() {
    } @Before(value = "validatedException()")
    public void beforeValidate(JoinPoint joinPoint) throws TransactionException {
    Object[] args = joinPoint.getArgs();
    if (args == null || args.length == 0) {
    return;
    }
    Exception e = (Exception) args[0];
    if (e instanceof MethodArgumentNotValidException || e instanceof BindException || e instanceof
    ConstraintViolationException) {
    globalRollback();
    }
    } @AfterThrowing(throwing = "e", pointcut = "publicMethod()&&services()&&transactional()")
    public void doRecoveryMethods(Throwable e) throws TransactionException {
    log.info("===method throw===:{}", e.getMessage());
    globalRollback();
    } @AfterReturning(value = "publicMethod()&&actions()", returning = "result")
    public void afterReturning(RestResponse<?> result) throws TransactionException {
    log.info("===method finished===:{}", result);
    if (result.isFail()) {
    globalRollback();
    }
    } //region private methods private void globalRollback() throws TransactionException {
    if (!StringUtils.isBlank(RootContext.getXID())) {
    log.info("===xid===:{}", RootContext.getXID());
    GlobalTransactionContext.reload(RootContext.getXID()).rollback();
    }
    } //endregion
    }

分布式事务 SEATA-1.4.1 AT模式 配合NACOS 应用的更多相关文章

  1. 阿里分布式事务seata入门(采坑)

    1. 阿里分布式事务seata入门(采坑) 1.1. 前言 seata是feascar改名而来,这是阿里在19年年初开源出来的分布式事务框架,当初刚出来的时候就想研究下了,一直拖到了现在,目前是0.8 ...

  2. SpringCloud系列之集成分布式事务Seata应用篇

    目录 前言 项目版本 项目说明 Seata服务端部署 Seata客户端集成 cloud-web module-order module-cart module-goods module-wallet ...

  3. 出席分布式事务Seata 1.0.0 GA典礼

    前言 图中那个红衣服的就是本人 什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上. 简单的说,就是一次大的操作由不同的小 ...

  4. spring boot:使用分布式事务seata(druid 1.1.23 / seata 1.3.0 / mybatis / spring boot 2.3.2)

    一,什么是seata? Seata:Simpe Extensible Autonomous Transcaction Architecture, 是阿里中间件开源的分布式事务解决方案. 前身是阿里的F ...

  5. spring boot:shardingsphere+druid整合seata分布式事务(spring boot 2.3.3)

    一,shardingshpere为什么要整合seata? 分库分表是数据库扩展中最常用的处理方法, shardingshpere作为使用最广泛的分表中间件, 如果不支持分布式事务,则它的数据一致性就会 ...

  6. [转帖]深度剖析一站式分布式事务方案 Seata-Server

    深度剖析一站式分布式事务方案 Seata-Server https://www.jianshu.com/p/940e2cfab67e 金融级分布式架构关注 22019.04.10 16:59:14字数 ...

  7. 如何实现XA式、非XA式Spring分布式事务

    Spring应用的几种事务处理机制 Java Transaction API和XA协议是Spring常用的分布式事务机制,不过你可以选择选择其他的实现方式.理想的实现取决于你的应用程序使用何种资源,你 ...

  8. 非XA式Spring分布式事务

    Spring应用的几种事务处理机制 Java Transaction API和XA协议是Spring常用的分布式事务机制,不过你可以选择选择其他的实现方式.理想的实现取决于你的应用程序使用何种资源,你 ...

  9. Dubbo学习系列之十五(Seata分布式事务方案TCC模式)

    上篇的续集. 工具: Idea201902/JDK11/Gradle5.6.2/Mysql8.0.11/Lombok0.27/Postman7.5.0/SpringBoot2.1.9/Nacos1.1 ...

  10. Dubbo学习系列之十四(Seata分布式事务方案AT模式)

    一直说写有关最新技术的文章,但前面似乎都有点偏了,只能说算主流技术,今天这个主题,我觉得应该名副其实.分布式微服务的深水区并不是单个微服务的设计,而是服务间的数据一致性问题!解决了这个问题,才算是把分 ...

随机推荐

  1. 统一软件开发过程(rup)理解

    不好意思,没有内容,请看百科吧http://baike.baidu.com/link?url=-zXA6oXiHRts5Z1THGzie7seH-YRigfiR7KRppP6TYcnnb7_Bxc_f ...

  2. Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统 nsswitch.conf配置文件

    Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统  nsswitch.conf配置文件 朋友们,今天我对你们说,在此时此刻,我们虽然遭受种种困难和挫折,我仍然有一个梦 ...

  3. USB peripherals can turn against their users

    Turning USB peripherals into BadUSB USB devices are connected to – and in many cases even built into ...

  4. apache开源项目--Jackrabbit

    Apache Jackrabbit 是由 Apache Foundation 提供的 JSR-170 的开放源码实现.. 随着内容管理应用程序的日益普及,对用于内容仓库的普通.标准化 API 的需求已 ...

  5. input解决浏览器记住密码问题

    <input type="password" name="" id="">可以这样写 <input type=" ...

  6. Python:正则表达式详解

    正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能 ...

  7. JarvisOJ BASIC -.-字符串

    请选手观察以下密文并转换成flag形式 ..-. .-.. .- --. ..... ..--- ..--- ----- .---- ---.. -.. -.... -.... ..... ...-- ...

  8. ZKWeb网页框架1.9正式发布

    1.9.0更新的内容有 更新项目工具 更好的支持Linux 添加工具函数 Exception.ToDetailedString (获取例外的详细信息) Exception.ToSummaryStrin ...

  9. 【JSP】EL函数和自定义EL函数

    简介 EL原本是JSTL1.0中的技术(所以EL和JSTL感情如此好就是自然的了),但是从JSP2.0开始,EL就分离出来纳入了JSP的标准了.但是EL函数还是和JSTL技术绑定在一起.下面将介绍如何 ...

  10. 结合P2P软件使用Ansible分发大文件

    一 应用场景描述 现在我需要向50+数量的服务器分发Logstash新版本的rpm包,大概220MB左右,直接使用Ansible的copy命令进行传输,命令如下: 1 ansible all  -m  ...