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
支付寶掃一掃,為大叔打賞!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/542515.html
標籤:其他
上一篇:使用Python實作高效摸魚,批量識別銀行卡號碼并且自動寫入Excel表格
下一篇:時區介紹
