Spring Cloud中Hystrix 線程隔離致使ThreadLocal數據丟失問題分析

最近spring boot項目中因爲使用了spring cloud 的hystrix 致使了threadLocal中數據丟失,其實具體也沒有使用hystrix,可是顯示的把他打開了,致使了此問題。java

致使此問題的代碼邏輯以下:服務之間的調用採用的feignclient,採用feignclient攔截器獲取上游設置到threadlocal中的數據。spring

@Slf4j
public class TenantSupportInterceptor implements RequestInterceptor {


    public void apply(RequestTemplate template) {
        String tenantNo = Optional.ofNullable(LocalHolder.getTenantNo());
        template.header(CommonConstants.TENANT_NO, tenantNo);
    }

}
public final class LocalHolder {

    private LocalHolder() {
    }

    private static final InheritableThreadLocal<String> TENANT_NO_THREADLOCAL = new InheritableThreadLocal<>();

    public static void setTenantNo(String tenantNo) {
        TENANT_NO_THREADLOCAL.set(tenantNo);
    }

    public static String getTenantNo() {
        return TENANT_NO_THREADLOCAL.get();
    }

    public static void removeTenantNo() {
        TENANT_NO_THREADLOCAL.remove();
    }
}

具體爲何採用InheritableThreadLocal下文有說明。app

可是有時候就拿不到。通過排查,這兩邊的線程發生了變化,致使取不到值。致使線程發生變化的緣由是顯示的聲明瞭hystrix爲true。線程

 

 只須要把這個設置成false就好。blog

可是若是項目中真真的是用了hystrix呢?rem

引用一下文檔進行說明:文檔

https://mp.weixin.qq.com/s?__biz=MzIwMDY0Nzk2Mw==&mid=2650319274&idx=1&sn=0a5bf8ef9148ba8562e0e1c58038da98&chksm=8ef5fddeb98274c8a88522c56050b5e5c7f6d510c5345cec795a130d3abd2b53a16513f578ce&scene=21#wechat_redirectget

it

https://cloud.tencent.com/developer/article/1082737io

相關文章
相關標籤/搜索