場景:
前端請求后端接口,由於后端接口涉及一系列復雜操作,為了快速響應,直接返回,使用子線程完成后續邏輯處理。該邏輯中涉及多個子系統之間的調用,原本的調用方式為使用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,通過服務名+接口路徑進行直接調用