springboot集成分布式事务seata-1.0.0的AT模式(nacos作为注册中心以及配置中心)

本文主要是介绍springboot集成分布式事务seata-1.0.0的AT模式(nacos作为注册中心以及配置中心),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对文章部分内容作了调整和说明,后续会基于seata-1.1.0版本写一篇更加完整的关于seata的AT、Tcc以及Saga模式的文章,大家互相学习,共同进步。

Seata 是什么?

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

seata的官方文档:http://seata.io/zh-cn/index.html

seata github地址:https://github.com/seata/seata

设计初衷

对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入

高性能:减少分布式事务解决方案所带来的性能消耗

发展远景

架构

TC - 事务协调者

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

TM - 事务管理器

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

RM - 资源管理器

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

微服务框架支持

目前已支持 Dubbo、Spring Cloud、Sofa-RPC、Motan 和 grpc 等RPC框架,其他框架持续集成中

AT 模式(业务入侵小)

提供无侵入自动补偿的事务模式,目前已支持 MySQL、 Oracle 的AT模式、PostgreSQL、H2 开发中

前提

基于支持本地 ACID 事务的关系型数据库。

Java 应用,通过 JDBC 访问数据库。

整体机制

两阶段提交协议的演变:

一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

二阶段:

提交异步化,非常快速地完成。

回滚通过一阶段的回滚日志进行反向补偿

TCC 模式(高性能)

支持 TCC 模式并可与 AT 混用,灵活度更高

SAGA 模式

为长事务提供有效的解决方案

XA 模式(开发中)

支持已实现 XA 接口的数据库的 XA 模式

高可用

支持基于数据库存储的集群模式,水平扩展能力强

配置

2019.12.21,Seata 1.0.0 GA版本重磅发布,此次配置就是基于1.0.0版本进行集成

https://www.oschina.net/news/112269/seata-1-0-0-ga-released?tdsourcetag=s_pctim_aiomsg

依赖

<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.0.0</version>
</dependency>  

数据库

为每个涉及数据库的微服务创建 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;

启动服务

下载seata-server

 https://github.com/seata/seata/releases,下载服务器软件包seata-server-1.0.0,将其解压缩

Usage: sh seata-server.sh(for linux and mac) or cmd seata-server.bat(for windows) [options] 
Options: 
--host, -h 
The host to bind. 
Default: 0.0.0.0 
--port, -p 
The port to listen. 
Default: 8091 
--storeMode, -m 
log store mode : file、db 
Default: file 
--help e.g. sh seata-server.sh -p 8091 -h 127.0.0.1 -m file

配置seata-server

配置中心以nacos为例,配置文件在conf目录下

配置registry.conf

registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype = "nacos"nacos {serverAddr = "localhost"namespace = ""cluster = "default"}}config {# file、nacos 、apollo、zk、consul、etcd3type = "nacos"nacos {serverAddr = "localhost"namespace = ""}}

将registry下type修改为nacos

将config下type修改为nacos

配置nacos-config.txt

官网seata-server-0.9.0的conf目录下有该文件,seata-server-1.0.0的conf目录下没有nacos-config.txt文件,新增或者从seata-server-0.9.0的conf目录下复制一份即可(对应seata-1.0.0源码里的config.txt脚本,在script\config-center目录下,也可以下载源码,在源码里修改),内容如下:

transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.thread-factory.boss-thread-prefix=NettyBoss
transport.thread-factory.worker-thread-prefix=NettyServerNIOWorker
transport.thread-factory.server-executor-thread-prefix=NettyServerBizHandler
transport.thread-factory.share-boss-worker=false
transport.thread-factory.client-selector-thread-prefix=NettyClientSelector
transport.thread-factory.client-selector-thread-size=1
transport.thread-factory.client-worker-thread-prefix=NettyClientWorkerThread
transport.thread-factory.boss-thread-size=1
transport.thread-factory.worker-thread-size=8
transport.shutdown.wait=3
service.vgroup_mapping.my_test_tx_group=default
service.vgroup_mapping.my_test_tx_group1=default
service.vgroup_mapping.my_test_tx_group2=default
service.enableDegrade=false
service.disable=false
service.max.commit.retry.timeout=-1
service.max.rollback.retry.timeout=-1
client.async.commit.buffer.limit=10000
client.lock.retry.internal=10
client.lock.retry.times=30
client.lock.retry.policy.branch-rollback-on-conflict=true
client.table.meta.check.enable=true
client.report.retry.count=5
client.tm.commit.retry.count=1
client.tm.rollback.retry.count=1
store.mode=file
store.file.dir=file_store/data
store.file.max-branch-session-size=16384
store.file.max-global-session-size=512
store.file.file-write-buffer-cache-size=16384
store.file.flush-disk-mode=async
store.file.session.reload.read_size=100
store.db.datasource=dbcp
store.db.db-type=mysql
store.db.driver-class-name=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true
store.db.user=root
store.db.password=root
store.db.min-conn=1
store.db.max-conn=3
store.db.global.table=global_table
store.db.branch.table=branch_table
store.db.query-limit=100
store.db.lock-table=lock_table
recovery.committing-retry-period=1000
recovery.asyn-committing-retry-period=1000
recovery.rollbacking-retry-period=1000
recovery.timeout-retry-period=1000
transaction.undo.data.validation=true
transaction.undo.log.serialization=jackson
transaction.undo.log.save.days=7
transaction.undo.log.delete.period=86400000
transaction.undo.log.table=undo_log
transport.serialization=seata
transport.compressor=none
metrics.enabled=false
metrics.registry-type=compact
metrics.exporter-list=prometheus
metrics.exporter-prometheus-port=9898
support.spring.datasource.autoproxy=false

将下图处修改为自己的服务组名,各个微服务之间使用不同的服务组名

执行nacos-config.sh脚本

官网seata-server-0.9.0的conf目录下有该文件,但是seata-server-1.0.0的conf目录下没有nacos-config.sh文件,新增或者从seata-server-0.9.0的conf目录下复制一份即可(对应seata-1.0.0源码里的nacos-config.sh文件,在script\config-center\nacos目录下,也可以下载源码,在源码里执行),内容如下:

#!/usr/bin/env bashif [ $# != 1 ]; thenecho "./nacos-config.sh nacosIp"exit -1finacosIp=$1echo "set nacosIp=$nacosIp"error=0for line in $(cat nacos-config.txt)dokey=${line%%=*}value=${line#*=}echo "\r\n set "${key}" = "${value}result=`curl -X POST "http://$nacosIp:8848/nacos/v1/cs/configs?dataId=$key&group=SEATA_GROUP&content=$value"`if [ "$result"x == "true"x ]; thenecho "\033[42;37m $result \033[0m"elseecho "\033[41;37 $result \033[0m"let error++fidoneif [ $error -eq 0 ]; thenecho  "\r\n\033[42;37m init nacos config finished, please start seata-server. \033[0m"elseecho  "\r\n\033[41;33m init nacos config fail. \033[0m"fi

使用git工具git bash执行nacos-config.sh脚本,结果如下图:

执行完成后nacos会新增seata配置,如下图:

微服务配置

配置文件

以yml文件为例,添加服务组名配置,不同微服务使用相同服务组名

spring:cloud:alibaba:seata:tx-service-group: my_test_tx_group

 

启动类配置

添加@EnableDiscoveryClient以及@EnableAutoConfiguration注解

@EnableAutoConfiguration:是否开启spring-boot自动装配,如果开启,则会自动配置seata与spring-boot的集成,包括数据源的自动代理以及GlobalTransactionScanner初始化。 注:1.0版本新特性,需依赖seata-spring-boot-starter。

registry.conf

将registry.conf添加到项目resources的根目录,registry以及config的type同样选择nacos

registry {# file nacostype = "nacos"nacos {serverAddr = "localhost"namespace = ""cluster = "default"}}config {# file、nacos 、apollo、zk、consultype = "nacos"nacos {serverAddr = "localhost"namespace = ""}}

使用

只需要使用一个 @GlobalTransactional 注解在业务方法上

package com.test;import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.dubbo.config.annotation.Service;
import com.test.domain.A;
import com.test.domain.B;
import com.test.service.AService;
import com.test.service.BService;import io.seata.core.context.RootContext;
import io.seata.spring.annotation.GlobalTransactional;@Service(version = "1.0.0")
public class TestServiceImpl implements TestService{@Reference(check = false,version="1.0.0")private AService aService;@Reference(check = false,version="1.0.0")private BService bService;@GlobalTransactional@Overridepublic void add() {A a = new A();a.setName("123456");aService.addA(a);B b = new B();b.setName("123456");bService.addB(b);throw new RuntimeException("测试回滚, xid:" + RootContext.getXID());}}

 

这篇关于springboot集成分布式事务seata-1.0.0的AT模式(nacos作为注册中心以及配置中心)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111030

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo