Spring Cloud Alibaba整合Seata实战

Spring Cloud Alibaba整合Seata实战

1.启动Seata Server

1.1 环境准备

1)指定nacos作为配置中心和注册中心
修改registry.conf文件
在这里插入图片描述
在这里插入图片描述
注意:客户端配置registry.conf使用nacos时也要注意group要和seata server中的group一致,默认group是"DEFAULT_GROUP"。

2)同步seata server的配置到nacos
获取/seata/script/config-center/config.txt,修改配置信息。
在这里插入图片描述
配置事务分组, 要与客户端配置的事务分组一致。
(客户端properties配置:spring.cloud.alibaba.seata.tx‐service‐group=my_test_tx_group)。
在这里插入图片描述
配置参数同步到Nacos
shell:

sh ${SEATAPATH}/script/config-center/nacos/nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 5a3c7d6c-f497-4d68-a71a-2e5e3340b3ca

参数说明:
-h: host,默认值 localhost
-p: port,默认值 8848
-g: 配置分组,默认值为 ‘SEATA_GROUP’
-t: 租户信息,对应 Nacos 的命名空间ID字段, 默认值为空 ‘’
在这里插入图片描述
3)启动Seata Server
启动Seata Server命令

bin/seata-server.sh

启动成功,默认端口8091
在这里插入图片描述
在注册中心可以查看到seata-server注册成功
在这里插入图片描述

2.Seata如何整合到Spring Cloud微服务

业务场景:
用户下单,整个业务逻辑由三个微服务构成:

  • 仓储服务:对给定的商品扣除库存数量。
  • 订单服务:根据采购需求创建订单。
  • 帐户服务:从用户帐户中扣除余额。
    在这里插入图片描述
    在这里插入图片描述
    环境准备:
    seata: v1.4.0
    spring cloud&spring cloud alibaba:
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version>

注意版本选择问题:
spring cloud alibaba 2.1.2 及其以上版本使用seata1.4.0会出现如下异常 (支持seata 1.3.0)
在这里插入图片描述

2.1 导入依赖

<!-- seata-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-all</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>io.seata</groupId><artifactId>seata-all</artifactId><version>1.4.0</version>
</dependency><!--nacos 注册中心-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.21</version>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope><version>8.0.16</version>
</dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.1</version>
</dependency>

2.2 微服务对应数据库中添加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,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2.3 微服务需要使用seata DataSourceProxy代理自己的数据源

/*** 需要用到分布式事务的微服务都需要使用seata DataSourceProxy代理自己的数据源*/
@Configuration
@MapperScan("com.aaa.datasource.mapper")
public class MybatisConfig {/*** 从配置文件获取属性构造datasource,注意前缀,这里用的是druid,根据自己情况配置,* 原生datasource前缀取"spring.datasource"** @return*/@Bean@ConfigurationProperties(prefix = "spring.datasource")public DataSource druidDataSource() {DruidDataSource druidDataSource = new DruidDataSource();return druidDataSource;}/*** 构造datasource代理对象,替换原来的datasource* @param druidDataSource* @return*/@Primary@Bean("dataSource")public DataSourceProxy dataSourceProxy(DataSource druidDataSource) {return new DataSourceProxy(druidDataSource);}@Bean(name = "sqlSessionFactory")public SqlSessionFactory sqlSessionFactoryBean(DataSourceProxy dataSourceProxy) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();//设置代理数据源factoryBean.setDataSource(dataSourceProxy);ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();factoryBean.setMapperLocations(resolver.getResources("classpath*:mybatis/**/*-mapper.xml"));org.apache.ibatis.session.Configuration configuration=new org.apache.ibatis.session.Configuration();//使用jdbc的getGeneratedKeys获取数据库自增主键值configuration.setUseGeneratedKeys(true);//使用列别名替换列名configuration.setUseColumnLabel(true);//自动使用驼峰命名属性映射字段,如userId ---> user_idconfiguration.setMapUnderscoreToCamelCase(true);factoryBean.setConfiguration(configuration);return factoryBean.getObject();}}

注意: 启动类上需要排除DataSourceAutoConfiguration,否则会出现循环依赖的问题。
在这里插入图片描述
启动类排除DataSourceAutoConfiguration.class。

@SpringBootApplication(scanBasePackages = "com.aaa",exclude = DataSourceAutoConfiguration.class)
public class AccountServiceApplication {public static void main(String[] args) {SpringApplication.run(AccountServiceApplication.class, args);}
}

4.添加seata配置

1)将registry.conf文件拷贝到resources目录下,指定注册中心和配置中心都是nacos

registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype = "nacos"nacos {serverAddr = "192.168.65.232:8848"namespace = ""cluster = "default"group = "SEATA_GROUP"}
}config {# file、nacos 、apollo、zk、consul、etcd3、springCloudConfigtype = "nacos"nacos {serverAddr = "192.168.65.232:8848"namespace = "29ccf18e-e559-4a01-b5d4-61bad4a89ffd"group = "SEATA_GROUP"}
}

org.springframework.cloud:spring-cloud-starter-alibaba-seataorg.springframework.cloud.alibaba.seata.GlobalTransactionAutoConfiguration类中,默认会使用 ${spring.application.name}-seata-service-group作为服务名注册到 Seata Server上,如果和service.vgroup_mapping配置不一致,会提示 no available server to connect错误。也可以通过配置 spring.cloud.alibaba.seata.tx-service-group修改后缀,但是必须和file.conf中的配置保持一致。

2)在yml中指定事务分组(和配置中心的service.vgroup_mapping 配置一一对应)

spring:application:name: account-servicecloud:nacos:discovery:server-addr: 127.0.0.1:8848alibaba:seata:tx-service-group:my_test_tx_group  # seata 服务事务分组

io.seata.core.rpc.netty.NettyClientChannelManager#getAvailServerList
》NacosRegistryServiceImpl#lookup
》String clusterName = getServiceGroup(key); #获取seata server集群名称
》List firstAllInstances = getNamingInstance().getAllInstances(getServiceName(), getServiceGroup(), clusters)

spring cloud alibaba 2.1.4 之后支持yml中配置seata属性,可以用来替换registry.conf文件。
配置支持实现在seata-spring-boot-starter.jar中,也可以引入依赖。

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

在yml中配置

seata:# seata 服务分组,要与服务端nacos-config.txt中service.vgroup_mapping的后缀对应tx-service-group: my_test_tx_groupregistry:# 指定nacos作为注册中心type: nacosnacos:server-addr: 127.0.0.1:8848namespace: ""group: SEATA_GROUP  config:# 指定nacos作为配置中心type: nacosnacos:server-addr: 127.0.0.1:8848namespace: "54433b62-df64-40f1-9527-c907219fc17f"group: SEATA_GROUP

3) 在事务发起者中添加@GlobalTransactional注解
核心代码

@Override
//@Transactional
@GlobalTransactional(name="createOrder")
public Order saveOrder(OrderVo orderVo){log.info("=============用户下单=================");log.info("当前 XID: {}", RootContext.getXID());// 保存订单Order order = new Order();order.setUserId(orderVo.getUserId());order.setCommodityCode(orderVo.getCommodityCode());order.setCount(orderVo.getCount());order.setMoney(orderVo.getMoney());order.setStatus(OrderStatus.INIT.getValue());Integer saveOrderRecord = orderMapper.insert(order);log.info("保存订单{}", saveOrderRecord > 0 ? "成功" : "失败");//扣减库存storageFeignService.deduct(orderVo.getCommodityCode(),orderVo.getCount());//扣减余额accountFeignService.debit(orderVo.getUserId(),orderVo.getMoney());//更新订单Integer updateOrderRecord = orderMapper.updateOrderStatus(order.getId(),OrderStatus.SUCCESS.getValue());log.info("更新订单id:{} {}", order.getId(), updateOrderRecord > 0 ? "成功" : "失败");return order;}

4)测试分布式事务是否生效
用户下单账户余额不足,库存是否回滚
在这里插入图片描述

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

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

相关文章

Linux--生产消费模型

线程系列&#xff1a; Linux–线程的认识(一) Linux–线程的分离、线程库的地址关系的理解、线程的简单封装&#xff08;二&#xff09; 线程的互斥&#xff1a;临界资源只能在同一时间被一个线程使用 生产消费模型 生产消费模型是多线程编程和分布式系统中的一个经典概念&…

我们水冷使制动电阻功率密度成倍增加-水冷电阻设计工厂

先进陶瓷 我们后来发现工业应用中对占用空间最小的水冷电阻器的工业需求&#xff0c;推出了适用于中压工业应用的水冷电阻器。它的特点是两块由具有特殊性能的先进陶瓷制成的板。 使用工业电驱动装置的一个重要好处是&#xff0c;可靠的再生和动态制动系统可以补充或取代传统…

Laravel :如何将Excel文件导入数据库

文章目录 一、前提二、使用2.1、新建一个导入文件2.2、新建一个控制器和方法,调用导入文件2.3、 新建一个页面&#xff0c;支持文件上传 一、前提 想要将excel内容入库&#xff0c;laravel有扩展可以使用,常用的扩展是maatwebsite/excel&#xff0c;安装步骤参考上一篇&#x…

Mosh|SQL教程第四弹(未完)

SQL有很多自带的内聚的函数&#xff08;MAX、MIN、AVG、SUM、COUNT&#xff09; 一、聚合函数&#xff08;Aggregate Functions&#xff09; 这里的括号可以写列名也可以写表达式,下面是一个练习&#xff1a; 二、GROUP BY子句 统计2019-07-01以后每个客户的总销售额 注意这…

Javaweb11-Filter过滤器

Filter过滤器 1.Filter的基本概念&#xff1a; 在Java Servlet中&#xff0c;Filter接口是用来处理HttpServletRequest和HttpServletResponse的对象的过滤器。主要用途是在请求到达Servlet之前或者响应离开Servlet之前对请求或响应进行预处理或后处理。 2.Filter常见的API F…

探展2024世界人工智能大会之合合信息扫描黑科技~

文章目录 ⭐️ 前言⭐️ AIGC古籍修复文化遗产焕新⭐️ 高效的文档图像处理解决方案⭐️ AIGC扫描黑科技一键全搞定⭐️ 行业级的大模型加速器⭐️ 结语 ⭐️ 前言 大家好&#xff0c;我是 哈哥&#xff08;哈哥撩编程&#xff09; &#xff0c;这次非常荣幸受邀作为专业观众参…

重磅!新公司法正式实施,这些变化你必须知道! ️

新公司法来了&#xff01;企业设立和经营必知的关键变动 &#x1f3db;️&#x1f680; 大家好&#xff0c;我是猫头虎&#xff0c;科技自媒体博主。今天我们来聊聊一件大事——新公司法的实施&#xff0c;这对企业设立和经营带来了哪些重大影响&#xff1f;跟着我&#xff0c…

【DDIM】DENOISING DIFFUSION IMPLICIT MODELS【论文精读】【视频讲解】【公式推导】

论文&#xff1a;DENOISING DIFFUSION IMPLICIT MODELS&#xff08;https://arxiv.org/abs/2010.02502&#xff09; B站视频链接 DDIM论文精讲视频 去噪扩散隐模型的论文精读&#xff0c;涉及本文的大部分公式逐步推导。总计3小时的详细论文讲解。 讲解详细对应文档 DDIM视频…

聊聊mysql

记录那些坑 本文会持续更新&#xff0c;陆续更新有关mysql技术内幕、实战优化、面试技巧。 文章目录 前言索引BTree之聚集索引BTree之辅助索引BTree之联合索引BTree之覆盖索引 使用到的工具1、py_innodb_page_info工具2、hexdump工具 总结 前言 重中之重的MySql数据库 mysql…

概率论期末速成(知识点+例题)

考试范围 一&#xff1a; 事件关系运算性质全概率公式、贝叶斯公式古典概型 二&#xff1a; 离散分布律连续密度函数性质 -> 解决三个问题&#xff08;求待定系数、求概率、求密度函数&#xff09;分布函数 -> 解决三个问题常用分布&#xff08;最后一节课的那几个分…

手电筒的光能飞到宇宙尽头吗

如果我们打开手电筒向夜空照一秒再关掉&#xff0c;我们将会看到&#xff0c;在关掉手电筒的一瞬间&#xff0c;手电筒发出的光束也会消失&#xff0c;那么&#xff0c;它发出的光哪去了呢&#xff1f;下面我们就来聊一下这个话题。实际上&#xff0c;我们看到的光束&#xff0…

Spark SQL 概述

Spark SQL 概述 Spark SQL 是 Apache Spark 的一个模块&#xff0c;专门用于处理结构化数据。它集成了 SQL 查询和 Spark 编程的强大功能&#xff0c;使得处理大数据变得更加高效和简便。通过 Spark SQL&#xff0c;用户可以直接在 Spark 中使用 SQL 查询&#xff0c;或者使用 …

ubuntu16.04安装低版本cmake(安装cmake安装)

文章目录 ubuntu16.04安装低版本cmake&#xff08;安装cmake安装&#xff09;1. **下载并解压CMake压缩文件**&#xff1a;- 首先&#xff0c;你需要从CMake的官方网站或其他可靠来源下载cmake-2.8.9-Linux-i386.tar.gz文件。- 然后在终端中使用以下命令解压文件&#xff1a; 2…

BFS:多源BFS问题

一、多源BFS简介 超级源点&#xff1a;其实就是把相应的原点一次性都丢到队列中 二、01矩阵 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:const int dx[4]{1,-1,0,0};const int dy[4]{0,0,1,-1};vector<vector<int>> updateMatrix(vector…

headerpwn:一款针对服务器响应与HTTP Header的模糊测试工具

关于headerpwn headerpwn是一款针对服务器响应与HTTP Header的模糊测试工具&#xff0c;广大研究人员可以利用该工具查找网络异常并分析服务器是如何响应不同HTTP Header的。 功能介绍 当前版本的headerpwn支持下列功能&#xff1a; 1、服务器安全与异常检测&#xff1b; 2、…

QFileDialog的简单了解

ps&#xff1a;写了点垃圾&#xff08;哈哈哈&#xff09; 它继承自QDialog 这是Windows自己的文件夹 这是两者的对比图&#xff1a; 通过看QFileDialog的源码&#xff0c;来分析它是怎么实现这样的效果的。 源码组成&#xff1a; qfiledialog.h qfiledialog_p.h&#xff…

Python面试宝典第11题:最长连续序列

题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;…

打造热销爆款:LazadaShopee店铺测评与关键词策略

面对Lazada和Shopee平台上店铺销量难以突破的困境&#xff0c;卖家们往往寻求各种解决方案。其中&#xff0c;店铺测评作为提升店铺信誉、优化产品排名及增加曝光度的有效手段&#xff0c;正逐渐成为卖家关注的焦点。以下将深入探讨店铺测评的好处、实施技巧及自养号的关键要素…

提升校园效率:智慧校园后勤管理中的寻物管理功能

在智慧校园后勤管理体系中&#xff0c;寻物管理功能扮演着连接遗失与找回的桥梁角色&#xff0c;它充分利用现代信息技术&#xff0c;为校园内的师生提供了一套高效、便捷的失物招领解决方案。此功能围绕以下几个核心方面展开。 首先&#xff0c;它支持在线报失与信息登记。一旦…

如何连接到公司的服务器?

1.下载FileZilla FileZilla的下载与安装以及简单使用&#xff08;有图解超简单&#xff09;-CSDN博客 2.打开 3.输入主机 用户名 密码 端口 注&#xff1a;主机支持的协议类型&#xff1a; 4.连接成功 其他方式也有很多&#xff0c;比如通过cmd&#xff0c;html网页等等 3个…