【小筆記】SpringCloud Feign子線程調用丟失Request問題


場景:

前端請求后端接口,由於后端接口涉及一系列復雜操作,為了快速響應,直接返回,使用子線程完成后續邏輯處理。該邏輯中涉及多個子系統之間的調用,原本的調用方式為使用RestTemplate,走服務名調用,並沒有問題。后來接口改造為了調用方便,引入feign,於是導致獲取不到irequest上下文等問題。

問題復現:

請求一個接口,使用feign調用時,request丟失:
在這里插入圖片描述
其次,子線程調用時也會丟失request。

問題原因:

feign使用的hystrix的默認隔離策略為線程級,而request上下文從ThreadLocal取得,所以拿不到。

解決方案:

  • 同一個線程調用時,將隔離策略改為SEMAPHORE;

      hystrix:
        command:
          default:
            execution:
              isolation:
                strategy: SEMAPHORE
    
  • 子線程調用時,除了將隔離策略改為SEMAPHORE外,還需要將父線程的上下文傳遞給子線程:

ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

RequestContextHolder.setRequestAttributes(sra, true);
  • 不使用feign,直接使用RestTemplate,通過服務名+接口路徑進行直接調用


免責聲明!

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



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