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

本文介绍了在启用Hystrix后遇到的下游服务请求头丢失的问题。问题源于Hystrix使用子线程进行Feign调用,导致ThreadLocal中的request无法传递。为了解决这个问题,尝试了在上游服务配置Hystrix,并在下游服务打印request信息以重现问题。通过实现自定义并发策略来解决父子线程间request的传递,但在注册策略时遇到了已注册的错误。通过研究源码并覆盖原有策略,成功解决了这个问题,使服务恢复正常。

排查开启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) {
   
   
        ServletRequestAttributes
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值