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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。