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


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

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

@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下文有說明。

但是有時候就拿不到。經過排查,這兩邊的線程發生了變化,導致取不到值。導致線程發生變化的原因是顯示的聲明了hystrix為true。

 

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

但是如果項目中真真的是用了hystrix呢?

引用一下文檔進行說明:

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM