場景:
用戶登陸后,再次訪問網頁,將用戶信息loginToken放在request的header中,首先經過網關,然后到達A服務,然后A服務調用B服務時如何把loginToken傳遞給B服務
1.修改hytrix配置,配置hytrix的 strategy為 SEMAPHORE。
Hystrix 提供兩種執行隔離策略( ExecutionIsolationStrategy ) :SEMAPHORE
、THREAD
SEMAPHORE
:信號量,命令在調用線程執行。THREAD
:線程池,命令在線程池執行。
如果不修改配置,默認配置的為THREAD,因為不在同一個線程中,無法獲得請求的上下文對象,無法執行第二步操作
feign:
httpclient:
enabled: false
okhttp:
enabled: true
hystrix:
enabled: true
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
strategy: SEMAPHORE
thread:
timeoutInMilliseconds: 60000
2.增加攔截器
feign提供的 RequestInterceptor 接口會默認攔截feign發出去所有請求,所以在這里攔截服務A發送給服務B的請求,然后再請求頭中添加loginToken
如果再第一步沒有修改 hystrix 的 strategy,則這一步中 RequestContextHolder.getRequestAttributes()的結果無法獲取到,結果為null
package com.yuanian.example.feignA.config; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; /** * @author liujy * @date 2019/10/24 10:57 **/ @Component public class FeignTokenInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { HttpServletRequest request = getServletRequest(); if (null == request){ return; } template.header("loginToken", getHeaders(request)); } private HttpServletRequest getServletRequest() { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); return ((ServletRequestAttributes) requestAttributes).getRequest(); } private String getHeaders(HttpServletRequest request){ return request.getHeader("loginToken"); } }
3.hytrix兩種策略的區別