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

seata的xid在feign中传递分析

概述

业务中经常会遇到分布式事务失效的场景;通常情况下分析下两边的xid是否一致,就可以初步判定原因;
我这边正好遇到openfeign调用时其中一个rm抛异常,其他rm没回滚的现象;

排查了下发现tm和第一个rm注册到seataxid就不通;
然后看了下相关代码,发现openfeign的拦截器中没有对xid进行传递,后续传递xid之后,分布式事务后面回滚就ok了;

当前环境
jdk:1.8
seata-spring-boot-starter:1.6.1
spring-cloud-dependencies:2021.0.5
spring-cloud-alibaba-dependencies:2021.0.5.0

解决方案

在feign拦截器中传递seata的xid

package com.xxx.xxx.xxx.config;import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import io.seata.core.context.RootContext;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.annotation.Resource;@Configuration
public class FeignConfig {@Beanpublic RequestInterceptor requestInterceptor() {// 添加拦截器,所有内部服务调用都带上tokenreturn new RequestInterceptor() {@Overridepublic void apply(RequestTemplate requestTemplate) {//feign seata xid传递seataHeadProcess(requestTemplate);}};}/*** 传递seata的全局xid*/private void seataHeadProcess(RequestTemplate requestTemplate){// 从 seata 的 RootContext 中获取当前 XIDString xid = RootContext.getXID();if (StrUtil.isBlank(xid)) return;requestTemplate.header(RootContext.KEY_XID, xid);}
}

源码分析

一般springboot中的先找xxxAutoConfiguration
然后在SeataAutoConfiguration的同级目录下发现了SeataHttpAutoConfiguration,就是这个了;

然后一路点进去,最后发现在
io.seata.integration.http.TransactionPropagationInterceptor
中就看到了关于http请求头中xid的相关处理

在这里插入图片描述

http://www.dtcms.com/a/240336.html

相关文章:

  • deepseek: 反汇编 难点+ 工具
  • 亚马逊Woot深度解析
  • day36-多路IO复用
  • leetcode 264. 丑数 II
  • 微信小程序分包配置
  • 文件上传漏洞防御全攻略
  • ​ 【prompt】 “PUA” 的提示词是否好用 ?—“更好的驱动LLM能力”
  • 工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
  • 下面给出基于 ESP32-C3 AT 固件的完整方案,包括
  • 秘塔AI搜索:智能搜索,高效获取信息
  • AI书签管理工具开发全记录(十九):嵌入资源处理
  • 英语写作中“每一个”each individual、every individual、every single的用法
  • WEB3全栈开发——面试专业技能点P4数据库
  • uniapp 小程序 学习(一)
  • 【Fifty Project - D34】
  • 基于Flask,MySQL和MongoDB实现的在线阅读系统
  • WEB3全栈开发——面试专业技能点P6后端框架 / 微服务设计
  • DisplayPort 2.0协议介绍(2)
  • TJCTF 2025
  • 申请Let’s Encrypt 证书
  • 分布式增量爬虫实现方案
  • 【大模型:知识库管理】--Dify接入RAGFlow 知识库
  • Ray框架:分布式AI训练与调参实践
  • IP选择注意事项
  • QEMU源码全解析 —— 块设备虚拟化(26)
  • 渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
  • 37 C 语言字符串基础操作函数详解:strlen、strcpy、strncpy、strcat、strncat、strcmp、strncmp
  • 实现p2p的webrtc-srs版本
  • Coze工作流-语音故事创作-文本转语音的应用
  • LabVIEW双光子成像系统技术