druid seata 配置_架构设计 | 基于Seata中间件,微服务模式下事务管理

一、Seata简介

1、Seata组件

Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA、XA事务模式,为用户打造一站式的分布式解决方案。

2、支持模式

AT 模式

  • 基于支持本地 ACID 事务的关系型数据库。
  • Java应用,通过 JDBC 访问数据库。

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

二阶段:提交异步化,非常快速地完成。回滚通过一阶段的回滚日志进行反向补偿。

TCC模式

一个分布式的全局事务,整体是两阶段提交的模型,全局事务是由若干分支事务组成的,分支事务要满足两阶段提交的模型要求,即需要每个分支事务都具备自己的:

一阶段 prepare 行为

二阶段 commit 或 rollback 行为

Saga模式

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

XA模式

XA是一个分布式事务协议,对业务无侵入的分布式事务解决方案,XA提交协议需要事务参与者的数据库支持,XA事务具有强一致性,在两阶段提交的整个过程中,一直会持有资源的锁,性能不理想的缺点很明显。

二、服务端部署

1、下载组件包

1.2版本:seata-server-1.2.0.zip

解压目录

  • bin:存放服务端运行启动脚本;
  • lib:存放服务端依赖的资源jar包;
  • conf:配置文件目录。

2、修改配置

file.conf配置

mode:db 即使用数据库存储事务信息,这里还可以选择file存储方式。

file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;

db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;

redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.

store {  ## store mode: file、db  mode = "db"  db {    datasource = "druid"    dbType = "mysql"    driverClassName = "com.mysql.jdbc.Driver"    url = "jdbc:mysql://127.0.0.1:3306/seata_server"    user = "root"    password = "123456"    minConn = 5    maxConn = 30    globalTable = "global_table"    branchTable = "branch_table"    lockTable = "lock_table"    queryLimit = 100    maxWait = 5000  }}

registry.conf配置

这里选择eureka作为注册中心,seata-server也要作为一个服务添加到注册中心,不使用配置中心所以config配置默认即可。

registry {  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa  type = "eureka"  eureka {    serviceUrl = "http://localhost:8761/eureka"    application = "default"    weight = "1"  }}

3、事务管理表

需要在seata-server即上述配置的MySQL库中建立3张事务管理表:

  • 全局事务:global_table
  • 分支事务:branch_table
  • 全局锁:lock_table
  • 事务回滚:undo_log
  • SQL脚本:mysql-script目录

4、启动命令

Linux环境:sh seata-server.sh

三、业务服务搭建

1、代码结构

93cc77c401d968aa98089d9693146735.png
  • seata-eureka:注册中心
  • seata-order:订单服务
  • seata-account:账户服务
  • seata-inventor:库存服务
  • seata-client:客户端服务
  • account-feign:账户Feign接口
  • inventory-feign:库存Feign接口
  • order-feign:订单Feign接口

请求链路:客户端->订单->账户+库存,测试整个流程的分布式事务问题。

2、数据库结构

9a0928709650a7f66c86335b20a42e9e.png
  • seata_server:seata组件服务端依赖库
  • seata_account:模拟账户数据库
  • seata_inventor:模拟库存数据库
  • seata_order:模拟订单数据库

各个库脚本位置:mysql-script/data-biz.sql

3、启动服务

依次启动:注册中心,库存服务,账户服务,订单服务,客户端服务;

Eureka服务列表如下:

bfac92949923cef9a24b4f5f15f2ddc3.png

四、Seata用法详解

1、Seata基础配置

dae57850505a0e43d6ef34b9caebe416.png

几个基础服务的配置方式一样。

conf配置

file.conf重点关注下面内容,事务组的名称,需要在yml文件中使用。

my_test_tx_group = "default"

registry.conf:是注册中心的选择。

2、数据库配置

注意这里的事务组名称配置。

spring:  # 事务组的名称  cloud:    alibaba:      seata:        tx-service-group: my_test_tx_group  # 数据源配置  datasource:    type: com.alibaba.druid.pool.DruidDataSource    druid:      driverClassName: com.mysql.jdbc.Driver      url: jdbc:mysql://127.0.0.1:3306/seata_account      username: root      password: 123456

将数据库整体由Seata进行代理管理,核心API:DataSourceProxy。

@Configurationpublic class SeataAccountConfig {    @Value("${spring.application.name}")    private String applicationName;    @Bean    public GlobalTransactionScanner globalTransactionScanner() {        return new GlobalTransactionScanner(applicationName, "test-tx-group");    }    @Bean    @ConfigurationProperties(prefix = "spring.datasource.druid")    public DruidDataSource druidDataSource() {        return new DruidDataSource() ;    }    @Primary    @Bean("dataSource")    public DataSourceProxy dataSourceProxy(DataSource druidDataSource) {        return new DataSourceProxy(druidDataSource);    }    @Bean    public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy)throws Exception{        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();        sqlSessionFactoryBean.setDataSource(dataSourceProxy);        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()                .getResources("classpath*:/mapper/*.xml"));        sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory());        return sqlSessionFactoryBean.getObject();    }}

3、业务代码

核心注解:GlobalTransactional,管理整体的分布式事务。

@Servicepublic class OrderServiceImpl implements OrderService {    private final Logger LOGGER = LoggerFactory.getLogger(OrderServiceImpl.class);    @Resource    private OrderMapper orderMapper ;    @Resource    private AccountFeign accountFeign ;    @Resource    private InventoryFeign inventoryFeign ;    @GlobalTransactional    @Override    public Integer createOrder(String orderNo) {        LOGGER.info("Order 生成中 "+orderNo);        // 本服务下订单库        Integer insertFlag = orderMapper.insert(orderNo) ;        // 基于feign接口处理账户和库存        accountFeign.updateAccount(10L) ;        inventoryFeign.updateInventory(10) ;        return insertFlag ;    }}

测试流程:在任意服务下抛出异常,观察整体的事务状态,观察是否有整体的事务控制效果。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据卡片_VISA消息:关于VCPS 2.1卡片产品的性能和交叉测试的卡片个性化数据的更新...

我们都知道从2020年6月1日起,所有用于性能和交叉测试的卡片样品都必须采用新的个性化数据用于卡片的个性化。需要注意的是,Visa已经发布了用于产品性能和交叉测试的卡片个性化数据2.0版本,支持VCPS 2.1.x产品。从2020年7月27日起,…

一文剖析2020年最火十大物联网应用|IoT Analytics 年度重磅报告出炉!

来源:北京物联网智能技术应用协会知名物联网研究机构IoT Analytics 2020年的最新报告显示,与往年相比,当前大多数物联网项目仍然落地于工业/制造业领域,另外,交通、能源、零售及医疗保健等垂直领域的市场份额也相对增加…

jbutton添加点击事件_electron-vue自定义边框后点击事件失效问题

问题描述:electron-vue自定义边框后点击事件失效(不单单点击事件,窗体内所有事件都失效)解决方案:在需要事件处理的节点上添加样式-webkit-app-region:no-drag;srcmainindex.js中设置:/**在样式文件中&…

新一代人工智能白皮书(2020年) ——产业智能化升级

全文共计1278字64图,预计阅读时间10分钟来源 | CIE智库(转载请注明来源)编辑 | 蒲蒲当前,我国经济发展进入新阶段,既面临产业转型升级与重塑国际经济格局的机遇,也面对传统要素红利衰减、经济增速换挡、经济…

世界半导体集成电路发展史(超细、超全)

来源:ittbank半导体集成电路发展史集成电路从产生到成熟大致经历了如下过程:电子管——晶体管——集成电路——超大规模集成电路晶体管的演变集成电路的前奏——电子管、晶体管 电子管,是一种在气密性封闭容器中产生电流传导,利用…

北大发布最新《图神经网络推荐系统》2020综述论文,27页pdf

来源:专知随着网络信息的爆炸式增长,推荐系统在缓解信息过载方面发挥了重要作用。由于推荐系统具有重要的应用价值,这一领域的研究一直在不断涌现。近年来,图神经网络(GNN)技术得到了广泛的关注,它能将节点信息和拓扑结…

anaconda镜像源配置_Anaconda使用技巧,如何修改国内镜像源?

在使用Anaconda时有时候需要加载别的模块这个时候需要通过官网下载模块由于官网的服务器在国外那个下载速度真的是慢到天际还好可以通过修改镜像这样下载模块会快很多本文讲Anaconda修改国内镜像源Anaconda修改国内镜像源通过conda config命令生成配置文件这里,我们…

HDU 5869.Different GCD Subarray Query-区间gcd+树状数组 (神奇的标记右移操作) (2016年ICPC大连网络赛)...

树状数组。。。 Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1541 Accepted Submission(s): 599 Problem DescriptionThis is a simple problem. The teacher gives Bob a lis…

c++ mmap写入速度_内存管理(24)mmap和缺页中断

相关文件:mm/mlock.cmm/util.cmm/mmap.cinclude/linux/slab.hmmap系统调用陷入内核中会调用vm_mmap_pgoff>do_mmap_pgoff函数来真正完成mmap操作1.1.do_mmap_pgoff函数(关键部分代码)do_mmap_pgoff16行:对需要映射的内存长度页对齐20行:ge…

邬贺铨院士:边缘计算“新十问”

来源:C114通信网作者:水易两年前的边缘计算技术峰会上,中国工程院院士邬贺铨就边缘计算提出十问,直戳技术演进与产业发展的核心问题,引起业内巨大反响。在过去两年中,边缘计算产业得到了长足发展&#xff0…

java 字符串第一个字符_深入Java源码剖析之字符串常量

字符串在Java生产开发中的使用频率是非常高的,可见,字符串对于我们而言非常关键。那么从C语言过来的同学会发现,在C中是没有String类型的,那么C语言要想实现字符串就必须使用char数组,通过一个个的字符来组拼成字符串。…

耗时11年,120页论文,中科大数学家成功证明微分几何核心猜想

大数据文摘出品近日,中国科技大学几何与物理研究中心创始主任陈秀雄教授与王兵教授团队发布论文“Space of Ricci flows (II)—Part B: Weak compactness of the flows”,在全球范围内率先证明了“哈密尔顿-田”和“偏零阶估计”这两个困扰数学界20多年的…

java 写入txt_Java线程转储的8个选项

线程转储是诊断CPU尖峰,死锁,内存问题,无响应的应用程序,较差的响应时间以及其他系统问题的重要工件。有很多很棒的在线线程转储分析工具,可以分析和发现问题。但是对于那些工具,您需要提供适当的线程转储作…

重磅!2020年度人类社会发展十大科学问题发布

来源:科技导报 在11月9日下午的第二届世界科技与发展论坛的闭幕式上,中国工程院院士、清华大学教授、《Research》编委周济和《柳叶刀》主编,爱思唯尔柳叶刀系列期刊总编辑、理查德霍顿共同发布了“2020年度人类社会发展十大科学问题”。本次…

前端导出excel文件带样式_vue前端使用xlsx导出数据到excel中--最简单的方式

最新项目中需要将页面数据导出到excel中,首先想到的就是度娘,得到的结果都是千篇一律,答案都是你复制我我复制你的,虽然能解决问题,但是这个过程也太复杂。既然无法改变,那就只好插手你的生活了。废话少说&…

7种情绪,人类心智的通用模块

来源:混沌巡洋舰1859年,达尔文以一个挑衅性的断言结束了他的《物种起源》,那就是‘人类的起源和他的历史将会被(进化)点亮’。在他的后期著作《人类的由来》(1和《人类与动物的情感表达》中,达尔文阐明了人…

gitbook mysql_使用Gitbook做笔记

一、安装# 通过npm全局安装npm install gitbook-cli -g# 查看版本gitbook --version二、创建一本书2.1 本地创建# 创建一个文件夹mkdir mysql-note# 初始化cd mysql-notegitbook init# 会创建两个文件# README.md 书皮# SUMMARY.md 目录# 从本地打开这本书gitbook serve# 将md文…

03、数据类型(02)

字典(dict) 字典是一种映射型的数据类型,每个元素成对出现,即key- value,每对元素key 和 value“:”冒号分开,元素之间用逗号隔开,整个字典包括子在{}中。 字典中的“key”必须是不可变类型&am…

器官复刻、脑机接口、电子皮肤…这些前沿科学或改写人类未来

来源:MEMS“2020年,新冠疫情爆发,面对困境,我们采取的行动将很可能改写这个时代。” 11月7日,2020腾讯科学WE大会线上举行。腾讯首席探索官网大为在开场演讲中表示,前沿科学突破能帮助我们做好准备拥抱未来…

GPT-3:人工智能的新突破

来源:王宏琳科学网博客在过去几个月里,占据海外科技新闻头条主导地位的、人工智能领域最令人兴奋的新事物之一是GPT-3——OpenAI的新的文本生成程序,一种由神经网络驱动的语言模型,一个根据人类用户的提示自动生成文本的人工智能引…