排查开启Hystrix导致下游服务请求头丢失问题

排查开启Hystrix导致下游服务请求头丢失问题

1、背景介绍

​ 看过我文章的博友应该记得之前为了解决服务雪崩问题整合过Hystrix熔断降级。不熟悉的整合的可以再去看看。直通车。

回规正题,在整合上线一段时间后,服务熔断降级问题得于解决,但最近用户经常反馈在不同平台之间登陆账号会互相挤下来。接到问题后就开始排查,先上一张生产日志图,相信熟悉的小伙伴应该能才到问题所在了。
在这里插入图片描述

2、问题重现

​ 通常解决问题,我们得先发现问题,只有找到问题发现的原因才能着手解决它。回到上面那张生产日志截图,相信大家都猜到了问题出现的原因,没错,Hystrix在开发feign链路的时候是用的子线程去调用的接口,看过源码知道request是通过ThreadLocal在当前线程中传输的,通过子线程拿不到request也就不奇怪了。
在这里插入图片描述
接下来我们先本地模拟下问题发生原因,首先在上游服务中先开启Hystrix熔断服务,在yml文件中加入以下配置即可。

# hystrix 配置,true表示开启,false关闭
feign:
  hystrix:
    enabled: true

加入上面配置后,我们分别设置false和true去模拟请求,并在下游服务打印request信息。发现在设置为true的情况下,是拿不到我们的request中的head的。
在这里插入图片描述在这里插入图片描述
既然我们知道问题是由于父子线程传输问题导致了,那是不是解决这个传输问题就解决问题了,直接上代码看效果

/**
 * Feign 配置注册,需要注意这个类得导入下@Import({FeignAutoConfiguration.class})
 */
@Configuration
public class FeignAutoConfiguration {
   

    @Bean
    public RequestInterceptor requestInterceptor() {
   
        return new FeignRequestInterceptor();
    }

    @PostConstruct
    public void hystrixConcurrencyStrategy() {
   
        HystrixPlugins.getInstance().registerConcurrencyStrategy(new FeignHystrixConcurrencyStrategy());
    }
}

/**
 * Hystrix 子线程无法获取request问题,重写传输策略,将主线程的request传到下级
 * feign.hystrix.enabled 当该属性为true时候该策略才会生效
 */
public class FeignHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {
   

    @Override
    public <T> Callable<T> wrapCallable(Callable<T> callable) {
   
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值