项目场景:
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></

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

被折叠的 条评论
为什么被折叠?



