Spring Cloud Alibaba-(5)Seata【分布式事务】

ops/2024/9/23 6:28:05/

Spring Cloud Alibaba-(1)搭建项目环境

Spring Cloud Alibaba-(2)Nacos【服务注册与发现、配置管理】

Spring Cloud Alibaba-(3)OpenFeign【服务调用】

Spring Cloud Alibaba-(4)Sentinel【流控和降级】

Spring Cloud Alibaba-(5)Seata【分布式事务】

【已解决】使用Seata分布式事务,服务端报错 could not find any implementation for class

1.Seata 官网(https://seata.apache.org/zh-cn/)

2.TC(事务协调者)、TM(事务管理器)、RM(资源管理器)

31c65c9f2397418e98c9e9027dd99626.png

3.Seata 使用2PC(两阶段提交协议)

3.1 Prepare(预处理阶段):事务协调者给参与者发送Prepare请求,参与者响应。

3.2 Commit(提交阶段):如果所有参与者都响应Yes,则协调者发送Commit请求,让参与者提交事务;否则,协调者发送RollBack请求,让参与者回滚事务。

3.3 优点:

一致性保证了分布式系统中所有参与者的状态一致性
原子性确保事务要么全部成功,要么全部失败

3.4 不足:

性能开销2PC 需要在提交之前进行多次网络通信,增加了事务处理的时间
单点故障协调者是单点故障,如果协调者在提交阶段发生故障,可能导致事务处于不确定状态
同步阻塞参与者在准备阶段需要锁定资源,直到事务完成,这可能导致资源长时间锁定,影响系统性能

4. AT模式(Auto Transaction)--基于2PC的优化方案

4.1 预处理阶段(Prepare):

在这个阶段,事务中的所有更新操作会被记录为“逆向操作”(Undo Log)和“正向操作”(Redo Log)。

“逆向操作”记录了如何撤销这些更新,以便在事务回滚时使用。

“正向操作”记录了如何完成这些更新,以便在事务提交时使用。

这些操作记录会持久化到本地数据库中,确保即使在系统崩溃的情况下也能恢复。

4.2 提交阶段(Commit):

如果预处理成功,则协调者向所有参与者发送提交指令,参与者根据“正向操作”记录提交事务。

否则,协调者将向所有参与者发送回滚指令,参与者根据“逆向操作”记录回滚事务。

5.下载(Seata-Server版本历史 | Apache Seata)

166fb3d70fe74951bce65b48c729842c.png

6.db + nacos 高可用模式启动 Seata 服务端

6.1 创建seata_server数据库,导入mysql.sql

8ab221b6b52e4d7097bb8b656e34767b.png

6.2 修改seata配置文件,使用 db+nacos 高可用模式(将application.example.yml 关于nacos、store.db配置复制过来)

98482c9886b946d28a2eb785d805e0d2.png

#  Copyright 1999-2019 Seata.io Group.
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#  http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.server:port: 7091spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${user.home}/logs/seataextend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstashconsole:user:username: seatapassword: seata
seata:config:# support: nacos 、 consul 、 apollo 、 zk  、 etcd3type: nacosnacos:server-addr: 127.0.0.1:8848namespace:group: SEATA_GROUPusername:password:context-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:data-id: seataServer.propertiesregistry:# support: nacos, eureka, redis, zk, consul, etcd3, sofatype: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848group: SEATA_GROUPnamespace:cluster: defaultusername:password:context-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:store:# support: file 、 db 、 redis 、 raftmode: dbsession:mode: dblock:mode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata_server?rewriteBatchedStatements=true&useSSL=falseuser: ***password: ***min-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 1000max-wait: 5000
#  server:
#    service-port: 8091 #If not configured, the default is '${server.port} + 1000'security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login

6.3 修改配置中心配置

0f584a4164684203a3c836f6372ac10d.png

66000d1c67904106b0edcc41e5b26bb5.png

e6101d2092fb476785881892b2824f6b.png

6.4 将配置注册到Nacos

32000dedbdf142f69030037ac3bb1fff.png

6.5 双击启动 Seata 服务

f4cc3f9b8785406995861b9fe7c6bf23.png

6.6 访问 http://localhost:7091/

76d43a8d56ad4369af2cb185824e4175.png

7.项目搭建 Seata 客户端

7.1 涉及Seata分布式事务的服务(订单服务、产品服务),添加Maven依赖

<!-- seata 分布式事务 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

7.2 涉及Seata分布式事务的服务(订单服务、产品服务),数据库都需要添加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;

7.3 涉及Seata分布式事务的服务(订单服务、产品服务),bootstrap.yml 配置 Seata

7.3.1 订单服务 bootstrap.yml 配置 Seata

server:port: 8000spring:profiles:active: publicapplication:name: order-servicedatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springcloud2024username: rootpassword: 123456cloud:nacos:discovery:server-addr: http://localhost:8848config:server-addr: http://localhost:8848file-extension: yamlnamespace: publicshared-configs:- data-id: order-service-default.yamlrefresh: true- data-id: order-service-default-test.yamlrefresh: trueopenfeign:httpclient:# 连接超时connection-timeout: 5000sentinel:transport:dashboard: http://localhost:8858datasource:flow-rule:nacos:server-addr: http://localhost:8848data-id: order-service-flow-rulerule-type: flow# Openfeign 整合 sentinel
feign:sentinel:enabled: trueseata:registry:type: nacosnacos:server-addr: http://localhost:8848application: seata-servergroup: SEATA_GROUPconfig:type: nacosnacos:server-addr: http://localhost:8848group: SEATA_GROUPtx-service-group: default_tx_group

7.3.2 产品服务 bootstrap.yml 配置 Seata

server:port: 8400spring:application:name: product-servicedatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springcloud2024username: rootpassword: 123456cloud:nacos:discovery:server-addr: http://localhost:8848config:server-addr: http://localhost:8848seata:registry:type: nacosnacos:server-addr: http://localhost:8848application: seata-servergroup: SEATA_GROUPconfig:type: nacosnacos:server-addr: http://localhost:8848group: SEATA_GROUPtx-service-group: default_tx_group

7.4 业务方法加 @GlobalTransactional 开启分布式任务

cda3415837d94b18b1c5729d8aef758b.png

7.5 订单服务调用下单接口。下单失败,订单服务没有新增订单,产品服务没有扣减库存,实现分布式任务。

98fa434b055141d487fc96e52f17ff32.png

af9ce66e1b7844e991f7486bdf19fe95.png


http://www.ppmy.cn/ops/114627.html

相关文章

【Proteus仿真】基于51单片机的宠物喂食系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;两个按键调整重量阈值的大小&#xff0c;如果mpx4117压力传感器测重没超过阈值&#xff0c; 则电机转动&#xff0c;表示投喂&#xff0c;蜂鸣器发出滴滴声&#xff0c;如…

计算机毕业设计springboot+vue高校教学实施评教系统springcloud微服务分布式

目录 功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行需求分析系统设计软件测试核心代码部分展示详细视频演示源码获取 功能和技术介绍 本项目包含程序源码和MySql脚本和文档,idea开发,支持Eclipse。使用vue的本质是SpringFramework【IoC&am…

Android Choreographer 监控应用 FPS

Choreographer 是 Android 提供的一个强大的工具类&#xff0c;用于协调动画、绘制和视图更新的时间。它的主要作用是协调应用的绘制过程&#xff0c;以确保流畅的用户体验。Choreographer 也可以帮助我们获取帧时间信息&#xff0c;从而为性能监测和优化提供重要的数据支持。 …

mockito+junit搞定单元测试(2h)

一&#xff0c;简介 1.1 单元测试的特点 配合断言使用(杜绝 System.out )可重复执行不依赖环境不会对数据产生影响spring 的上下文环境不是必须的一般都需要配合 mock 类框架来实现 1.2 mock 类框架使用场景 要进行测试的方法存在外部依赖(如 db, redis, 第三方接口调用等)…

STM32 单片机最小系统全解析

STM32 单片机最小系统全解析 本文详细介绍了 STM32 单片机最小系统&#xff0c;包括其各个组成部分及设计要点与注意事项。STM32 最小系统在嵌入式开发中至关重要&#xff0c;由电源、时钟、复位、调试接口和启动电路等组成。 在电源电路方面&#xff0c;采用 3.3V 直流电源供…

【数据结构与算法 | 灵神题单 | 栈基础篇】力扣155, 1472, 1381

1. 力扣155&#xff1a;最小栈 1.1 题目&#xff1a; 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆…

修复 blender 中文输入 BUG (linux/wayland/GNOME/ibus)

blender 是一个很好的 开源 3D 建模/动画/渲染 软件, 功能很强大, 跨平台 (GNU/Linux, Windows 等系统都支持). 然而, 窝突然发现, blender 居然不支持中文输入 (linux) ! 这怎么能忍 ? 再一查, 不得了, 这居然是个 3 年前一直未解决的陈年老 BUG. 不行, 这绝对忍不了, 这个 …

招联金融秋招-2025

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策划 产品运营…