当前位置: 首页 > news >正文

SpringBoot集成Seata分布式事务OpenFeign远程调用

Docker Desktop 安装Seata Server

seata 本质上是一个服务,用docker安装更方便,配置默认:file

docker run -d --name seata-server -p 8091:8091 -p 7091:7091 seataio/seata-server:2.0.0

与SpringBoot集成

表结构

在这里插入图片描述

项目目录

在这里插入图片描述

dynamic和dynamic2新建user、undo_log表

每个数据库都必须包含undo_log表(user表不是必须的,这里只是演示

CREATE TABLE `undo_log` (`branch_id` bigint NOT NULL COMMENT 'branch transaction id',`xid` varchar(128) NOT NULL COMMENT 'global transaction id',`context` varchar(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` longblob NOT NULL COMMENT 'rollback info',`log_status` int NOT NULL COMMENT '0:normal status,1:defense status',`log_created` datetime(6) NOT NULL COMMENT 'create datetime',`log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`),KEY `ix_log_created` (`log_created`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AT transaction mode undo table';

spring-boot-feign-seata1

pom.xml

		<!-- lombok 1.18.26 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope><optional>true</optional></dependency><!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- mysql 8.0.32 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>${mysql.version}</version><scope>runtime</scope></dependency><!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- web 2.7.9 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis-Plus 3.5.2 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><!-- seata 调用方用 openfeign 必须引入spring-cloud-starter-alibaba-seata,否则被调用方获取到的xid可能会为null --><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></dependency><!-- cloud seata 2.0.0 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions></dependency><!-- openfeign 3.1.9 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

application.yml

server:port: 8088spring:application:name: spring-boot-feign-seata1datasource:driver-class-name: com.mysql.cj.jdbc.Driver# 数据库必须包含 undo_log 表,如果没有则用 resources 目录下的undo_log.sql 创建url: jdbc:mysql://127.0.0.1:3306/dynamic?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456seata:tx-service-group: my_test_tx_group

SpringBootFeignSeata1Application.java

@MapperScan
@EnableFeignClients
// seata 版本兼容性问题,如果启动报错就要排除 SeataRestTemplateAutoConfiguration 自动配置
@SpringBootApplication(exclude = SeataRestTemplateAutoConfiguration.class)
public class SpringBootFeignSeata1Application {public static void main(String[] args) {SpringApplication.run(SpringBootFeignSeata1Application.class, args);}}

User.java

@Data
@TableName("user")
public class User {@TableId(type = IdType.AUTO)private Integer id;private String name;
}

UserMapper.java

public interface UserMapper extends BaseMapper<User> {}

UserController.java

@RestController
@RequiredArgsConstructor
public class UserController {private final UserService userService;@GetMapping("user")public String user(@RequestParam(name = "rollback") boolean rollback) {User user = new User();user.setName("Meta");try {userService.insert(rollback, user);} catch (Exception e) {return "rollback";}return "success";}}

UserFeignClient.java(openfeign调用spring-boot-feign-seata2)

@FeignClient(name = "spring-boot-feign-seata2", url = "127.0.0.1:8089")
public interface UserFeignClient {@GetMapping("user")void user();}

UserService.java(主要的)

@Slf4j
@Service
@RequiredArgsConstructor
public class UserService {private final UserMapper userMapper;private final UserFeignClient userFeignClient;/*** 全局事务* 1、pom.xml引入seata-spring-boot-starter* 2、pom.xml引入spring-cloud-starter-alibaba-seata(排除:seata-spring-boot-starter,因为前面已经引入了。)* 3、使用 @GlobalTransactional 全局事务注解开启全局事务控制(默认:Seata AT 模式)* 4、被调用方业务层需要引入 @Transactional 本地事务注解*/@GlobalTransactional(rollbackFor = Exception.class)public void insert(boolean rollback, User user) {log.info("seata1 xid = {}", RootContext.getXID());userMapper.insert(user);userFeignClient.user();if (rollback) {throw new RuntimeException("rollback");}}
}

spring-boot-feign-seata2

pom.xml和spring-boot-feign-seata是一样的

application.yml

server:port: 8089spring:application:name: spring-boot-feign-seata2datasource:driver-class-name: com.mysql.cj.jdbc.Driver# 数据库必须包含 undo_log 表,如果没有则用 resources 目录下的undo_log.sql 创建url: jdbc:mysql://127.0.0.1:3306/dynamic2?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456seata:tx-service-group: my_test_tx_group

SpringBootFeignSeata2Application.java

@MapperScan
// 被调用端引用 seata 默认 AT 模式
@EnableAutoDataSourceProxy
// seata 版本兼容性问题,如果启动报错就要排除 SeataRestTemplateAutoConfiguration 自动配置
@SpringBootApplication(exclude = SeataRestTemplateAutoConfiguration.class)
public class SpringBootFeignSeata2Application {public static void main(String[] args) {SpringApplication.run(SpringBootFeignSeata2Application.class, args);}}

UserController.java

@RestController
@RequiredArgsConstructor
public class UserController {private final UserService userService;@GetMapping("user")public void user() {User user = new User();user.setName("Meta2");userService.insert(user);}}

UserService.java

@Slf4j
@Service
@RequiredArgsConstructor
public class UserService {private final UserMapper userMapper;/*** 调用方用 openfeign 必须引入spring-cloud-starter-alibaba-seata,否则被调用方获取到的xid可能会为null* PS:被调用方可以不用引入*/@Transactional(rollbackFor = Exception.class)public void insert(User user) {log.info("seata2 xid = {}", RootContext.getXID());userMapper.insert(user);}}

上面重复的文件就不说了

启动两个项目

访问localhost:8088/user?rollback=true

返回rollback,2个数据库都没有新增数据库,验证分布式(AT)事务回滚成功

访问localhost:8088/user?rollback=false

返回success,2个数据库都新增了数据,验证分布式(AT)事务成功

相关文章:

SpringBoot集成Seata分布式事务OpenFeign远程调用

Docker Desktop 安装Seata Server seata 本质上是一个服务&#xff0c;用docker安装更方便&#xff0c;配置默认&#xff1a;file docker run -d --name seata-server -p 8091:8091 -p 7091:7091 seataio/seata-server:2.0.0与SpringBoot集成 表结构 项目目录 dynamic和dyna…...

视觉检测系统,是否所有产品都可以进行视觉检测?

视觉检测系统作为一种先进的质检工具&#xff0c;虽然具有广泛的应用范围&#xff0c;但并非所有产品都适合进行视觉检测。本文将探讨视觉检测系统的适用范围及其局限性。 随着机器视觉技术的快速发展&#xff0c;视觉检测系统已广泛应用于各个行业&#xff0c;为产品质检提供…...

通过金山和微软虚拟打印机转换PDF文件,流程方法及优劣对比

文章目录 一、WPS/金山 PDF虚拟打印机1、常规流程2、PDF文件位置3、严重缺陷二、微软虚拟打印机Microsoft Print to Pdf1、安装流程2、微软虚拟打印机的优势一、WPS/金山 PDF虚拟打印机 1、常规流程 安装过WPS办公组件或金山PDF独立版的电脑,会有一个或两个WPS/金山 PDF虚拟…...

采用java+B/S开发的全套医院绩效考核系统源码springboot+mybaits 医院绩效考核系统优势

采用java开发的全套医院绩效考核系统源码springbootmybaits 医院绩效考核系统优势 医院绩效管理系统解决方案紧扣新医改形势下医院绩效管理的要求&#xff0c;以“工作量为基础的考核方案”为核心思想&#xff0c;结合患者满意度、服务质量、技术难度、工作效率、医德医风等管…...

驱动开发-用户空间和内核空间数据传输

1.用户空间-->内核空间&#xff08;写&#xff09; #include<linux/uaccess.h> int copy_from_user(void *to,const void __user volatile*from,unsigned long n) 函数功能&#xff1a;将用户空间数据拷贝到内核空间 参数&#xff1a; to&#xff1a;内核空间首地…...

【408精华知识】速看!各种排序的大总结!

文章目录 一、插入排序&#xff08;一&#xff09;直接插入排序&#xff08;二&#xff09;折半插入排序&#xff08;三&#xff09;希尔排序 二、交换排序&#xff08;一&#xff09;冒泡排序&#xff08;二&#xff09;快速排序 三、选择排序&#xff08;一&#xff09;简单选…...

【STM32 |程序实例】按键控制、光敏传感器控制蜂鸣器

目录 前言 按键控制LED 光敏传感器控制蜂鸣器 前言 上拉输入&#xff1a;若GPIO引脚配置为上拉输入模式&#xff0c;在默认情况下&#xff08;GPIO引脚无输入&#xff09;&#xff0c;读取的GPIO引脚数据为1&#xff0c;即高电平。 下拉输入&#xff1a;若GPIO引脚配置为下…...

Spring boot使用websocket实现在线聊天

maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spr…...

品牌设计理念和logo设计方法

一 品牌设计的目的 设计是为了传播&#xff0c;让传播速度更快&#xff0c;传播效率更高&#xff0c;减少宣传成本 二 什么是好的品牌设计 好的设计是为了让消费者更容易看懂、记住的设计&#xff0c; 从而辅助传播&#xff0c; 即 看得懂、记得住。 1 看得懂 就是让别人看懂…...

Python | Leetcode Python题解之第88题合并两个有序数组

题目&#xff1a; 题解&#xff1a; class Solution:def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:"""Do not return anything, modify nums1 in-place instead."""p1, p2 m - 1, n - 1tail m n - 1whi…...

vscode新版本remotessh服务端报`GLIBC_2.28‘ not found解决方案

问题现象 通过vscode的remotessh插件连接老版本服务器&#xff08;如RHEL7&#xff0c;Centos7&#xff09;时&#xff0c;插件会报错&#xff0c;无法连接。 查看插件的错误日志可以看到类似如下的报错信息&#xff1a; dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node: /li…...

盘他系列——oj!!!

1.Openjudge 网站: OpenJudge 2.洛谷 网站: 首页 - 洛谷 | 计算机科学教育新生态 3.环球OJ 网站: QOJ - QOJ.ac 4. 北京大学 OJ:Welcome To PKU JudgeOnline 5.自由OJ 网站: https://loj.ac/ 6.炼码 网站:LintCode 炼码 8.力扣 网站: 力扣 9.晴练网首页 - 晴练网...

洛谷 P2657 [SCOI2009] windy 数 题解 数位dp

[SCOI2009] windy 数 题目背景 windy 定义了一种 windy 数。 题目描述 不含前导零且相邻两个数字之差至少为 2 2 2 的正整数被称为 windy 数。windy 想知道&#xff0c;在 a a a 和 b b b 之间&#xff0c;包括 a a a 和 b b b &#xff0c;总共有多少个 windy 数&…...

Python爬虫入门:网络世界的宝藏猎人

今天阿佑将带你踏上Python的肩膀&#xff0c;成为一名网络世界的宝藏猎人&#xff01; 文章目录 1. 引言1.1 简述Python在爬虫领域的地位1.2 阐明学习网络基础对爬虫的重要性 2. 背景介绍2.1 Python语言的流行与适用场景2.2 网络通信基础概念及其在数据抓取中的角色 3. Python基…...

【NodeMCU实时天气时钟温湿度项目 6】解析天气信息JSON数据并显示在 TFT 屏幕上(心知天气版)

今天是第六专题&#xff0c;主要内容是&#xff1a;导入ArduinoJson功能库&#xff0c;借助该库解析从【心知天气】官网返回的JSON数据&#xff0c;并显示在 TFT 屏幕上。 如您需要了解其它专题的内容&#xff0c;请点击下面的链接。 第一专题内容&#xff0c;请参考&a…...

重构四要素:目的、对象、时机和方法

目录 1.引言 2.重构的目的:为什么重构(why) 3.重构的对象:到底重构什么(what) 4.重构的时机:什么时候重构(when) 5.重构的方法:应该如何重构(how) 6.思考题 1.引言 一些软件工程师对为什么要重构(why)、到底重构什么(what)、什么时候重构(when)应该如何重构(how)等问题的…...

基于Echarts的大数据可视化模板:服务器运营监控

目录 引言背景介绍研究现状与相关工作服务器运营监控技术综述服务器运营监控概述监控指标与数据采集可视化界面设计与实现数据存储与查询优化Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满足管理的特定需求模板功能与特性…...

Python3 笔记:Python的常量

常量&#xff08;constant&#xff09;&#xff1a;跟变量相对应&#xff0c;指第一次赋予值后就保持固定不变的值。 Python里面没有声明常量的关键字&#xff0c;其他语言像C/C/Java会有const修饰符&#xff0c;但Python没有。 Python中没有使用语法强制定义常量&#xff0c…...

【Linux】自动化构建工具make/Makefile和git介绍

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 前言 Linux项目自动化构建工具-make/Makefile 举例 .PHONY 常见符号 依赖关系…...

C语言—关于字符串(编程实现部分函数功能)

0.前言 当我们使用这些函数功能时&#xff0c;可以直接调用头文件---#include<string.h>&#xff0c;然后直接使用就行了,本文只是手动编写实现函数的部分功能 1.strlen函数功能实现 功能说明&#xff1a;strlen(s)用来计算字符串s的长度&#xff0c;该函数计数不会包括最…...

ElevenLabs支持广西话吗?2024最新实测结果曝光:仅2个API参数决定能否合成地道“梧州腔”

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs广西话语音支持的现状与背景 ElevenLabs 作为全球领先的AI语音合成平台&#xff0c;目前尚未在官方API文档、语言列表或控制台界面中提供对广西话&#xff08;含南宁白话、梧州话、玉林话等粤…...

曝GPT-5.5用上“全球最快芯片”,Claude慌了

120B模型飙到2000 token/秒&#xff0c;CFO更放话已在跑GPT-5.5&#xff01;Cerebras 560亿美元IPO首日暴涨68%&#xff0c;但SemiAnalysis万字拆解直指死穴。 SemiAnalysis&#xff0c;硅谷最硬核的芯片分析机构&#xff0c;4月份光是AI工具的订阅费就烧到了年化1000万美元。…...

7 年评测经验博主发布扫地机器人挑选指南,邀你探讨机器人革命!

评测多款扫地机器人&#xff0c;Matic 脱颖而出博主发布了关于挑选最佳扫地机器人的指南&#xff0c;近期评测了戴森的 Spot & Scrub、鲨客的 Power Detect 以及 Matic。在其 7 年的扫地机器人评测生涯中&#xff0c;Matic 是最有意思的新型扫地机器人。拨开营销迷雾&#…...

ElevenLabs广西话语音定制全链路指南(含南宁/柳州/玉林三方言音色对比数据)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ElevenLabs广西话语音定制的背景与技术定位 随着语音合成技术从通用语种向方言及小众语言纵深演进&#xff0c;区域性语音能力成为人机交互本地化落地的关键瓶颈。广西话&#xff08;以南宁白话为代表&#x…...

告别键盘连击烦恼:Keyboard Chatter Blocker终极使用指南

告别键盘连击烦恼&#xff1a;Keyboard Chatter Blocker终极使用指南 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 你是否经常在打字时…...

为OpenClaw智能体工作流配置Taotoken聚合端点的教程

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为OpenClaw智能体工作流配置Taotoken聚合端点的教程 OpenClaw是一款功能强大的智能体开发工具&#xff0c;它允许开发者构建和编排…...

PaddleOCR车牌识别实战:从3万张数据集处理到模型训练部署的完整避坑指南

PaddleOCR车牌识别实战&#xff1a;从3万张数据集处理到模型训练部署的完整避坑指南 车牌识别作为计算机视觉领域的经典应用场景&#xff0c;在智慧交通、安防监控、停车场管理等行业有着广泛需求。PaddleOCR作为国内领先的OCR开源框架&#xff0c;凭借其优异的性能和丰富的预训…...

数据治理:数据质量与元数据管理

数据治理&#xff1a;数据质量与元数据管理 大家好&#xff0c;我是欧阳瑞&#xff08;Rich Own&#xff09;。今天想和大家聊聊数据治理这个重要话题。作为一个全栈开发者&#xff0c;数据治理是确保数据资产价值的关键。今天就来分享一下数据质量和元数据管理的实战经验。 数…...

软件测试的隐藏晋升通道:从QA到QE再到QP

在软件测试领域&#xff0c;大多数人熟悉的职业路径是纵向的&#xff1a;初级、高级、测试架构师或测试经理。然而&#xff0c;在喧闹的晋升阶梯背后&#xff0c;还隐藏着一条认知门槛更高、价值密度更大的水平进化通道——从QA到QE&#xff0c;最终抵达QP。这不是岗位名称的更…...

一个电商项目 开发的完整流程是什么==从0 疑难杂症

--- 一、从0开始的完整流程&#xff08;时间顺序&#xff09;0&#xff09;立项&#xff1a;先定“能赚钱的最小闭环”先别谈技术&#xff0c;先定这4件…...