Resilience4j 开启熔断保护后 Feign 调用时 Seata XID 未成功写入 Header

没有检索到标题
本文探讨了在SpringCloudOpenFeign应用中集成Resilience4j熔断保护和Seata全局事务后,XID头信息丢失的问题。通过添加resilience4j-bulkhead依赖、自定义SeataPropagator以及配置文件调整,解决了线程隔离导致的XID获取为空问题。

项目场景:

SpringCloud OpenFeign + Resilience4j + Seata 构建的微服务应用


问题描述

应用集成 SpringCloud OpenFeign 并使用 Resilience4j 开启熔断保护后,Seata 开启全局事务后,相关业务 Feign 调用时 Header 中未成功写入 XID
在这里插入图片描述

原因分析:

Seata XID 传播:
1、Seata 开启全局事务后会将 xid 写入执行当前业务的 Tomcat 线程的 ThreadLocal 中;
2、Seata 会实现 OpenFeign 的 RequestInterceptor 自动将当前线程的 ThreadLocal 中的 XID 写入本次 Feign 调用的 Header 中;

Resilience4j 熔断保护 Feign 调用:
1、Openfign 如果使用了 Resilience4j 熔断保护,默认采用线程池隔离模式,每次 Feign 调用都是用的 Resilience4j 的线程进行的,而非 Tomcat 的线程;
2、因为接入了 resilience4j 熔断保护现在 feign 调用使用了 resilience4j 的线程来执行,导致 seata 在使用 RootContext.getXID() 时值为 null,故无法成功将已开启的全局事务的 xid 添加到 feign header 中;


解决方案:

1、pom.xml 添加 resilience4j-bulkhead 依赖

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-bulkhead</artifactId></
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值