微服务加入seata后。a服务调用b服务开启全局事务,会出现b服务拿不到AuthUtil的user对象

Blade 未结 4 708
洪猪长
洪猪长 剑圣 2023-09-27 09:30

一、该问题的重现步骤是什么?

1. 微服务加入seata后。a服务调用b服务开启全局事务,会出现b服务拿不到AuthUtil的user对象,是正常的,还是seata配置错误

二、你期待的结果是什么?实际看到的又是什么?


三、你正在使用的是什么产品,什么版本?在什么操作系统上?


四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

4条回答
  • 2023-09-27 11:13

    image.png

    补充问题

    0 讨论(0)
  • 2023-09-27 11:16

    feign调用、分布式事务的情况,要通过传参方式传递userId,然后实现类获取userId再从库或者缓存获取用户数据。不要用AuthUtil获取因为会有其他的依赖也实现了feign接口导致请求头传递失效

    0 讨论(3)
  • 2023-09-28 14:48

    上面的回答不完整, 我这里贴下修改后的代码. 您这边看下是否会对bladex-tool产生影响.

    org.springblade.core.cloud.sentinel.BladeSentinelAutoConfiguration配置类中:

    @Bean
    @ConditionalOnMissingBean
    public BladeFeignRequestInterceptor requestInterceptor() {
       return new BladeFeignRequestInterceptor();
    }


    0 讨论(0)
  • 2023-10-07 14:56

    上面回答的也不完整,你找到了位置,但是没说出来问题所在

    BladeSentinelAutoConfiguration.java中修改下下面的代码即可。原因:开启了seata,seata中有个feign的Interceptor和BladeFeignRequestInterceptor实现了同一个接口,下面代码生成对象时就用了seata的那个了,不会走下面的方法了,固feign调用时请求头传递不过去了

    @Bean
    @ConditionalOnMissingBean(name = "bladeFeignRequestInterceptor")
    public RequestInterceptor requestInterceptor() {
       return new BladeFeignRequestInterceptor();
    }

    楼主,采纳吧,这个问题,我一点点debug,找了一天才找到问题所在。

    0 讨论(0)
提交回复