openfeign開啟熔斷之後MDC為null,這是有前提的,首先,你的熔斷開啟後,使用的是線程池的熔斷模式,即hystrix.command.default.execution.isolation.strategy=THREAD,或者不寫這行,如果值是SEMAPHORE模式,是可以獲取到MDC對象 ...
openfeign開啟熔斷之後MDC為null,這是有前提的,首先,你的熔斷開啟後,使用的是線程池的熔斷模式,即hystrix.command.default.execution.isolation.strategy=THREAD,或者不寫這行,如果值是SEMAPHORE
模式,是可以獲取到MDC對象的,因為這種信號量模式,並沒有產生新的線程,所以對於ThreadLocal類型的MDC對象,是可以獲取到的。
openFeign的熔斷配置
ribbon:
#ribbon請求連接的超時時間- 限制3秒內必須請求到服務,並不限制服務處理的返回時間
connectTimeout: 1000
#請求處理的超時時間 下級服務響應最大時間,超出時間消費方(路由也是消費方)返回timeout,超時時間不可大於斷路器的超時時間
readTimeout: 2000
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
strategy: THREAD #信號量模式,無超時時間;THREAD線程池模塊,這是預設的
thread:
timeoutInMilliseconds: 3000 #對THREAD模式才有效
feign:
hystrix:
# Feign啟用斷路器,預設為FALSE,如果開啟熔斷,如果是線程池模式,會在新線池中發起請求,這時MDC無論獲取到,如果是SEMAPHORE模式,是可以獲取到MDC的
enabled: true
在openFeign的攔截器中,獲取MDC中的traceId
註意,咱們的這個攔截器獲取traceId功能,只是在SEMAPHORE模式才有效【註意,這種模式的熔斷是沒有超時時間的,所以性能不太好,高併發時,請求慢的慢,容易堆積,造成伺服器的雪崩】
@Configuration
public class FeignTraceIdInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
String traceId = MDC.get(TRACE_ID);
if (traceId != null) {
template.header(HTTP_HEADER_TRACE, traceId);
}
}
}
在後面的調研中,我們還會針對THREAD模塊進行探究,找到獲取MDC中traceId的方法,請期待。
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!